`
deejay
  • 浏览: 142822 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java中string的解析

    博客分类:
  • java
阅读更多

  
首先看一个例子(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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics