java字符串常量的+操作

String
最近学习发现了一个有意思的东西,就记录下来了,以便自己后面复习。
就是String类的不同创建方式所创建的字符串是否相等??以及不同操作所创建的相同字符串是不是相等。关于这个问题我也是做了很多尝试。接下来我们一步步看:

首先
String 无非两种创建方式:
String str =“aa”;
String str1=new String(“bbb”);
我们还要知道一个 字符串是不可变的 这个很重要,一旦创建就不可在修改。文章后面会用到。
这两种创建方式有何区别?
我们先看最简单的一种例子:
图一
答案很显然 :false true。
首先我们要知道Java中具有一个字符串常量池,在我们用str1=“AADD"创建字符串时,会首先在字符串常量池中寻找有没有这个字符串,如果有的话就直接引用这个已存在的字符串,如果没有则会在池中创建,然后引用这个刚创建的字符串。这也是我们看到的(str1==str3)为什么会是true的原因。str1已经创建了“AADD”,这时str3在取创建的时候,就直接也引用了同一个字符串。他们存放的是相同的引用。值也就相同了。

当使用 new 关键字创建字符串时,实质上是在堆中创建了一个字符串对象”AADD"(注意此时这个对象和str1创建的不是同一个),而str2存放的则是“AADD”在堆中的引用,自然和str1存放的池中的引用截然不同。也就不相等了。

接下来:看这段代码:
图二
结果: false true
这个做出来,相信你前面已经明白了。 str1的操作其实相当于我们第一种创建方式,常量池中没有就直接在池中创建“justso so”。
代码执行到str2这一行 和第一个图是一样的,一个在堆一个在池中,自然不一样。
接着 到了str3这一行,此时str3在常量池中找到了“justso so"就不重新在池中创建了,直接引用str1创建好的的对象,两个的引用是同一个,自然结果是true,
我们也可以通过看地址值的方式:(System.identityHashCode()是一个可以查看hash地址的方法)
这是取消注释后的结果 我们可以清楚的看到 str1和str2地址截然不同,str3与str1相同。
str1hashcode:366712642
str2hashcode:1829164700
false
str1hashcode:366712642
str3hashcode:366712642
true
**接下来 重点到了:**上图:

图三
结果: 是个 false。
输出地址:
str3 hashcode:366712642
str4 hashcode:1829164700
最后才明白,是因为字符串不可变性。
图四
我们可以看到String类中采用保存字符串的方式是一个加了final的数组,**对于一个final变量,如果是基本数据类型,其数值再初始化后不可再更改。如果是引用数据类型,在对其初始化后,不能再让其指向另一个对象。**所以实际上也只是新建了一个字符串然后将新字符串的引用给原先的字符串变量 如下:String str="abcde"; str=str+"gf"; System.out.println(str); 结果:abcdegf 即便str看似是做了连接操作:其实前后的地址也不一样:

String str="abcde";
		System.out.println("strhashcode:"+System.identityHashCode(str));
		str=str+"gf";
		System.out.println("strhashcode:"+System.identityHashCode(str));
		System.out.println(str);

结果:
strhashcode:366712642
strhashcode:1829164700
abcdegf
原因是:在作字符串常量的+ 操作时 实质上是new 了一个StringBuilder对象(可变字符串)调用了append()方法进行操作 拼接完成后调用toString()方法返回了一个String对象。而这一系列的操作都是在堆中进行,所以上图中的str3在进行了(str1+str2)操作后返回的是一个在堆中的引用。所以会与str4这个在池中创建的对象不相同。

完结 撒花!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值