面试题:
1: byte b1 = 3;
byte b2 = 4;
byte b3 = b1+b2;
byte b4 = 3+4;
System.out.println(b3);
System.out.println(b4);
问,以上代码是否有问题?
答:有问题
在b3=b1+b2会出错,因为变量byte在进行运算是会自动转换成Int类型,然后将int类型的结果赋给b3时会发生精度的丢失,所以会报错,需要强制类型转换byte b3 = (byte)(b1+b2);
byte b4 = 3+4;不会出错,因为常量在参与运算时会运算出结果后检验是否在该数据类型的范围内,然后将常量值赋给该变量。
2:short s = 5;
s=s+2;
s+=2;
什么区别
第二行报错,因为s是short类型,2是int类型,当变量参与运算是会强制转型成int类型,所以会报错。
也就是说short s=(short)s+2;等价于s+=2。
3:a=10;
b=20;
请把两个数据交换
a=a^b
b=a^b
a=a^b
请用最高效率写出2*8(运用位运算)
2*8--2<<3;
4:方法重载和方法重写的区别?
方法重写:
子父类中,出现方法名相同的情况,返回值,方法名,参数。
方法重载:
子父类中,方法名相同,参数不同,与返回值无关。
5:为什么局部内部类访问局部变量,该变量必须加final修饰。
局部变量会在方法调用完毕后立马消失,而局部内部类中如果有地方使用局部变量,当方法消失后,这个方法区中的内容还没有消失,也就是说这个变量必须存在,为了延长该变量的生命周期,加final修饰。
6:Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);// false
System.out.println(i1.equals(i2));// true
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3 == i4);// false
System.out.println(i3.equals(i4));// true
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);// false
System.out.println(i5.equals(i6));// true
Integer i7 = 127;
Integer i8 = 127;
System.out.println(i7 == i8);// true
System.out.println(i7.equals(i8));// true
原因:
关于Integer的面试题:
byte常量池。
也就是byte范围内的值,直接赋值给Integer,是从常量池里面获取的。
7: String s1 = "a";
String s2 = "b";
String s3 = "ab";
System.out.println(s1 == s2+s3); //false
System.out.println(s1 == "a"+"b"); //true
原因:变量相加会直接相加,然后再去常量池里找,如果有就是常量池的值。而变量会重新开辟空间。
8: String s = "abc";
change(s);
System.out.println(s);//abc
public static void change(){
s+=hello;
}
因为String的值不会发生改变,如果使用StringBuffer结果则相反
9: 面试题:ConcurrentModificationException:并发修改异常
当我们通过迭代器迭代元素的过程中,有通过集合去添加了元素,这种情况是不允许的,因为迭代器是依赖于集合存在的,如果集合发生了改变,迭代器也应该相应的发生改变,而我们目前看到确是,迭代器没变,集合变了,所以报出一个并发修改异常。
注意:通过迭代器遍历集合的时候,是不能通过集合去操作(添加,删除)。
A:通过迭代器迭代的时候,可以通过迭代器对集合进行操作。只能通过列表迭代器操作,而且元素是添加到刚遍历的元素后面。
B:通过集合普通for循环的时候,可以通过集合去操作。全部通过集合操作,元素是添加到最后的。
|
|