持续更新

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看内存情况
image
可见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代表的静态的,即这个关键字修饰东西不会受到类的声明周期影响。