String.intern()函数

前言

先进行字符串的 ==与equals的比较
然后再继续介绍intern()函数

String的比较

首先大家都知道,String既可以当做对象来使用,同时也可以作为基本类型来使用,当String str = "abc"的时候就是作为基本类型来使用,当String str = new String("abc")的时候就会创建一个对象,当做对象来使用。

String有两种比较方式,一种是使用“==”来进行比较,这个比较是比较String的类型的变量的引用,即两个String是否指向同一块内存堆。另外一种是使用Object对象的eaquls来比较,这个比较只需要两个String的内容一样即可。

		String str1 = "wujian";
		String str2 = "wujian";
		String str3 = "wu"+"jian";
		String str4 = new String("wujian");
		String str5 = new String("wujian");
		String str6 = new String("wu")+new String("jian");
		System.out.println((str1==str2)+","+(str1.equals(str2)));
		System.out.println((str1==str3)+","+(str1.equals(str3)));
		System.out.println((str1==str4)+","+(str1.equals(str4)));
		System.out.println((str4==str5)+","+(str4.equals(str5)));
		System.out.println((str4==str6)+","+(str4.equals(str6)));

运行结果:

true,true
true,true
false,true
false,true
false,true

对于这个结果大家应该都理解为什么,我们的重点还是在intern()函数,这里就不多说了。


intern()函数

首先先看几个程序
示例一

		String str1 = new String("wu");
		System.out.println(str1.intern()==str1);
		System.out.println(str1.intern()=="wu");
		str1=str1+"jian";
		System.out.println(str1.intern()==str1);
		String str2 = "wujian";
		System.out.println(str1.intern()==str2);
		System.out.println(str1==str2);

		false
		true
		true
		true
		true

当new一个String字符串的时候会在内存中开辟一片新空间存放新对象,同时将"wu"字符串放到常量池里面去,相当于创建了两个对象。而interm()会在常量池中记录首次出现的实例引用,所以第一个为false而第二个为true,接下来str1=str1+"jian"将会创建一个新的字符串实例,而这个字符串实例与intern()返回的引用是同一个,所以第三个也为true。String str2 = “wujian”;此时在常量池已经有了"wujian"这个字符串,将会直接把字符串的地址赋值给str2,所以第四个和第五个都是true。

将String str2 = “wujian”;移动到str=str1+“jian”;前面去
示例二

		String str1 = new String("wu");
		System.out.println(str1.intern()==str1);
		System.out.println(str1.intern()=="wu");
		String str2 = "wujian";
		str1=str1+"jian";
		System.out.println(str1.intern()==str1);
		System.out.println(str1.intern()==str2);
		System.out.println(str1==str2);

		false
		true
		false
		true
		false

我们发现示例一跟示例二的结果有很大的区别,原因如下:
第一个和第二个结果前面已经说过,对于第三个是因为先执行String str2 = “wujian”;然后在常量池中放入了"wujian"然后将地址赋值给str2,接下来执行str1=str1+“jian”;的时候将会创建一个新的对象,而这个对象是跟常量池里面的这个是不一样的,而str1.intern()将会返回首次出现的实例引用,所以第三个为false,第四个为true,而str1与str2是两个不同的对象,所以为false。

实例三

		String str1 = new String("ja")+"va";
		System.out.println(str1.intern()==str1);
		String str2 = new String("wu")+"jian";
		System.out.println(str2.intern()==str2);

		false
		true

对于第一个返回’false’是因为"java"这个字符串在new String(“ja”)+"va"之前已经出现过了,字符串常量池已经有了它的引用了,不符合首次出现的原则了,而"wujian"这个字符串是首次出现的,因此为’true’。

注意
在jdk1.6中,intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用,而其他创建的新的字符串实例在Java堆中。
在jdk1.7以后,intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用。

发布了6 篇原创文章 · 获赞 8 · 访问量 1654

猜你喜欢

转载自blog.csdn.net/miswujian/article/details/98932551