记录一些笔试,面试中常常问到的问题吧:
1、String
情景一
String s1 = new String("abc");
String s = "abc";
String s2 = new String("abc");
问题:以上三句分别产生了几个对象。
分析:s1、s、s2分别为引用,换句话说,可以认为他们不是对象。
第一句话,产生了2个对象,首先会在string pool中查找是否有"abc"这个对象,如果没有则建立一个,第一个对象,位于string pool中的“abc”对象,new String("abc")在string pool中找到"abc"对象后,在java的堆区产生一个“abc”对象,产生第二个对象。s1地址指向java堆区的“abc”对象
第二句话:会去string pool中寻找,因为第一句话中已经产生了"abc"对象,那么将不再产生对象,s指向string pool中的“abc”对象
第三句话:先在string pool中查找到"abc"对象,然后在java堆区产生一个新的"abc"对象,产生一个对象,s2指向这个新的"abc"对象
情景二
String s = "hello";
String s1 = "he";
String s2 = "llo";
问题:
s == "he"+"llo"?
s == "he"+s2;
分析:
第一:返回true,因为如果"+"号两边都为常量值,那么拼接起来后依旧指向string pool中的"hello"。
第二:返回false,因为如果“+”号有一边为常量值,一边不是常量值的话,会在java堆区产生一个新的对象