Java字符串面试(二)

先看下面2个程序

 

  1. public static void main(String[] args) {  
  2.         String a = "a1";    
  3.         String b = "a" + 1;    
  4.         System.out.println(a == b);   
  5.     }  
  1. public static void main(String[] args) {  
  2.     String a = "a1";    
  3.     String b = "1";    
  4.     String c = "a" + b;  
  5.     System.out.println(a == c);   
  6. }  

第一个程序输出是true,由于“a” 和1算是字符串常量,所以在编译期b的值就确定了,在运行期不会产生StringBuilder对象,所以在运行期,由于“a1“已经在String Pool中存在, 所以对象”a1“的引用同时指向a和b。

 

第二个程序中输出是false。因为在运行期才能确定"a"+b的值,所以为了提高效率,在运行期会产生一个StringBuilder对象,对它调用append方法,最后调用toString()方法,返回一个String对象的引用。

 

下面开始说几个面试题:

1.

 

  1. public static void main(String[] args) {  
  2.         //打印true,原因见上面分析  
  3.         String a = "a1";    
  4.         String b = "a" + 1;    
  5.         System.out.println(a == b);  
  6.     }  

 

2

 

  1. public static void main(String[] args) {  
  2.         //打印false,原因见上面分析  
  3.         String a = "ab";    
  4.         String bb = "b";    
  5.         String b = "a" + bb;    
  6.         System.out.println(a == b);    
  7.     }  

3.

 

 

  1. public static void main(String[] args) {  
  2.     //打印true,final说明bb始终指向”b“,不能把其他对象的引用给bb,所以,在编译期,bb的值是确定的,即  
  3.     //"a" + bb的值也是确定的,所以和上面1同理  
  4.     String a = "ab";    
  5.     final String bb = "b";   
  6.     String b = "a" + bb;    
  7.     System.out.println(a == b);    
  8. }  

4

 

 

  1. public static void main(String[] args) {  
  2.     //打印false, 简言之,就是编译期不能确定,在运行期才能确定,因此会产生StringBulder对象,通过toSring()返回一个String  
  3.     //的引用,肯定他a和b的内存地址是不同的。  
  4.     String a = "ab";    
  5.     final String bb = getBB();    
  6.     String b = "a" + bb;    
  7.     System.out.println(a == b);    
  8. }    
  9.   
  10. private static String getBB() {    
  11.     return "b";    
  12. }  

5

 

 

  1. public class Test {  
  2.     private static String a = "ab";    
  3.       
  4.     public static void main(String[] args) {   
  5.         //打印false,true, static数据放在方法区中,其他和不是static的变脸一样  
  6.         String s1 = "a";    
  7.         String s2 = "b";    
  8.         String s = s1 + s2;    
  9.         System.out.println(s == a);    
  10.         System.out.println(s.intern() == a);    
  11.     }   
  12. }  

 

分析图如下:

 

6

 

  1. public class Test {  
  2.     private static String a = new String("ab");      
  3.       
  4.     public static void main(String[] args) {  
  5.         //打印false,false,true。分析看后面的分析图  
  6.         String s1 = "a";    
  7.         String s2 = "b";    
  8.         String s = s1 + s2;    
  9.         System.out.println(s == a);    
  10.         System.out.println(s.intern() == a);    
  11.         System.out.println(s.intern() == a.intern());    
  12.           
  13.     }    
  14. }  

 

posted @ 2016-12-18 22:58  Big_Foot  阅读(183)  评论(0编辑  收藏  举报