Java中String类两种实例化的区别(转)

原文:http://blog.csdn.net/wangdajiao/article/details/52087302

一、String类的第一种方式 
1、直接赋值 
例:String str = "hello"; 
直接赋值实际上就是相当于一个匿名对象(“hello”)设置了一个名字(str),String类的匿名对象是由系统自动生成,不在由用户自己创建,产生了匿名对象就一定在堆内存在开辟了一块堆内存空间,并且由一块栈内存指向这块堆内存 
这里写图片描述

2、采用直接赋值的String类对象的内存地址完全相同,stra,strb,strc指向同一块内存地址 
例:

public class StringDemo {
    public static void main(String[] args) {
        String stra = "hello" ;
        String strb = "hello" ;
        String strc = "hello" ;
        System.out.println(stra == strb);//true
        System.out.println(stra == strc);//true
        System.out.println(strb == strc);//true
        }
}

 

这里写图片描述

原因: 
共享设计模式:在JVM底层实际上会有一个对象池(不一定保存String对象),当代码之中使用了直接赋值的方式定义了一个String类对象时,会将此字符串对象所使用的匿名对象入池保存,而如果后续还有其他String类对象也采用直接赋值方式,并且设置了同样的内容的时候,将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。

二、String类的第二种方式 
1、构造方法 
例:String str = new String("hello")

这里写图片描述 
构造方法一定要使用关键字new,一旦使用了关键字new就表示要开辟新的堆内存空间,如果使用的是构造方法的方式产生String类对象,实际上开辟了两块堆内存空间(其中匿名对象产生内存空间将成为垃圾空间)

public class StringDemo {
    public static void main(String[] args) {
        String stra = new String("hello");
        String strb = "hello";
        System.out.println(stra == strb);//false

    }
}

除了内存浪费以外,如果使用了构造方法产生String类对象,其内容不会保存在对象池之中。因为是使用了关键字new开辟的新内存

2、手动入池:使用String类定义的public String intern();

 
public class StringDemo {
    public static void main(String[] args) {
        //使用了构造方法创建对象,而后手动入池
        String stra = new String("hello").intern();
        String strb = "hello";
        System.out.println(stra == strb);//ture
    }
}

 


总结 : 
String类两种实例化的区别 
1、直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池之中,以供下次重复使用 
2、构造方法:会开辟两块堆内存空间,其中有一块空间将成为垃圾,并且不会自动入池,但是用户可以使用intern()自动入池


在实际工作中,使用直接赋值产生String类对象

三、字符串一旦定义则不可改变 
例:

public class StringDemo {
    public static void main(String[] args) {
        String str = "Hello";
        str = str + "World";
        str += "!!!";
        System.out.println(str);
    }
}

内存分析图: 
红框内为垃圾内存

因此,字符串的内容实际上没有改变,而对于字符串对象内容的改变,是利用了引用关系的变化而实现的,但是每一次的改变都会产生垃圾空间,因此String的内容不要过多频繁的修改

posted @ 2017-08-20 23:26  奋斗终生  Views(1113)  Comments(0Edit  收藏  举报