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

解决方案 »

  1.   

    没有关系.具体实现,就是开一块空间,叫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指向它,原来在堆中那个字符串就会被回收掉.
      

  2.   

    “具体实现,就是开一块空间, 叫CONSTAN_string_info.”这样说有点不合逻辑, 这个空间有多大? 根据字符串的类型来开辟?。  字符串在java中是个引用, 那起不是开到堆里去了?。(动态开辟)当然肯定不是堆里的, 如果是堆里的,没有指向是会被回收掉的。
      

  3.   

    空间多大应该是类似hashmap一样的在堆里面,没有引用应该是被回收掉的。和对象一样。但是好像gc的文档里面并没有说明是否会回收。期待axman给出更完善的答案
      

  4.   

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