1 java String 字符串相关

String s = new String("abc");

内存中产生两个对象,一个在String Pool里面,另一个在堆里面生成一个。s 引用堆里面的对象。

String s1 = "abc";

先从String Pool里查找是否有“abc”的对象,有则直接返回引用。

String s2 = new String("abc");

内存中产成一个对象,由于StringPool里面已经有了一个“abc”对象,则直接在堆中再创建一个“abc”对象返回引用给s2。

s == s1

s == s2

s1 == s2

String == 比较对象的引用,由于现在s ,s1 ,s2现在分别指向了三个引用地址,所以会是返回三个 false。

字符串相等性比较 JDK1.6 原生中文文档

intern

public String intern()
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。

返回:
一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。


s == s.intern();  //根据官方文档描述可知,s指向堆中new出来的对象,s.intern()则指向StringPool里的对象,所以 false

s1 == s1.intern();  //这时候s1 和 s1.intern() 都返回StringPool池中的对象,所以true

s.intern() == s2.intern();  //s.intern()去池中查找,发现有相同值对象返回StringPool里的对象,s2.intern()也可以从StrngPool池中找到,所以都返回StringPool池中引用,true。


------------------------------------------------------------------------------------------------



String hello = “hello”;

String hel = "hel";

String lo = "lo";


hello == "hel" + "lo";  //true  两个字面常量值 直接 + 号连接,会直接拼成 完整的字符串去StringPool中查找,所以true。

hello == "hel" + lo;  //false +号左右 有一个不是常量值,则会在堆中新建立出来一个对象,所以false







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值