Java笔记-错题

题目源自牛客网:https://www.nowcoder.com


以下那些代码段能正确执行

正确答案: C D   你的答案: A C (错误)

A public static void main(String args[]) {byte a = 3;byte b = 2;b = a + b;System.out.println(b);}
B public static void main(String args[]) {byte a = 127;byte b = 126;b = a + b;System.out.println(b);}
C public static void main(String args[]) {byte a = 3;byte b = 2;a+=b;System.out.println(b);}
D public static void main(String args[]) {byte a = 127;byte b = 127;a+=b;System.out.println(b);}

byte类型的变量在做运算时被会转换为int类型的值,故A、B左为byte,右为int,会报错;而C、D语句中用的是a+=b的语句,此语句会将被赋值的变量自动强制转化为相对应的类型

 

下列说法正确的是( )

正确答案: C   你的答案: D (错误)

A volatile,synchronized 都可以修改变量,方法以及代码块
B volatile,synchronized 在多线程中都会存在阻塞问题
C volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
D volatile解决的是变量在多个线程之间的可见性、原子性,而sychroized解决的是多个线程之间访问资源的同步性

synchronized: 具有原子性,有序性和可见性;(三个都有),volatile:具有有序性和可见性(缺一个原子性)

synchronized关键字和volatile关键字比较:

  • volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。
  • 多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞
  • volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。
  • volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性。

 

以下类型为Final类型的为()

正确答案: B C   你的答案: C (错误)

A HashMap
B StringBuffer
C String
D Hashtable

通过阅读源码可以知道,string与stringbuffer都是通过字符数组实现的(jdk1.9之前,之后使用)。其中string的字符数组是final修饰的,所以字符数组不可以修改。stringbuffer的字符数组没有final修饰,所以字符数组可以修改。string与stringbuffer都是final修饰,只是限制他们所存储的引用地址不可修改。至于地址所指内容能不能修改,则需要看字符数组可不可以修改。
 
 
下面关于JAVA的垃圾回收机制,正确的是( )

正确答案: B   你的答案: D (错误)

A 当调用“System.gc()”来强制回收时,系统会立即回收垃圾
B 垃圾回收不能确定具体的回收时间
C 程序可明确地标识某个局部变量的引用不再被使用
D 程序可以显式地立即释放对象占有的内存

 

java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。当对象的引用变量被赋值为null,可能被当成垃圾。

 

正确答案: A C D   你的答案: C D (错误)

A 构造方法的优先级一般比代码块低。
B 构造方法的返回类型只能是void型。
C 构造方法的主要作用是完成对类的对象的初始化工作。
D 一般在创建新对象时,系统会自动调用构造方法。


A:静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法
B:think in java中提到构造器本身并没有任何返回值
C: 构造方法的主要作用是完成对类的对象的初始化工作。
D: 一般在创建(new)新对象时,系统会自动调用构造方法
 
 
posted @ 2020-12-21 00:28  秃头不用洗发水  阅读(232)  评论(0编辑  收藏  举报