首先看一个例子(java) :
string str1 = "name" ;
string str2 = "name" ;
string str3 = new string("name") ;
string str4 = new string("name") ;
System.out.println(str1 == str2) ;
System.out.println(str2 == str3) ;
System.out.println(str3 == str4) ;
System.out.println(str1.equals(str2)) ;
System.out.println(str1.equals(str3)) ;
结果为true ,false ,false , true , true
在java中,对于“==”,如果是基本数据类型,比较的是对象的值,如果是用户自定义类型,则比较的对象的地址。equals()才比较的对象的值。这样,哦,只有str1 ,str2 的地址相同.
为什么呢?原来在java中,为了提高内存利用率,产生了一个字符串池。当遇到“string str1 = "name"”,这样的语句时,系统就会首先在字符串词中查找是否有“name"这个字符串。如果有,则将其赋给str1.否则,就在字符串池中,新建一个“name"字符串,并将她赋给str1.现在明白str1,str2为什么
指向同一份内存空间了。
当遇到“string str3 = new string("name") ;”语句时,系统就在堆中为该字符串,分配一段内存空间,注意不是在字符串池中。
在String 中有个intern()函数,她能够将该string对象的字符串在字符串池中从新复制(注意前提是在此之前,字符串池中并没有该字符串)一份,并返回该string对象的引用。
具体分析:
string str3 = new string("name") ;
str3 = str3.intern() ;
当调用intern()方法时,如果池中已包含该string对象的字符串,那么就返回该池中string对象的引用。
注意在堆中"name"字符串仍然存在(此处有内存泄露之嫌,没关系,JAVA中有强大的垃圾回收机制)。如果池中没有,就在池中新建一个该string对象的字符串。
eg:
string str = "name" ;
string str1 = new string("name") ;
string str2 = new string("name") ;
str1.intern() ;
str2 = str2.intern() ;
System.out.println(str == str1) ;
System.out.println(str == str2) ;
结果是:false ,true