JVM中intern()

intern()方法的作用

调用字符串对象的 intern 方法,会将该字符串对象尝试放入常量池中

  • 如果串池中没有该字符串对象,则放入成功,并且返回常量池中的字符串对象,此时堆内存与常量池中的字符串对象是同一个对象

  • 如果有该字符串对象,则放入失败,并且返回常量池中的字符串对象,此时堆内存与常量池中的字符串对象不是同一个对象

举例

放入成功

public class Main {
	public static void main(String[] args) {
		// "a" "b" 被放入串池中,str 则存在于堆内存之中
		String str = new String("a") + new String("b");
		// 调用 str 的 intern 方法,这时串池中没有 "ab" ,则会将该字符串对象放入到串池中,此时堆内存与串池中的 "ab" 是同一个对象
		String st2 = str.intern();
		// 给 str3 赋值,因为此时串池中已有 "ab" ,则直接将串池中的内容返回
		String str3 = "ab";
		// 因为堆内存与串池中的 "ab" 是同一个对象,所以以下两条语句打印的都为 true
		System.out.println(str == st2);//true
		System.out.println(str == str3);//true
	}
}

放入失败

public class Main {
	public static void main(String[] args) {
        // 此处创建字符串对象 "ab" ,因为串池中还没有 "ab" ,所以将其放入串池中
		String str3 = "ab";
        // "a" "b" 被放入串池中,str 则存在于堆内存之中
		String str = new String("a") + new String("b");
        // 此时因为在创建 str3 时,"ab" 已存在与串池中,所以放入失败,但是会返回串池中的 "ab" 
		String str2 = str.intern();
       
		System.out.println(str == str2);//false,str 则存在于堆内存之中
		System.out.println(str == str3);//false,str2是常量池中str对象的返回值
		System.out.println(str2 == str3);//true,str3是存在常量池中
	}
}

案例

        // 常量池:ab
    	String str3 = "ab";
    	// 常量池:ab、a、b
		String str = new String("a") + new String("b");
		// 放入失败,str2 = str3
		String str2 = str.intern();
       
		System.out.println(str == str2); //false
		System.out.println(str == str3); //false
		System.out.println(str2 == str3);//true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值