1.下面两个代码块能正常编译和执行吗?
short s1 = 1; s1 = s1 + 1;
short s1 = 1; s1 += 1;
答:代码块1编译报错,错误原因是:不兼容的类型:从int转换到short可能会有损失… 代码块2正常编译和执行. 其实,s1 += 1相当于s1 = (short)(s1+1).
2.基础考察,指出下题的输出结果
Integer a = 128, b = 128, c = 127, d = 127;
System.out.println(a == b);
System.out.println(c == d);
答案是:flase,true. 执行Integer a = 128,相当于执行: Integer a = Integer.valueOf(128),基本类型自动转换为包装类的过程称为自动装箱(autoboxing).
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在Integer中引入了IntegerCache来缓存一定范围的值,IntegerCache默认情况下范围为:-128-127. 本题中的127命中了IntegerCache,所以c和d是相同对象,而128则没有命中,所以a和b是不同对象.
但是这个缓存范围是可以修改的,可能有些人不知道.可以通过JVM启动参数:-XX:AutoBoxCacheMax= < size>来修改上限值,如下图所示:
3.String是java基本数据类型吗?
答:不是.java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference)。 基本数据类型:数据直接存储在栈上。 引用数据类型区别:数据存储在堆上,栈上只存储引用地址。
4.String类可以继承吗?
答:不行。String类使用final修饰,无法被继承。
5.String和StringBuilder、StringBuffer的区别?
String:String的值被创建后不能被修改,任何对String的修改都会引发新的String对象的生成。 StringBuffer:跟String类似,但是值可以被修改,使用synchronized来保证线程安全。 StringBuilder:StringBuffer的非线程安全版本,没有使用synchronized,具有更高的性能,推荐优先使用。
6.String s = new String(“xyz”)创建了几个字符串对象?
答:一个或两个。如果字符串常量池已经有了“xyz”,则是一个;否则,两个。 当字符串常量池没有“xyz“,此时会创建如下两个对象: 一个是字符串字面量”xyz“所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只放引用。 另一个是通过new String()创建并初始化的,内容与”xyz“相同的实例,也是在堆中。 详细解析:https://www.cnblogs.com/xuxinstyle/p/9345647.html。
|