创建了几个String对象?

String str = "a";

1个,在常量池中创建了一个字符串对象。

 

String str = new String("a");

2个,在常量池中创建了一个字符串对象"a",在堆中开辟了一个空间又放了一个"a"。

 

String str = "a"+"b";

1个,在编译期,jvm将"a"+"b"自动识别成"ab",因此只创建了一个对象,放在常量池中。

 

String a="a";//创建一个
String b="b";//创建一个
String ab1 = a+b;//创建一个
String ab2= a+b;//创建一个

4个,第三和第四行,各创建了一个对象,因为对于编译器来说,创建ab1和ab2时候,a和b的值被当做是不确定的,所以各自开辟空间创建对象

 

final String a="a";//创建一个放常量池
final String b="b";//创建一个放常量池
String ab0=a+b;//创建一个放常量池
String ab1=a+"b";//不再创建
String ab2 = "ab";//不再创建

3个,在String前边加个final,后边再用这个对象的时候,对编译器来说a的值是确定的,和"a"是一个东西都是“字面常量字符串”。

 

以下转自:http://blog.csdn.net/s1491695565/article/details/51833579

 

//此时str1与str2相当于变量,而不是常,因为块是在运行时才能确定,在编译时不能确定  
final static String str1;    
    final static String str2;    
    static {    
        str1 ="aaa";    
        str2 ="bbb";    
    }  
    public static void main(String[] args){    
        String str3 = str1 + str2;  
        String str4 ="aaabbb";    
        System.out.println(str3==str4);   //输出为false  
    }    
String str=" ";与String str=new String();  
str=" "会放入池中,但new String()不会放入池中。 

 

String的intern()方法 
“当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串;否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true”,这是jdk文档原文注解。

 

posted @ 2017-03-08 12:20  剑握在手  阅读(892)  评论(0编辑  收藏  举报
返回顶部↑