String Pool

原创 2006年05月22日 22:06:00

在jvm中存在着String Pool

 String对象是不变对象,在程序运行过程中可能用到多个具有相同值得String对象,jvm中使用String pool来优化这种情况。当有新的String对象要建立的时候,jvm先检查Pool中时候已经有具有相同值的String对象,如果有就把这个对象的引用传递给新建立的对象,如果没有,就新建立一个对象,并将它放到Pool中。

String对象的建立有两种方式:

String s = "abc";

or

String s = new String("abc");

在String Pool中这两种方式建立的对象有所不同,实际上String Pool只是对无名称String对象有效,即:通过方式一建立的具有相同值的对象也具有相同的内存地址。而对于通过new来建立的对象并不起作用,即用这样方式建立的对象具有自己的内存空间。

class hello{

public static void main(String args[]){

String s1 = "abc";
String s2 = "abc";

System.out.println("s1==s2?  "+(s1==s2));
System.out.println("s1.equal(s2)?  "+s1.equals(s2));

String s3 = new String("abc");
String s4 = new String("abc");
System.out.println("s3==s4?  "+(s3==s4));
System.out.println("s3.equal(s4)?  "+s3.equals(s4));

System.out.println("s1==s3?  "+(s1==s3));
System.out.println("s1.equal(s3)?  "+s1.equals(s3));


}
}

结果:

s1==s2?  true                                                        //-- ps: s1和s2具有相同的内存地址。
s1.equal(s2)?  true
s3==s4?  false                                                      //-- ps: s3和s4具有不同内存地址。
s3.equal(s4)?  true
s1==s3?  false
s1.equal(s3)?  true

下面的代码会输出什么呢? :)

class hello{

public static void main(String args[]){

String s5 = new String("abc");
String s6 = "abc";
System.out.println("s5==s6?  "+(s5==s6));
System.out.println("s5.equal(s6)?  "+s5.equals(s6));

}
}

结果:

s5==s6?  false
s5.equal(s6)?  true

预料之中!

/////////////////////////////////////////////下面为引用////////////////////////////////////////////////////////

FROM:http://www.matrix.org.cn/thread.shtml?forum_id=19&view_id=17459

以上这句说话并没有错.那是在说String 放在String pool时的特例.
for example:
String a = "abc";  // 检查String pool有没有这组字串,发现没有就create一个
String b = "abc";  // 检查String pool有没有这组字串,发现有,就直接引用它的reference
if(a==b) 是true;

但当用到new时就会有如下的情形.
String a = new String("abc");  
// 检查String pool有没有这组字串,发现没有就create一个,
// 因为用new,所以同时亦建立一个新的instance给它.
String b = new String("abc");  
// 检查String pool有没有这组字串,发现有,就直接引用它的reference
// 因为用new,所以同时亦建立另一个新的instance给它.

知道为甚麽new String("abc")亦要检查String pool吗.
那是因为String()的constructor是原因.
这是其中一个String的constructor : String(String original).
留意当new String("abc")时.
其实已经先做了一个动作,String original = "abc".

相关文章推荐

Java字符串池(String Pool)深度解析

Java字符串池(String Pool)深度解析

java字符串池(string pool)和字符串堆(heap)内存分配

java运行环境有一个字符串池(string pool),由String类维护。   执行语句 String str = "abc" 时,首先查看字符串池中是否存在字符串"abc",如果存在则直接...
  • weiioy
  • weiioy
  • 2013年07月25日 13:36
  • 688

String Pool

其实只要理解以下知识:     String 是存放在java栈中,当创建一个String对象时(其他存放在栈中的基本类型变量类似),会去栈中查找是否有相同值的String,如果有则将变量地址赋...
  • zi_jun
  • zi_jun
  • 2012年06月01日 22:59
  • 1606

字符串拘留池(string interning pool)

1.字符串 字符串(string)这个类型是大家都很熟悉的类型,很多程序(几乎所有)都会对字符串进行操作。所以基础知识我就不写了。 string类型是引用类型而不是值类型。(这是前提)。 2.拘...

C# 字符串拘留池机制(string intern pool),禁止使用?????

一、字符串拘留池的引入      在一个程序中,如果将同一个字符串赋值给不同的字符串引用,那么系统会为多次分配内存空间,然而这些内存中存储的是同一个字符串(见下图)。这不仅浪费了宝贵的内存,还极大程...

JAVA String Pool

    要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在...
  • IPJMC
  • IPJMC
  • 2011年05月21日 14:52
  • 382

String pool和heap

String str1 = "java"; // str1指向字符串池 String str2 = "blog"; // str2指向字符串池   String s = str1 +...

String Pool

其实只要理解以下知识:     String 是存放在java栈中,当创建一个String对象时(其他存放在栈中的基本类型变量类似),会去栈中查找是否有相同值的String,如果有则将变量地址赋...
  • cyczmm
  • cyczmm
  • 2011年05月19日 13:12
  • 323

Redis客户端之Jedis(Key、String、Set、List、pub/sub、cluster、pool、pipleline)

原文链接:http://blog.csdn.net/xyang81/article/details/51918129环境: OS:CentOS7 64位 server版本:Redis 3.2.0 ...
  • xyang81
  • xyang81
  • 2016年07月15日 15:27
  • 7372

理解Java String和String Pool

要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:String Pool
举报原因:
原因补充:

(最多只允许输入30个字)