intern 方法 java_Java String intern方法介绍

今天看到有线程同步的代码直接使用了String对象作为锁对象,心想可能会出问题,因为String对象可能表面上内容一样,但是实际上却不是同一个对象地址。Java字符串比较 == 判断是地址是否相等,equals判断是内容是否相等。但是String类有个本地方法intern,可以让不同对象地址的字符串,使用==时返回true,来看下定义:

方法返回字符串对象的标准表示。重点在When段落。当字符串池中存在通过equals方法相等的字符串时,返回该字符串常量。如果不存在,则将字符串加入到常量池后再返回。由此可见,最终返回的都是字符串常量。所以当==比较两个都是常量池中的元素时,就会返回true。不过用intern返回的常量比较堆上字符串对象地址,仍然会是false,注意对等。下面简单举个例子:

package com.huayu.java91up;

/**

* Create by zxb on 2017/4/18

*/

public class Test {

public static void main(String[] args) {

String orgin = "Hello";

String orgin2 = "Hello";

String token0 = "Say-Hello";

String token1 = "Say-" + orgin;

String token2 = "Say-" + orgin2;

String token3 = orgin.substring(0);

String token4 = orgin.substring(0);

String token5 = orgin.substring(1);

String token6 = orgin.substring(1);

String token7 = new String("Hello");

String token8 = new String("Say-Hello");

System.out.println("orgin == orgin2 -> " + (orgin == orgin2));

System.out.println("token0 == token1 -> " + (token0 == token1));

System.out.println("token1 == token2 -> " + (token1 == token2));

System.out.println("token3 == token4 -> " + (token3 == token4));

System.out.println("token5 == token6 -> " + (token5 == token6));

System.out.println("token0.intern() == token1.intern() -> " + (token0.intern() == token1.intern()));

System.out.println("token1.equals(token2) -> " + (token1.equals(token2)));

System.out.println("orgin == token7 -> " + (orgin == token7));

System.out.println("token1 == token8 -> " + (token1 == token8));

System.out.println("token0 == token8.intern() -> " + (token0 == token8.intern()));

System.out.println("token1.intern() == token8.intern() -> " + (token1.intern() == token8.intern()));

}

}

执行结果如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值