问题:创建String对象两种方式,不清楚这两种创建方式的区别

//方式一:
String s = "wsy";
//方式二:
String s1 = new String("wsy");

我先试了试debug,发现变量s中里面有个数组名称为value的char数组

原来String类里面有个数组名称为value的char数组,并且是private final修饰的

为了更深一步了解String两种创建方式的区别,我试试看比较这两个变量的地址是否是一样的

        //方式一:
        String s = "wsy";
        System.out.println(s.hashCode());
        //方式二:
        String s1 = new String("wsy");
        System.out.println(s1.hashCode());
        System.out.println(s == s1);

刚开始觉得很奇怪,为什么两个String类型的数据,它们的hashcode()相同,但是==的结果为false,后来我进入到String类里面一看原来String重写了hashCode方法,哈希值是根据字符串的内容来决定的,并不是内存地址,所以为了更深一步了解String两种创建方式的区别,这个方式不可行。

后来我又上网查了下,

String方式一:是先看常量池中是否有wsy,数据空间,如果有,直接指向,如果没有则重新创建,然后指向s最终指向的是常量池中的空间地址

方式二:先在堆中创建空间,里面维护了value属性,指向常量池的wsy空间。如果常量池没有“wsy”,重新创建,如果有,直接通过value指向,最终指向的是堆中的空间地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值