java中String对象的intern方法

首先,String实现了常量池技术

1. 看以下例子:
public class TestStringIntern {
	public static void main(String[] args) {
		String s0="StringIntern"; 
		String s1="StringIntern"; 
		String s2="String" + "Intern"; 
		System.out.println( s0==s1 ); 
		System.out.println( s0==s2 ); 
	}
}
结果是:
true
true

理解:因为s0和s1中的“StringIntern”都是字符串常量,他们在编译器就被确定了,“StringIntern”存在于常量池中,所以s0==s1为true;s2由两个常量连接而成,还是字符串常量,所以也为true。

2. 看一下列子
public class TestStringIntern {
	public static void main(String[] args) {
		String s0="StringIntern"; 
		String s1=new String("StringIntern"); 
		String s2="String" + new String("Intern"); 
		System.out.println( s0==s1 ); 
		System.out.println( s0==s2 ); 
		System.out.println( s1==s2 ); 
	}
}

结果:
false
false
false

理解:使用new String()创建的字符串不是常量,是在堆中生成的对象,不能在编译器就确定,所以不存在与常量池中。所以结果为false。

3. intern方法:存在于.class文件中的常量池,在运行期被jvm装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法,当一个String的实例str调用intern()方法是,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其引用;如果没有,则在常量池中增加一个Unicode等于该实例str的字符串并返回它的引用。看如下例子:
public class TestStringIntern {
	public static void main(String[] args) {
		String s0="StringIntern"; 
		String s1=new String("StringIntern"); 
		String s2=new String("StringIntern"); 
		System.out.println( s0==s1 ); 
		s1.intern(); //在常量池里扩展常量,发现已经存在了
		s2=s2.intern(); //把常量池中“StringIntern”的引用赋给s2 
		System.out.println( s0==s1); 
		System.out.println( s0==s1.intern() ); 
		System.out.println( s0==s2 ); 
	}
}

输出:

false

false

true

true


另外,如果使用new String()生成的对象str,调用intern()方法,则是在常量池中新添加一个值为str的字符串的常量,而不是复制地址。看一下例子:
public class TestStringIntern {
	public static void main(String[] args) {
		String s1=new String("StringIntern"); 
		String s2=s1.intern();//s1.intern()在常量池里新生成了一个常量,并将引用赋值给了s2
		System.out.println( s1==s1.intern() ); 
		System.out.println( s1+" "+s2 ); 
		System.out.println( s2==s1.intern() ); 
	}
}
输出:

false

StringIntern StringIntern

true

理解:在这个类中我们没有声名一个” StringIntern”常量,所以常量池中一开始是没有” StringIntern”的,当我们调用s1.intern()后就在常量池中新添加 了一个” StringIntern”常量,原来的不在常量池中的” StringIntern”仍然存在,也就不是“将自己的地址注册到常量池中”了。 s1==s1.intern()为false说明原来的“ StringIntern”仍然存在; s2现在为常量池中“ StringIntern”的地址,所以有s2==s1.intern()为true。 



  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ,`String.intern()` 是一个用于字符串对象方法。它的作用是将字符串对象添加到字符串常量池,并返回常量池该字符串的引用。 具体含义如下: 1. 字符串常量池:Java 的字符串常量池是一个特殊的内存区域,用于存储字符串字面值。当创建字符串时,如果字符串常量池已经存在相同的字符串字面值,则会直接返回常量池的引用,而不会创建新的对象。 2. `String.intern()` 方法:`intern()` 方法是 `String` 类提供的一个实例方法。调用它会检查当前字符串对象在常量池是否存在。如果存在,则返回常量池的引用;如果不存在,则将当前字符串对象添加到常量池,并返回该引用。 使用 `String.intern()` 方法的主要目的是节省内存和提高性能。通过将字符串对象放入常量池,可以重复使用相同的字符串字面值,减少内存占用,并且可以更快地比较字符串的相等性。 例如: ```java String str1 = new String("Hello"); String str2 = str1.intern(); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true ``` 在上面的例子,`str1` 是通过 `new String("Hello")` 创建的新字符串对象,而 `str2` 是通过 `str1.intern()` 返回的常量池的引用。虽然它们的值相等,但它们是不同的对象,所以 `str1 == str2` 返回 `false`,而 `str1.equals(str2)` 返回 `true`。 需要注意的是,`String.intern()` 方法可能会在某些情况下导致一些性能问题和潜在的内存泄漏。因此,在使用时要注意评估场景和潜在的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值