两种创建String对象的区别(对象不同)

方式一:直接赋值 String s=”hsp”;

方法二:调用构造器 String s2=new String(“hsp”);

两种方法创建String对象jvm的内存布局

方式一:直接赋值 String s=”hsp”;

1. 先看常量池有没有”hsp”的数据空间,如果有直接指向。没有则在常量池创建”hsp”,然后s指向它(常量池的空间地址)。

                                                 方法二:调用构造器 String s2=new String(“hsp”);

2.先在堆中创建空间,里面有value属性(char value[]),指向常量池的hsp空间。如果常量池有没有”hsp”的数据空间,就在常量池创建”hsp”。如果有则通过value(复制常量池”hsp”地址)指向,最终指向的是堆中的空间地址。

例题:

public class String01 {
    public static void main(String[] args) {
        //1.直接赋值创建Syring对象
        String a1="hsp";
        String a2="hsp";
      //2.调用构造器
        String b=new String("hsp");
        System.out.println(a1.equals(a2));    //equals已被重写,比较的是值或内容是否相等
        System.out.println(a1==a2);           //比较是否是同一对象
        System.out.println(a1.equals(b));
        System.out.println(a1==b);
    }
}

输出结果:

true
true
true
false

a1、a2的对象和值相同。

  因为a1、a2对象指向的都是常量池中的字符串"hsp"对象,所以它们的对象是相同的,且值相同,输出结果都为true。

a1、b1的对象不同,值相同。

  因为b1是先在堆中创建空间(value),用value来指向常量池中的字符串"hsp",而a1是直接指向常量池中的字符串"hsp",所以两个的对象不同,所以输出为false。

内存布局如下:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值