Java&SQL(试题,阶段测试)——面试必看系

Java&SQL 阶段考试

Java 部分

一、选择题

1.以下关于 abstract 关键字的说法,正确的是(D)。
A.abstract 可以与 final 并列修饰同一个类。
B.abstract 类中不可以有 private 的成员。
C.abstract 类中必须全部是 abstract 方法。
D.abstract 方法必须在 abstract 类或接口中。

2.以下方法,(B)不是对 add 方法的重载。
public class Test{
public void add(int x,int y,int z){
//todo
}
}
A.public int add(int x,int y,float z){return 0;}
B.public int add(int x,int y,int z){return 0;}
C.public void add(int x,int y){ }
D.以上都不是

3.关于 Java 堆,下面说法错误的是(D)。
A.所有类的实例都是在堆上分配内存。
B.对象所占的堆内存是由自动内存管理系统回收。
C.堆内存由存活和死亡的对象,空闲碎片区组成。
D.数组是分配在栈中的。

4.观察以下代码,输出结果是(C)。
public class MyClass{
int i = -1;
private void action(){
int i = 0;
i++; }
public static void main(String[] args){
MyClass mc = new MyClass();
mc.action();
System.out.println(mc.i); } }
A. 1
B. 0
C. -1
D.抛出异常

5.观察下面的代码,正确的结果是(A)。
class Letter{
char c = ‘x’; }
public class PassObject{
static void f(Letter y){
y.c = ‘z’; }
public static void main(String[] args){
Letter x = new Letter();
x.c = ‘a’;
f(x);
System.out.println(x.c); } }
A. z
B. a
C. x
D. null

6.观察如下代码,正确显示结果为(C)。
class A{
void callme(){
System.out.println(“Inside A’s callme()method”); } }
class B extends A{
void callme(){
System.out.println(“Inside B’s callme() method”); } }
class C extends B{
void callme(){
System.out.println(“Inside C’s callme() method”); } }
public class Dispatch{
public static void main(String args[]){
A a = new C();
a.callme(); } }
A.Inside A’s callme()method
B.Inside B’s callme()method
C.Inside C’s callme()method
D.抛出异常

7.观察如下代码,正确的显示结果是(A)
。 public class MyClass{
public static void main(String[] args){
String s1 = “hello”;
String s2 = “hello”;
String s3 = new String(“hello”);
String s4 = new String(“hello”);
System.out.println((s1 == s2) + “/” + (s3 == s4)); } }
A.true/false
B.true/true
C.false/true
D.false/false

8.观察如下代码,正确的显示结果是(B)。
class MyException extends Exception{
public MyException(String msg){
super(msg); } }
public class MyClass {
public static void main(String[] args){
try{
if(true) throw new MyException(“bad”);
System.out.println(" OK");
}catch(MyException e){
System.out.print(e.getMessage());
}System.out.print(" bye"); } }
A. bad
B. bad bye
C. OK bad
D. OK bad bye

9.下列说法中,不正确的是(B)。
A.一个 Java 源程序经过编译后,得到的文件的扩展名一定是.class。
B.一个 Java 源程序经过编译后,得到的结果文件数也只有一个。
C.一个 Java 源程序只能有一个 public class 类定义,且源文件的名字与 public class 的类 名相同,扩展名必须是.java。
D.一个 Java 源程序可以包含多个 class 类。

10.欲构造 ArrayList 类的一个实例,此类实现继承了 List 接口,下列方法正确的是(B)。
A.ArrayList myList = new Object();
B.List mylist = new ArrayList();
C.ArrayList myList = new List();
D.List myList = new List();

11.下列说法正确的是(AC)(多选)。
A.LinkedList 实现了继承自 List。
B.AbstractSet 继承自 Set。
C.HashSet 继承自 AbstractSet。
D.WeakMap 继承集成自 HashMap。

12.Thread 类用来创建和控制线程,一个线程从下面(B)方法开始执行。
A.init()
B.start()
C.run()
D.notifyAll()

13.下面关于 Java 语言实例方法和类方法的说法,正确的是(BC)(多选)。
A.实例方法可以直接通过类名调用。
B.类方法可以直接通过类名调用。
C.实例方法可以操作实例变量也可以操作类变量。
D.类方法可以操作实例变量也可以操作类变量。

14.在 Java 语言当中,(C)关键字用来实现同步。
A. native
B. static
C. synchronized
D. abstract

15.以下关于 Java 的 List Set 和 Map 集合的描述,错误的是(BC)(多选)。
A) List 集合的元素是有序的,元素可以重复
B) HashSet 集合的元素是无序的,可以重复的;TreeSet 是有序的,基于 TreeMap 实现 的
C) HashMap 的 Key 必须唯一,Value 同样不可以重复
D) LinkedList 线程不安全,它是链表结构
E) List 集合具有以下几种常用的方法:add(E e) clear() hashCode() iterator() toArray()

16.正则表达式“\d+.?\d*”,在匹配下列字符串时结果失败的是(C)。
A.12.5
B.1.25
C.以上都成功
D.以上都失败

二、简答题

1.string、stringbuilder、stringbuffer 区别?stringbuilder、stringbuffer 哪个是线程不安全?

(1) 可变与不可变 
String 类中使用字符数组保存字符串,因为有“final”修饰符,所以可以知道 string 对象 是不可变的。 
private final char value[]; 
StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。 
char[] value; 
(2) 是否多线程安全 
String 中的对象是不可变的,也就可以理解为常量,显然线程安全。 
AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的 基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。 
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。源 码如下:
public synchronized StringBuffer reverse() { 
super.reverse(); 
return this; 
}
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。 
(3) 如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。

2.HashMap 和 Hashtable 有什么区别?

HashMap 和 Hashtable 都实现了 Map 接口,HashMap 几乎可以等价于 Hashtable。 
区别: 
(1) HashMap 非线程安全,HashTable 是线程安全的。Java 5 提供了 ConcurrentHashMap, 它是 HashTable 的替代,比 HashTable 的扩展性更好 
(2) HashMap 可以接受为 null 的键值(key)和值(value),而 Hashtable 则不行。 
(3) HashMap 的迭代器(Iterator)是 fail-fast 迭代器,而 Hashtable 的 enumerator 迭代器不是 fail-fast 的。 由于 Hashtable 是线程安全的,也就是 synchronized,所以在单线程环境下它比 HashMap 要 慢。如果不需要同步,只需要单一线程,那么使用 HashMap 性能要好过 Hashtable。

3.Array 和(ArrayList)有什么区别?什么时候应该使用 Array 而不是 ArrayList?

Array 长度不可调整,是固定长度的数组;而 Arraylist 底层是可随时插入时改变长度的数组。 
Array 中存储的值必须时统一类型的,而 Arraylist 不受类型限制,每个索引上的值类型可以 不一致。同理可得知:当需要存储固定长度、类型一致的一组信息时,可以采取 array

4.Java 中创建线程哪几种方式?需要实现什么方法?优缺点是什么?

(1) 继承 Thread 类创建线程类,并重写该类的 run 方法,该 run()方法的方法体就代表了线 程要完成的任务。调用线程对象的 start()方法来启动该线程 
(2) 实现 runnable 接口,并重写该接口的 run()方法,该 run()方法的方法体同样是该线程的 线程执行体。调用线程对象的 start()方法来启动该线程。 
(3) 实现 Callable 接口,并实现 call()方法,该 call()方法将作为线程执行体,并且有返回值。 创建一个 Callable 实现类的实例对象,再使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call()方法的返回值 
继承 Thread 类的优缺点 
优点: 编写简单, 如果需要访问当前线程, 直接使用 this 即可获得当前线程, 无需使用 Thread.currentThread()方法 
缺点: 线程类已经继承了 Thread 类, 不能继承其他类 
实现 runnable 或者 Callable 接口的优缺点 
优点: 线程类只是实现了接口, 还可以继承其他的类 
缺点: 访问当前线程时, 需要使用 Thread.currentThread(0)方法

三、编程题

1.给定一个长字符串 A 和一个短字符串 B,请问如何最快判断字符串 B 中的所有字符是否 都在字符串 A 中
public boolean stringContains(String A,String B){
//编码区
}

public boolean stringContains(String A,String B){ 
//编码区 
int i = A.indexOf(B); 
return i>0?true:false; 
}
判断每个数组是否存在 
public boolean stringContains(String A,String B){ 
//编码区 
//判断结果 
boolean b = true; 
//将带判断的小字符串转成字符数组,以遍历判断是否存在于大字符串中 
char []ch = B.toCharArray(); 
for(char c:ch){ 
if(A.indexOf(c)<0){ 
b=false; } }
//返回结果 
return b; }

2.在排序的数组中,给定一个值,找出值对应的索引
public int findIndex(int[] a,int value){
//编码区
}

public int findIndex(int[] a,int value){ 
//编码区 
int i; 
for(i=0;i<a.length;i++){ 
if(a[i]==value){ 
break; 
		} 
	}
return i; }

3.给定一个整数数组 nums 和一个目标值 target,请你在该集合中找出和为目标值的那两个整 数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案,但是不能重复利用这 个数组中同样的元素。
示例:
给定 nums = [2,7,11,15],target=9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回[0,1]
public Solution{
public int[] twoSum(int[] num, int target){
//编码区
}
}

示例: 
给定 nums = [2,7,11,15],target=9 
因为 nums[0] + nums[1] = 2 + 7 = 9 
所以返回[0,1] 
public int[] twoSum(int[] num, int target){ 
public int[] twoSum(int[] num, int target){ 
//编码区 
int [] res = new int[]{0,0}; 
for(int i=0;i<num.length-1;i++){
	 for(int j=i+1;j<num.length;j++){ 
	 if(num[i]+num[j]==target){ 
	 res[0] = i; res[1] = j; 
	 break; }
	  }if (res[1]!=0){ 
	  break; } }
	  return res; }

4.写出 List 的三种遍历方式

List list = new ArrayList(); 
list.add(1); 
list.add('a'); 
list.add("hello!"); 
list.add(10.5); 
1 .增强型 FOR 循环 
for(Object o : list){ System.out.println(o); } 
2foreach() 
list.forEach(n->{ System.out.println(n); }); 
3 .iterator 迭代器 
Iterator it = list.iterator(); 
while (it.hasNext()){ 
System.out.println(it.next()); }

5.编写代码使用 FileReader 和 FileWrite 实现文件复制功能。

public static void main(String[] args) { 
//待复制的文件 
File file = new File("d:/dy.txt"); 
//临时存储在字符串中 
StringBuffer sbuff=new StringBuffer(); 
//创建文件输入流对象 
FileReader fr = null; 
//创建缓冲流读取
BufferedReader bufrea=null; 
try { fr = new FileReader(file); 
bufrea = new BufferedReader(fr); 
String str=""; 
while ((str=bufrea.readLine())!= null){ 
sbuff.append(str); 
	} } catch (IOException e) { 
	e.printStackTrace(); 
	} finally { 
	try { 
	bufrea.close(); 
	fr.close(); } catch (IOException e) { 
	e.printStackTrace(); } }
	//重新写入文件 
	File newfile = new File("d:/dy 副本.txt"); 
	if(!newfile.exists()){ 
	try { newfile.createNewFile(); 
	} catch (IOException e) { 
	e.printStackTrace(); } }
	//创建写入流 
	FileWriter fw = null; 
	BufferedWriter buffwr= null; 
	//写入文件 
	try { fw = new FileWriter(newfile); 
	buffwr = new BufferedWriter(fw); 
	buffwr.write(sbuff.toString()); 
	} catch (IOException e) {
	 e.printStackTrace(); 
	 } finally { try { 
	 buffwr.close(); 
	 fw.close(); 
} catch (IOException e) { 
e.printStackTrace(); } } } 

SQL 部分

一、选择题

1.已知表 T1 中有 2 行数据,T2 中有 3 行数据,执行语句”select a.* from T1 a, T2 b”后,返回 的行数为(D)。
A.2 行
B.3 行
C.5 行
D.6 行

2.已知表 T1 和 T2 的字段定义完全相同,T1,T2 中各有 5 条不同的数据,其中 T1 有 2 条数 据存储,执行语句”select * from T1 union all select * from T2”返回的行数为(B)。
A、8 行
B、10 行
C、3 行
D、12 行

3.在数据库中,表是一个非常重要的数据对象,它是用来__ABCD____
A、显示
B、查询
C、存放
D、检索

4.选择要执行操作的数据库,应该执行的 SQL 命令是(A)。
A、USE
B、GO
C、EXEC
D、DB

二、简答题

  1. 谈谈你对事务的理解?
为了业务需求,提高数据的安全性和执行一致性,将一组 SQL 命令加入事务,当事务 中任意一条语句报错时,执行 rollback 已达到已运行在内存中的命令行回滚至原始状态;
  1. union 和 union all 的区别?
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; 
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
  1. Where 和 having 的区别?
where 是针对全文检索,having 是针对 GROUP BY 的小组过滤,where 执行效率更高
  1. in 和 exists 的区别?
(1) 运用情况不同 
sqlin 适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,sql 中 exist 适用于外层的主查询记录较少,子查询中的表大,又有索引的时候。 
(2) 驱动顺序不同 
IN 是先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。 exists 是以外层表为驱动表,先被访问。 
(3)NULL 值处理不同 
IN 不对 NULL 进行处理,exists 会对 NULL 值进行处理。 
(4) 底层原理不同 
in 是把外表和内表作 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对 内表进行查询。
  1. char 和 varchar 的区别?
CHAR 的长度是固定的,而 VARCHAR2 的长度是可以变化的

三、编码题

1.编写 SQL 语句
1)创建一张学生表,包含以下信息,学好,姓名,年龄,性别,家庭住址,联系 电话。

CREATE TABLE student( 
stuid INT PRIMARY KEY NOT NULL, 
stuname VARCHAR(20) NOT NULL, 
age INT NOT NULL, 
sex VARCHAR(2) NOT NULL,
address VARCHAR(255) , 
tel VARCHAR(11));

2)修改学生表的结构,添加一列信息,学历。

ALTER TABLE student ADD COLUMN degree VARCHAR(20);

3)修改学生表的结构,删除一列信息,家庭住址。

ALTER TABLE student DROP COLUMN address;

4)修改学生表的数据,将电话号码以 11 开发的学员的学历修改为“硕士”。

UPDATE student SET defree='硕士' WHERE tel LIKE '11%';

2.已知表 a 和表 b 如下。

表a:

id name
1 zhao
2 li
3 wang

表b:

id age
1 30
2 28
4 21

请完成如下功能
select a.id,a.name,b.age from ( ) on a.id = b.id。
分别写出括号中填写 a join b,a left join b,a right join b 时,SQL 语句的执行结果(用表格 列举)。
在这里插入图片描述
3.表 a 如下,编写一条 SQL 语句,查询出每门课都大于 80 分的学生姓名及成绩
学生表:

name course score
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
select a.name,course,score 
From a lefe join (select distinct name from a where score<80) as b on a.name = b.name 
Where b.name is null

4.学生表如下,编写 SQL 完成:删除除了自动编号不同,其他都相同的学生冗余信息。
学生表:

自动编号 学好 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
CREATE TABLE student2(
id INT AUTO_INCREMENT PRIMARY KEY,
CODE VARCHAR(20),
NAME VARCHAR(20));

INSERT INTO student2 VALUES
(NULL,'2005001','张 三'),
(NULL,'2005002','李四'),
(NULL,'2005001','张三'); 

DELETE FROM student2 
WHERE id NOT IN (SELECT MIN(id) 
FROM (SELECT * FROM student2) AS t 
GROUP BY t.name);

5.怎么样把下面的表 A 数据查询成表 B 的数据
表A:

year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4

表B:

year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1991 2.1 2.2 2.3 2.4
SELECT year,SUM(CASE WHEN month ='1' THEN amount ELSE 0 END) m1, 
SUM(CASE WHEN month='2' THEN amount ELSE 0 END) m2, 
SUM(CASE WHEN month ='3' THEN amount ELSE 0 END) m3, 
SUM(CASE WHEN month ='4' THEN amount ELSE 0 END) m4 
FROM a
GROUP BY year

猜你喜欢

转载自blog.csdn.net/weixin_47391932/article/details/107070040