题目皆摘自牛客网JAVA专项练习
1.可以把任何一种数据类型的变量赋给Object类型的变量。
八大基础数据类型会自动装箱后赋值给Object,所以编译运行都不会报错。 Java中一切都是对象,Object是所有类的根类!
2.以下哪个接口的定义是正确的? (D)
A,接口中方法的默认修饰符时public abstract,抽象方法可是没有方法体的,没有大括号{}
B,JDK8中,接口中的方法可以被default和static修饰,但是!!!被修饰的方法必须有方法体。
C,注意一下,接口是可以多继承的。但是和A选项一样,抽象方法不能有方法体。 (补充:任何类都不能多继承)
3.下面关于JAVA的垃圾回收机制,正确的是 (B)
java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。当对象的引用变量被赋值为null,可能被当成垃圾。
A.系统并不会立即回收,具体的回收时间是无法确定的。
C.选C多半是认为置为null,但是置为null不一定就不会使用了。 初始化的时候还可以设置为null呢,置为null只是被认为可以当垃圾回收了。不一定会马上回收。
D.System.gc()只是通知系统,希望进行回收。但不能确定什么时候回收,甚至不知道会不会进行回收。所以选项中说 可以显式的立即释放 是错误的。
4.事务隔离级别是由谁实现的? (数据库系统)
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
5.在java7中,浮点型不能做switch()的参数类型。
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。
显然,long、float、double类型不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
注意:String类型是Java7开始支持的。
6.String与StringBuffer的区别:
1.可变与不可变
String类中使用字符数组保存字符串,因为有“final”修饰符,所以可以知道string对象是不可变的。(常量)
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,StringBuilder与StringBuffer两种对象都是可变的。(变量)
2.是否多线程安全
String中的对象是不可变的,也就可以理解为常量, 显然String线程安全 。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以StringBuffer线程安全 。
(补充:StringBuilder 是 非线程安全 的)
效率比较String < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“test”时,String效率最高。
7.哪种方式实现的单例是线程安全的 (枚举、静态内部类、双检锁模式、饿汉式)
答案过长,请移步牛客广场看解析:https://www.nowcoder.com/profile/686198567/test/43967463/304933#summary
8.哪些类是线程安全的(Vector、StringBuffer、Properties) 不安全:(HashMap、ArrayList)
Vector相当于一个线程安全的List
HashMap是非线程安全的,其对应的线程安全类是HashTable
Arraylist是非线程安全的,其对应的线程安全类是Vector
StringBuffer是线程安全的,相当于一个线程安全的StringBuilder
Properties实现了Map接口,是线程安全的
9.哪些方法是针对循环优化进行的(强度削弱、删除归纳变量、代码外提) 删除多余运算不是专门针对循环优化的。
①、强度削弱的本质是把强度大的运算换算成强度小的运算,例如将乘法换成加法运算。
②、归纳变量删除
j = j - 1 t4 = 4 * j t5 = a[t4] if t5 > value goto B3
j和t4的值步伐一致地变化,这样的变量叫作归纳变量,在循环中有多个归纳变量时,也许只需要留下一个。
这个操作由归纳变量删除过程来完成,对本例可以先做强度削弱,它给删除归纳变量创造机会。
③、代码外提是循环优化的一种
while(i <= limit - 2) ... // 代码外提后变成 t = limit - 2; while(i <= t) ...
附加面试题:
问:
构造器(constructor)是否可被重写(override)?
答:
构造器不能重写,构造器是属于类本身的。
父类有自己的构造器,子类也一样,构造器的定义方式是 构造器名字 和 类名 一样,而父子类的类名不可能相同,而继承又要求方法名字是一样的。
所以这是矛盾的,构造器不能重写,构造器是可以重载的。
补充:重写和重载的区别 ?
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。
重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。