持续更新
1
下列代码输出结果
public void one (){
Integer a=100;
Integer b=100;
Integer c=150;
Integer d=150;
System.out.println(a==b);
System.out.println(c==d);
System.out.println(d==150);
}
答案: true/false/true
解析
这个与Integer这个包装类的特性有关,Integer如果使用包装类的时候,其在底层是两个对象,按理说两个对象直接用==判断的话相当于是直接判断地址,理论上是不会相等的才对,但是在对于值范围是-128~127的Integer对象,java会自动拆包直接判断值,这就是一个判断是true,第二个判断是false的原因,至于第三个,如果Integer直接和int基本类型进行判断的话,那么则会自动拆包,这个就是第三个为true的原因。
2
下面哪句会报错
public void two(){
String a="a"+"b";
String b ="a"+3;
// float c= 5+5.5;
int d=3+4;
}
答案:float 那句
解析
5.5 这个值如果不用float修饰的话,默认是double类型,如果用float定义的话相当于是精度亏损了。JAVA默认是不支持精度亏损的操作的,因此报错。
3
以下代码将会输出什么内容
public void three(){
String a="123456";
String b="123456";
String c="123"+"456";
String d="456";
String e="123"+d;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==e);
}
答案 true/true/false
解析
这个和String机制有关,在JDK8中,默认声明的String是一个常量,然后比如"123"+“456"这种操作会在编译的时候时候优化成"123456”,因此其实a,b,c的指针是相同的,但是e是两个String变量进行+操作,这种编译器无法优化,因此就是一个新的内存地址了。我们可以用idea的bug看内存情况
可见a,b,c的内存地址498,到了e就变成500了
4
以下代码会输出什么值
private static int[] a=new int[]{1,2,3};
public static AtomicIntegerArray integerArray =new AtomicIntegerArray(a);
public void four(){
int result=integerArray.getAndAdd(1,5);
System.out.printf("%d %d",integerArray.get(1),result);
}
答案 7 2
解析
AtomicIntegerArray是一个线程原子性安全的数组,但是不管怎么说,其本质还是个数组,因此其莫过于增删改查的操作,在这个方法中,使用了getAndAdd操作,即代表着对数据先获值再改值,因此result是旧值2,然后原来的位置为2+5=7
5
以下代码会在哪一部分有问题
public static void five(){
final Person person = new Person("jack");
person.name="rose";
// person=new Person("Mike");
}
解析
在注释部位有问题,这个原因倒是很贱,就是final 修饰的变量不允许重新创建对象。这里衍生一下final和static的区别。final关键字代表含义的是最终的,即在程序中如果用此关键字进行了修饰了之后,则能且只能对该变量赋值一次;而static代表的静态的,即这个关键字修饰东西不会受到类的声明周期影响。