Java基础周测-07-综合
一、单选题
异常处理
- 在异常处理中,以下描述不正确的有
A、 try块不可以省略
B、 可以使用多重catch块
C、 finally块可以省略
D、 catch块和finally块可以同时省略
参考答案:D
题目解析:
try语句后面是可以省略catch语句的,但是必须有finally语句。
也可以省略finally语句,但是必须要有catch语句。
也就是说try语句后面必须要有一个别的语句跟在后面。
try-catch try-finally try-catch-finally
切记:catch和finally语句不能同时省略!!!
事务隔离级别
- 事务隔离级别是由谁实现的?
A、 Java应用程序
B、 Hibernate
C、 数据库系统
D、 JDBC驱动程序
参考答案:C
编码
- 语句:char foo='中',是否正确?(假设源文件以GB2312编码存储,并且以javac – encoding GB2312命令编译)
A、 正确
B、 错误
参考答案:A
知识点:
在java中,byte和C++中的char类型是一样的,8位,1个字节,-128-127。但是,char类型,是16位,2个字节, '\u0000'-'\uFFFF'。
Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;采用GB2312或GBK编码方式时,一个中文字符占2个字节;而采用UTF-8编码方式时,一个中文字符会占3个字节
垃圾回收机制
- 以下哪项陈述是正确的?
A、 垃圾回收线程的优先级很高,以保证不再使用的内存将被及时回收
B、 垃圾收集允许程序开发者明确指定释放哪一个对象
C、 垃圾回收机制保证了JAVA程序不会出现内存溢出
D、 进入”Dead”状态的线程将被垃圾回收器回收
E、 以上都不对
参考答案:E
题目解析:
A:垃圾回收在jvm中优先级相当相当低。
B:垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。
C:垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。
D:进入DEAD的线程,它还可以恢复,GC不会回收知识点:
当程序运行时,至少会有两个线程开启启动,一个是我们的主线程,一个是垃圾回收线程,垃圾回收线程的priority(优先级)较低。
垃圾回收器会对我们使用的对象进行监视,当一个对象长时间不使用时,垃圾回收器会在空闲的时候(不定时)对对象进行回收,释放内存空间,程序员是不可以显示的调用垃圾回收器回收内存的。
但是可以使用System.gc()方法建议垃圾回收器进行回收,但是垃圾回收器不一定会执行。
Java的垃圾回收机制可以有效的防止内存溢出问题,但是它并不能完全保证不会出现内存溢出。
例如当程序出现严重的问题时,也可能出现内存溢出问题
访问修饰符
- 下列哪个对访问修饰符作用范围由大到小排列是正确的?()
A、 public>protected>default>private
B、 public>default>protected>private
C、 private>protected>default>public
D、 private>default>protected>public
参考答案:A
- 下列符号中可以在 java 程序里表示单行注释的是( )
A、 --
B、 /* ……*/
C、 //
D、 /** ……*/
参考答案:C
- Java 语言中创建一个对象使用的关键字是()
A、 class
B、 interface
C、 new
D、 create
参考答案:C
- 下面关于 new 关键字的表述错误的是()
A、 new关键字在生成一个对象时会为对象开辟内存空间
B、 new关键字在生成一个对象时会调用类的构造方法
C、 new关键字在生成一个对象时会将生成的对象的地址返回
D、 Java中只能通过new关键字来生成一个对象
参考答案:D
list,set
- 有这样一段程序
public class Test{
public static void main(String [] args){
List list=new ArrayList();
list.add("a"); list.add("b"); list.add("a");
Set set=new HashSet();
set.add("a"); set.add("b"); set.add("a");
System.out.println(list.size()+","+set.size());
}
}
请问运行主要的程序会打印出的是什么()
A、 2,2
B、 2,3
C、 3,2
D、 3,3
参考答案:C
默认值
- 当你编译和运行下面的代码时,会出现下面选项中的哪种情况?( )
public class Pvf{
static boolean Paddy;
public static void main(String args[]){
System.out.println(Paddy);
}
}
A、 编译时错误
B、 编译通过并输出结果false
C、 编译通过并输出结果true
D、 编译通过并输出结果null
参考答案:B
题目解析:
Paddy是成员变量,其默认是是0 -> false
异常处理
- 给定以下JAVA代码,这段代码运行后输出的结果是()
public class Test1 {
public static int aMethod(int i) throws Exception {
try {
return i / 10;//①
} catch (Exception ex) {
throw new Exception("exception in a aMethod");//②
} finally {
System.out.printf("finally");//③
}
}
public static void main(String[] args) {
try {
aMethod(0);//④
} catch (Exception ex) {
System.out.printf("exception in main");//⑤
}//⑦
System.out.printf("finished");//⑥
}//⑧
}
A、 exception in main finished
B、 finallyfinished
C、 exception in main finally
D、 finally exception in main finally
参考答案:B
题目解析:代码执行顺序 -> ④ ->① ->③ ->① ->④ ->⑦ ->⑥->⑧
i / 10;无论i是多少,永远不会抛出异常,所以catch语句不会执行。
而finally语句是必定执行的语句。
所以先指向aMathod()的finally代码块,输出finally,
然后执行main()方法的最后一条输出语句,输出finished。
方法的调用
- 假设 A 类有如下定义,设 a 是 A 类同一个包下的一个实例,下列语句调用哪个是错误的?()
public class A {
int i;
static String s;
void method1() {
}
static void method2() {
}
}
A、 System.out.println(a.i);
B、 a.method1();
C、 A.method1();
D、 A.method2()
参考答案:C
知识点:
静态成员和静态方法, 可以直接通过类名进行调用;
其他的成员和方法则需要进行实例化成对象之后, 通过对象来调用。
默认值
- 关于如下程序的描述哪个是正确的?( )
public class Person {
static int arr[] = new int[5];
public static void main(String a[]) {
System.out.println(arr[0]);
}
}
A、 编译将产生错误
B、 编译时正确,但运行时将产生错误
C、 正确,输出0
D、 正确,输出 null
参考答案:C
题目解析:
char[] ch = new char[3]; //默认空字符
int [] Int = new int[2]; //默认0
String[] strings = new String[2]; //默认null
异常处理
- 执行下列代码的输出结果是( )
public class Demo {
public static void main(String args[]) {
int num = 10;
System.out.println(test(num));
}
public static int test(int b) {
try {
b += 10;
return b;
} catch (RuntimeException e) {
} catch (Exception e2) {
} finally {
b += 10;
return b;
}
}
}
A、 10
B、 20
C、 30
D、 40
参考答案:C
volatile,synchronized
- 下列说法正确的是( )
A、 volatile,synchronized 都可以修改变量,方法以及代码块
B、 volatile,synchronized 在多线程中都会存在阻塞问题
C、 volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
D、 volatile解决的是变量在多个线程之间的可见性、原子性,而sychroized解决的是多个线程之间访问资源的同步性
参考答案:C
知识点:
1、一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
(1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
(2)禁止进行指令重排序。
2、volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
3、volatile仅能使用在变量级别; synchronized则可以使用在变量、方法、和类级别的。
4、volatile仅能实现变量的修改可见性,并不能保证原子性; synchronized则可以保证变量的修改可见性和原子性。
5、volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
6、volatile标记的变量不会被编译器优化; synchronized标记的变量可以被编译器优化。
start,run
- 下面程序的运行结果是:( )
public class Thread1 {
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static void pong() {
System.out.print("pong");
}
}
A、 pingpong
B、 pongping
C、 pingpong和pongping都有可能
D、 都不输出
E、 pong
F、 ping
参考答案:B
访问修饰符
- 根据以下代码段,下列说法中正确的是( )。
public class Parent {
private void m1() {
}
void m2() {
}
protected void m3() {
}
public static void m4() {
}
}
A、 子类中一定能够继承和覆盖Parent类的m1方法
B、 子类中一定能够继承和覆盖Parent类的m2方法
C、 子类中一定能够继承和覆盖Parent类的m3方法
D、 子类中一定能够继承和覆盖Parent类的m4方法
参考答案:C
题目解析:通过继承,子类可以拥有所有父类对其可见的方法和域
A.私有方法只能在本类中可见,故不能继承,A错误
B.缺省访问修饰符只在本包中可见,在外包中不可见,B错误
C.保护修饰符凡是继承自该类的子类都能访问,可以被继承覆盖,C正确
D.static修饰的成员属于类成员,父类字段或方法只能被子类同名字段或方法遮蔽,不能被继承覆盖,D错误
ResultSet
- ResultSet中记录行的第一列索引为?
A、 -1
B、 0
C、 1
D、 以上都不是
参考答案:C
三元操作符
- 以下JAVA程序的运行结果是什么( )
public class Object1 {
public static void main(String[] args) {
Object o1 = true ? new Integer(1) : new Double(2.0);
Object o2;
if (true) {
o2 = new Integer(1);
} else {
o2 = new Double(2.0);
}
System.out.print(o1);
System.out.print(" ");
System.out.print(o2);
}
}
A、 1 1
B、 1.0 1.0
C、 1 1.0
D、 1.0 1
参考答案:D
知识点:
三元操作符类型的转换规则:
三元运算符会对两个结果的数据类型,进行自动的类型提升。
1.若两个操作数不可转换,则不做转换,返回值为Object类型。
2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。
3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。
4.若两个操作数都是直接量数字,则返回值类型为范围较大者题目解析:
符合4,所以选D。
SQL的执行顺序
- 当WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句同时出现在一个SQL查询语块中时,最后执行的()
A、 WHERE子句
B、 GROUP BY子句
C、 HAVING子句
D、 ORDER BY子句
参考答案:D
题目解析:SQL的执行顺序是 -> FROM--WHERE--JOIN--GROUP BY--HAVING--UNION--SELECT--ORDER BY--LIMIT
SQL语句
- 检索销量表中销量最好的商品id和销量(假设每件商品只有一个订单),下列SQL语句正确的是()
A、 SELECT 商品id,销量 FROM 销量表 WHERE 销量=MAX(销量)
B、 SELECT 商品id,MAX(销量) FROM 销量表 GROUP BY 销量
C、 SELECT 商品id,MAX(销量) FROM 销量表 GROUP BY 商品id
D、 SELECT 商品id,销量 FROM 销量表WHERE 销量=(SELECT MAX(销量) FROM 销量表)
参考答案:D
case when
- Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1003' ,'男生姓名' , '2000-05-20' , '男');
('1004' , '张三' , '2000-08-06' , '男');
('1005' , '李四' , '2001-12-01' , '女');
('1006' , '女生姓名' , '2001-12-02' , '女');
删除符合条件的记录:是男生时删除name='男生姓名'的记录,是女生时删除name='女生姓名'的记录,如下SQL正确的是()?
A、 delete from table student_table where name = ( case when sex = '男' then '男生姓名' when sex = '女' then '女生姓名' end) ;
B、 delete from student_table where name = ( case when sex = '男' then '男生姓名' when sex = '女' then '女生姓名' end) ;
C、 delete from student_table where name = ( case when sex = '男' then '男生姓名' when sex = '女' then '女生姓名') ;
D、 delete from student_table where name = ( case sex = '男' then '男生姓名' case sex = '女' then '女生姓名' end) ;
参考答案:B
case when[value1] then [result]...else [default] end 如果value1是真,返回result,否则返回default
子查询与表的连接
- Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1001' , '' , '2000-01-01' , '男');
('1002' , null , '2000-12-21' , '男');
('1003' , NULL , '2000-05-20' , '男');
('1004' , '张三' , '2000-08-06' , '男');
('1005' , NULL , '2001-12-01' , '女');
('1006' , '张三' , '2001-12-02' , '女');
执行
select t1.name from
(select * from student_table where sex = '女')t1 inner join
(select * from student_table where sex = '男')t2 on t1.name = t2.name;
的结果行数是()?
A、 4
B、 3
C、 2
D、 1
参考答案:D
题目解析:
将男生的数据查询出,设为一张表t1
将女生的数据查询出,设为一张表t2
再将t1和t2进行内连接,连接条件为姓名相同。(仅保留名称相同的数据)
连接后的数据即是相同的名称,最后对姓名去重。
空字符串结果为0,空值NUll不显示。
知识点:子查询与表的连接
在本题中,查询出的数据作为临时表,放在FROM子句后。并将临时表进行连接。
内连接 VS 外连接
- 有一张person表,主键是id,数据如下:
同时还有一张任务表task,主键也是id:
请找出每个人的任务情况(注意:没有任务也要输出),结果按id降序排列,输出如下:
下面正确的SQL查询语句是:( )
A、 SELECT p.id, p.name, t.content FROM person AS p LEFT JOIN task AS t ON p.id = t.person_id ORDER BY p.id DESC;
B、 SELECT p.id, p.name, t.content FROM person AS p JOIN task AS t ON p.id = t.person_id ORDER BY p.id DESC;
C、 SELECT p.id, p.name, t.content FROM person AS p RIGHT JOIN task AS t ON p.id = t.person_id ORDER BY p.id DESC;
D、 SELECT p.id, p.name, t.content FROM person AS p INNER JOIN task AS t ON p.id = t.person_id ORDER BY p.id DESC;
参考答案:A
题目解析:
内连接 VS 外连接 在表中有相同列时,在列名之前加上表名前缀。
内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
-- 隐式内连接:使用where条件消除无用数据
SELECT 字段名 FROM 表名1,表名2 WHERE 连接条件;
-- 显示内连接
SELECT 字段名 FROM 表名1 [INNER] JOIN 表名2 ON 连接条件;
外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左(右)表中不满足条件的行,这种方式称为左(右)外连接,没有匹配的行时,结果表中相应的列为空(NULL)
-- 左外连接:连接条件中左边的表称为主表,右边的表称为从表
SELECT 字段名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 连接条件;
-- 右外连接:连接条件中右边的表称为主表,左边的表称为从表
SELECT 字段名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 连接条件;
如果给表起了别名后,一旦在SELECT或WHERE中使用别名的话,则必须使用表的别名,而不能使用表的原名
父类,子类代码执行顺序
- 以下程序执行的结果是:( )
class X {
Y y = new Y();
public X() {
System.out.print("X");
}
}
class Y {
public Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y = new Y();
public Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
A、 ZYXX
B、 ZYXY
C、 YXYZ
D、 XYZX
参考答案:C
题目解析:
父类静态块/静态变量(按代码的先后顺序执行)→
子类静态块/静态变量(按代码的先后顺序执行)→
父类非静态代码块/非静态变量(按代码的先后顺序执行)→
父类构造方法→
子类非静态代码块/非静态变量(按代码的先后顺序执行)→
子类构造方法
二、多选题
Object类的方法
- java中下面哪些是Object类的方法()
A、 notify()
B、 notifyAll()
C、 sleep()
D、 wait()
参考答案:A,B,D
Class类,Object类, String类
- 关于Java以下描述正确的有( )
A、 Class类是Object类的超类
B、 Object类是一个final类
C、 String类是一个final类
D、 Class类可以装载其它类
参考答案:C,D
调用构造方法
- 下面的对象创建方法中哪些会调用构造方法 ()?
A、 new语句创建对象
B、 调用Java.io.ObjectInputStream的readObject方法
C、 java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
D、 调用对象的clone()方法
参考答案:A,C
题目解析:
构造函数的作用是完成对象的初始化。
当程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。
分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化。
而选项B、D中,对象的初始化并不是通过构造函数完成的,而是读取别的内存区域中的对象的各个域来完成。
StackOverflowError ,OutOfMemoryError
- 关于以下方法调用描述正确的是:()
private static final List<String> list = new ArrayList<>();
public static String test(String j) {
int i = 1, s = 1, f = 1, a = 1, b = 1, c = 1, d = 1, e = 1;
list.add(new String("11111111111111111111111111111"));
return test(s + i + f + a + b + c + d + e + "");
}
A、 一定会发生” OutOfMemoryError: Java heap space”
B、 一定会发生” StackOverflowError”
C、 一定会发生” OutOfMemoryError: Java heap space与StackOverflowError”
D、 当发生内存溢出错误时不需要用try…catch来捕获,需检查代码及jvm参数配置的合理性
参考答案:B,D
题目解析:
(1)StackOverflowError 原因在于 : 无限调用递归函数, 函数是以栈帧的形式存在于虚拟机栈内存中, 一直创建栈帧, 导致栈溢出。
(2)OutOfMemoryError :Java堆用于存储对象实例, 只要不断地创建对象, 并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制来清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常. (摘抄自深入理解java虚拟机), 所以一直new String() 并不会造成堆内存溢出。
(3)java异常可以分为checkedException和uncheckedException, 检查异常(不包括runtimeException及其子类的exception的子类)必须使用try catch或者throws处理, 而error属于非检查异常,非检查异常可以使用try catch捕获,但是没必要.
Lanbda表达式
- 下面哪些写法能在 java8 中编译执行()
A、 dir.listFiles((File f)->f.getName().endsWith(“.Java”));
B、 dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
C、 dir.listFiles((_.getName().endsWith(“.Java”)));
D、 dir.listFiles( f->f.getName().endsWith(“.Java”));
参考答案:A,D
知识点:
Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:
(1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
(2) 箭头(→)。必须通过英文中画线和大于符号组成。
(3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。
SQL语句
- 在MySql中进行数据查询时,如果要对查询结果的列名重新命名,将sno列重新命名为学号,则下列语句正确的是( )
A、 select sno as 学号 from T
B、 select 学号= sno from T
C、 select sno 学号 from T
D、 select sno=学号 from T
参考答案:A,C
Java创建对象
- Java创建对象的说法正确的有()
A、 用new语句创建对象,是最常见的创建对象的方法。
B、 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
C、 调用对象的clone()方法。
D、 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
参考答案:A,B,C,D
面向对象的理解
- 下面关于面向对象的一些理解哪些是错误的( )
A、 面向对象的最重要的特性是支持继承、封装和多态
B、 系统设计应该遵循开闭原则,系统应该稳定不可修改,但应支持通过继承、组合等方式进行扩展
C、 函数式的语言必然是面向对象的语言
D、 面向对象设计时,每个类的职责应该单一,不要再一个类中引入过多的接口
E、 过程式语言和面向对象的语言各有其优势,过程式语言更加灵活,面向对象语言更加强调抽象和封装
F、 Java和C++都是静态类型的面向对象编程语言
参考答案:C
题目解析:C语言不是面向对象,但是函数式。
知识点:在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。
JavaScript面向对象语言,天生就是多态。【var什么类型运行出来才会知道】
局部内部类
- 局部内部类可以用哪些修饰符修饰?( )
A、 public
B、 private
C、 abstract
D、 final
参考答案:C,D
Statement,PreparedStatement
- 下列代码哪些是正确的( )
A、 Statement sta=con.createStatement();
ResultSet rst=sta.executeQuery("select * from book");
B、 Statement sta=con.createStatement("select * from book");
ResultSet rst=sta.executeQuery();
C、 PreparedStatement pst=con.prepareStatement();
ResultSet rst=pst.executeQuery("select * from book");
D、 PreparedStatement pst=con.prepareStatement("select * from book");
ResultSet rst=pst.executeQuery();
参考答案:A,D
三、填空题
- Java语言规定标识符由 ______、______、______和数字组成,并且第一个字符不能是______ 。
参考答案: 1、 字母2、 美元符号3、 下划线4、 数字
- Java中包含 ___________________________ 等8种基本数据类型。
参考答案: byte,short,int,long,float,double,boolean,char
- 自定义线程的实现可以通过 和 方式实现。
参考答案: 1、 继承thread 2、 实现runnable接口
- 集合中,LinkedList采用了双向链表数据结构作为实现,而HashMap通过_________、_________ 、_________ 作为底层数据结构实现。
参考答案: 1、 数组2、 链表3、 红黑树
- 在Java中,可以通过Fle类中的_____方法判断文件是否存在,通过____方法建立多级文件夹。
参考答案: 1、 exists()2、 mkdirs()
- 数据库中,事务的四大特性包括 。
参考答案: 1、 原子性、一致性、隔离性、持久性
- MySQL中,事务的隔离别级别包括_______________________________,MySQL默认采用的是 ___________。
参考答案: 1、 读未提交,读已提交,可重复读,可串行化读2、 可重复读
四、简答题
- 请简述JAVA中List、Set、Map集合的特点及其实现类。详细说明各实现类的特点及区别。
参考答案: 正确阐述各接口的特点 2分
能够正确阐述各实现类,ArrayList、LinkedList、HashSet、TreeSet、HashMap各接口特点 0~3分
- 详细说明String、StringBuffer、StringBuilder的区别
参考答案: 能够分别概述三种类的作用和特点 1分
能够说明String是final修饰,无法被继承 2分
能够强调线程安全性及性能方面问题 2分
- 阐述你所理解的JVM垃圾回收机制
参考答案: 能够大体说明JVM内存模型 1分
能够说明垃圾回收的作用 1分
能够阐述垃圾回收中的算法实现思想 2分
能够表述jvm使用垃圾回收方式方法 1分
- 请详细阐述final及static关键字的特点
参考答案: 能够说明final作用 1分
能够说明final的使用场景及特点 1分
能够说明static作用 1分
能够说明static的使用场景及特点2分
- 请编写伪代码说明JDBC执行的完整流程,同时阐述PreparedStatement与Statement之间的区别。
参考答案: 正确编写整体流程 1分
能够正确使用异常处理 1分
能够释放资源 1分
能够完整正确阐述PreparedStatement与Statement之间的区别 2分