理解String

简述:

  String相关的主要是堆内存,堆是一个运行时数据区,动态创建空间,不需要手动进行管理,由垃圾回收负责管理。还有就是栈,主要负责放一些常量。

场景解析:

  1.java中有一个常量池,用于保证常量被共享使用,提高效率。s1,s2都指向同样的常量abc,所以s1=s2值同样相等。

public static void main(String[] args) {
	String s1 = "abc";
	String s2 = "abc";
	System.out.println("s1==s2 : " + (s1==s2));
	System.out.println("s1 equals s2 : " + (s1.equals(s2)));
}

  2.s3,s4创建了两个对象,指向abc。因为s3和s4处于堆区不同的位置,所以s3与s4不相等,但是值都是指向abc,所以值相等。

    s1为常量,放在常量池也就是栈中,所以s1和s3不等,值相等。

public static void main(String[] args) {
	String s1 = "abc";
	String s3 = new String("abc");  
        String s4 = new String("abc");  
        System.out.println("s3 == s4 : "+(s3==s4));  
        System.out.println("s3.equals(s4) : "+(s3.equals(s4)));  
        System.out.println("s1 == s3 : "+(s1==s3));  
        System.out.println("s1.equals(s3) : "+(s1.equals(s3)));  
}

  3.因为ab和cd都是常量,所以在初始化的时候str1就已经被确定。效果等同于str1 = abcd,所以str1与str2相等。但是不推荐这种声明方式,会有临时对象产生。

public static void main(String[] args) {
	String str1 = "ab" + "cd";  //1个对象  
        String str2 = "abcd";   
        System.out.println("str1 = str2 : "+ (str1 == str2));  
}

  4.str1+str2的运行相当于在str1的基础上进行append,然后生成一个str3的新对象。但是str4指向的是常量。所以str3与str4不相等。

public static void main(String[] args) {
	String str1 = "ab";
        String str2 = "cd";                                    
        String str3 = str1+str2;                                        
        String str4 = "abcd";    
        System.out.println("str3 = str4 : " + (str3==str4));
}

  5.str2生成的时候同样相当于进行append,所以str2与str12不想当。str4生成时,因为str3进行了final,相当于将其变为常量,所以str4=str34

public static void main(String[] args) {
	String str1 = "b";  
        String str2 = "a" + str1;  
        String str12 = "ab";  
        System.out.println("str2 = str12 : "+ (str2 == str12));  
        final String str3 = "b";  
        String str4 = "a" + str3;  
        String str34 = "ab";  
        System.out.println("str4 = str34 : "+ (str4 == str34));  
}

 

上述基本描述了String的基本情况,延伸出来的是会创建几个对象。判断是否产生对象的时候,关键在于其是否存在于常量池,是否是初次在常量池创建,是否会有临时对象,是否在堆中new了新的对象。由上述例子,基本可以自行理解。需要注意的是进行str+str2这种变量组成的时候,会创建StringBuffer对象,只是我们看不到。  

posted @ 2017-08-22 16:13  kobe_lzq  阅读(269)  评论(0编辑  收藏  举报