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".

Constant Pool常量池的概念

Constant Pool常量池的概念 Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都...
  • working_brain
  • working_brain
  • 2014年04月15日 15:52
  • 975

JedisPool使用原理及源代码

JedisPool的使用 public String set(String key, String value) { Jedis jedis = null; boolean success ...
  • luyee2010
  • luyee2010
  • 2013年12月26日 12:37
  • 41720

String pool的测试和方法中String对象的测试

package StringTest.equalTest; /**  *  * Description:测试 string pool  * Company: sinosoft  * @a...
  • pairsfish
  • pairsfish
  • 2014年08月26日 16:33
  • 422

ceph学习之pool

pool是ceph存储数据时的逻辑分区,它起到namespace的作用。其他分布式存储系统,比如Mogilefs、Couchbase、Swift都有pool的概念,只是叫法不同。每个pool包含一定数...
  • chengfei112233
  • chengfei112233
  • 2017年11月15日 12:24
  • 91

python并行化介绍及使用 Pool

本篇将要介绍python的并行化,及简单的应用。主要介绍map函数的使用,一手包办了序列操作、参数传递和结果保存等一系列的操作。 首先是引入库: from multiprocessing.dumm...
  • Winterto1990
  • Winterto1990
  • 2015年08月25日 13:58
  • 4395

Java中的字符串缓冲池——String pool

在thingking In Java 中这样说到: String manipulation is arguably one of the most common activities in com...
  • Goskalrie
  • Goskalrie
  • 2016年02月19日 11:11
  • 584

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

Java字符串池(String Pool)深度解析
  • m15527097561
  • m15527097561
  • 2017年08月08日 12:19
  • 143

jdbc pool java连接池技术

1.ConnectPool .java: 2. 3. package pool; 4. 5./** 6. * Title: ConnectPool.Java 7. *...
  • qq_21439971
  • qq_21439971
  • 2016年05月18日 11:30
  • 4204

boost pool实现详解

转自:http://www.cppblog.com/pizzx/archive/2014/06/18/207324.html 使用boost::object_pool来创建对象(见上...
  • tomisaboy
  • tomisaboy
  • 2016年06月07日 13:12
  • 516

Linux_CentOS7_lnmp环境搭建过程记录

1. ifconfig命令不存在yum –y install net-tools2. 解决killall命令不存在yum install psmisc3. 安装gcc*yum –y install g...
  • csdn_yasin
  • csdn_yasin
  • 2016年09月25日 00:26
  • 2108
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:String Pool
举报原因:
原因补充:

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