Java中字符串的几个实例

String str=new String("abc");new 对象时,位于堆中,同时看字符串常量中是否有字符串"abc",如果没有,则进行添加,同时进行关联;

如果有,则直接进行关联。

String str="abc";对应于JVM内存模型中的方法区,方法区位于JVM内存模型的堆中,可叫做字符串常量区。

 

public class synchronizedArrayList {

    //位置:存储在JVM内存模型的方法区中,而方法区位于JVM内存模型的堆中
    //字符串常量区,static和不是static都是存储在常量区中
    public static String str_static="good";
    public static void main(String[] args) {
//存储在常量区中
        String str1 = "abc";         
        //当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),
        //则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 
        //它遵循以下规则:对于任意两个字符串 s 和 t ,
        //当且仅当  s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true 。
        String str2 = new String("abc").intern();         
        System.out.println(str1==str2);  //true
        
        //intern首先常量区中没abcd,则把对象添加进去,然后返回的是字符串常量区中的abcd的引用
        String str3=new String("abcd").intern();
        //常量区中
        String str4="abcd";
        System.out.println(str3==str4);//true 
        
        //位于堆中
        String str_all=new String("good");
        //位于常量区中
        String ss="good";
        String str5="goo";
        String str6="d";
        //由于有变量的相加,则会创建新的变量,实际创建Stringbuilder进行append
        String str7=str5+str6;
        System.out.println(str7==ss);//false
        System.out.println(str7==str_all);//false
        System.out.println(str_static==str_all);//false,一个堆中,一个常量区中
        System.out.println(str_static==str_all.intern());//true,intern返回的是常量区中的引用
        System.out.println(str_static==ss);//true,static修饰与否,都位于常量区中
    }


运行结果为:

true
true
false
false
false
true
true

 

posted @ 2016-12-18 20:36  Big_Foot  阅读(1168)  评论(0编辑  收藏  举报