日期:2014-05-20  浏览次数:20721 次

字符串池跟线程有关吗?。




字符串池如果跟线程池没有关系的话, 那它是怎么实现的?。。 请高人指点迷津!






------解决方案--------------------
没有关系.

具体实现,就是开一块空间,叫CONSTAN_string_info.
如果是字面值,如String name= "axman";
则先在这个入口中查找(当然JVM一启动时不会直接开CONSTAN_string_info.也是在第一次有需求的时候才会开.)
如果其中已经有"axman"这个字符串,则直接指name指向这里提供给调用者.如果没有就在CONSTAN_string_info中放入一个"axman"
的字符序列,并将name指向它.

所以如果是字面值,只要字符串内容相同,最后都会指向同一对象.

另外如果不是从字面值,比如String s = a_Object.toString();
这时只要调用s =s.intern();就会在池中放入这个字符序列,然后s指向它,原来在堆中那个字符串就会被回收掉.


------解决方案--------------------
这个空间是JVM自己维护的,开多大和你程序员没有任何关系,简单说它已经不是JAVA堆的空间.
是不是合逻辑不是你说,而是sun的实现来决定有.
有点思维的人从这句话就可以看出来:
"这时只要调用s =s.intern();就会在池中放入这个字符序列,然后s指向它,原来在堆中那个字符串就会被回收掉. "
这句话本身就说明字符串常量池不在堆中,因为如果在堆中,没有必要创建一个再销毁一个,下次相同内容只要都指向堆中那个对象就行了.

常量池到底要多大,这和你没有任何关系,简单说SUN的人不会比你笨.需要大多的时候会自动适应,楼上说的没有错,查找常量池中是否已经存在那个值,确实是用hash来实现的.