JAVA基础之String类的介绍

String类的两种实例化方法

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

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
         }
    }

2、构造方法
例: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开辟的新内存

手动入池:使用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的内容不要过多频繁的修改

总结:直接赋值和构造器之不同的,区别在于堆内存一块与两块,还有”==”是否为true,若想为true,就要把构造器方法的入池,intern()方法。还有String的不能频繁调用,会产生大量的垃圾。构造方法也会产生垃圾(其中一块堆内存)。
构造方法的两块堆内存是构造器创建对象+匿名对象创建。
手动入池方法public String intern()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值