天天看点

【2021.4.26】Java知识点日常总结

题目皆摘自牛客网JAVA专项练习

1.可以把任何一种数据类型的变量赋给Object类型的变量。

八大基础数据类型会自动装箱后赋值给Object,所以编译运行都不会报错。  Java中一切都是对象,Object是所有类的根类!

2.以下哪个接口的定义是正确的? (D)

【2021.4.26】Java知识点日常总结

A,接口中方法的默认修饰符时public abstract,抽象方法可是没有方法体的,没有大括号{}

B,JDK8中,接口中的方法可以被default和static修饰,但是!!!被修饰的方法必须有方法体。

C,注意一下,接口是可以多继承的。但是和A选项一样,抽象方法不能有方法体。    (补充:任何类都不能多继承)

3.下面关于JAVA的垃圾回收机制,正确的是 (B)

【2021.4.26】Java知识点日常总结

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,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
【2021.4.26】Java知识点日常总结

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则子类中就不是重写。

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。