题目均来自牛客网
1、
有以下代码片段:
String str1="hello";
String str2="he"+ new String("llo");
System.out.println(str1==str2);
请问输出的结果是:false
- 解
类似问题连接:
String is immutable. What exactly is the meaning? [duplicate]
Difference between string object and string literal [duplicate]
还有一篇比较好的博文
Java技术——你真的了解String类的intern()方法吗
大致总结:
1)首先String是不可改变的,不可改变是指字符串本身,而不是引用对象。
2)之所以要弄String的这种interning机制是为了加速字符串比较的速度,这样字符串的比较就只需要比较引用是否相同,而不需要一个一个字符去比较
3)当用字面量(literal)即用引号的方式创建字符串时,(String s=”aa”) 首先会在字符串常量区找是否有此字符串,有的话直接引用此字符串,没有的话,在字符串常量区新建一个。
4)第三点也就解释了为什么String类是final的,因为若允许用户自定义继承改变其行为,就会导致一个字符串的改变影响到所有引用了此字符串的变量。
5)使用new String时,是在堆创建的对象,new出来的对象不同,引用自然就不同,而==对于对象的比较是直接比较的引用,因此结果自然是false
2、
Integer i = 42;
Long l = 42l;
Double d = 42.0;
下面为true的是
(i == l)
(i == d)
(l == d)
i.equals(d)
d.equals(l)
i.equals(l)
l.equals(42L)
- 解
正确:l.equals(42L)
以Integer为例,它重写的equals源码为:
public int intValue() {
return value;
}
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
即一开始就会比较二者的类型是否相等,不相等直接返回false
若是普通数据而言,还会进行自动装箱操作。
以上满足后,再进行真正值的比较
而对于==而言,
stackoverflow上有这个问题
When using == for a primitive and a boxed value, is autoboxing done, or is unboxing done
总结来说就是,
1)如果两边都是包装类型的话,则都不会进行拆箱,直接是引用的比较
但这儿引用又分两种情况
因为Integer有一个缓存区存放了-128~127的int值,
因此,Interger (范围内数1) == Integer(范围内数1)为true
即二者引用是相同的,
而当超过此范围时,两者就是两个独立的包装对象,因此==的结果是 false
2)当==运算符有任何一边是非包装类(且是numeric)时,都会进行自动拆箱操作
3、
Which statement declares a variable a which is suitable for referring to an array of 50 string objects?
char a[][];
String a[];
String[] a;
Object a[50];
String a[50];
Object a[];
- 解答
1)对于Object[] x 与Object x[]这两种写法,其实都是一样的,
但是官方推荐的是Object[] 这种写法
2)java数据,在声明时是不能指定初始长度的,因此正确的是:
String a[];
String[] a;
Object a[];