字符串池跟线程有关吗?。 字符串池如果跟线程池没有关系的话, 那它是怎么实现的?。。 请高人指点迷津! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有关系.具体实现,就是开一块空间,叫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指向它,原来在堆中那个字符串就会被回收掉. “具体实现,就是开一块空间, 叫CONSTAN_string_info.”这样说有点不合逻辑, 这个空间有多大? 根据字符串的类型来开辟?。 字符串在java中是个引用, 那起不是开到堆里去了?。(动态开辟)当然肯定不是堆里的, 如果是堆里的,没有指向是会被回收掉的。 空间多大应该是类似hashmap一样的在堆里面,没有引用应该是被回收掉的。和对象一样。但是好像gc的文档里面并没有说明是否会回收。期待axman给出更完善的答案 这个空间是JVM自己维护的,开多大和你程序员没有任何关系,简单说它已经不是JAVA堆的空间.是不是合逻辑不是你说,而是sun的实现来决定有.有点思维的人从这句话就可以看出来:"这时只要调用s =s.intern();就会在池中放入这个字符序列,然后s指向它,原来在堆中那个字符串就会被回收掉. "这句话本身就说明字符串常量池不在堆中,因为如果在堆中,没有必要创建一个再销毁一个,下次相同内容只要都指向堆中那个对象就行了.常量池到底要多大,这和你没有任何关系,简单说SUN的人不会比你笨.需要大多的时候会自动适应,楼上说的没有错,查找常量池中是否已经存在那个值,确实是用hash来实现的. jsp中如何构造动态sql语句 关于数组循环问题 这个关于日期的正则表达式那里写错了呢? float的7位有效数字究竟是何意? java 制作托盘 图标闪烁实现 这个错务是怎嫫回事 请问,面向对像的思想,怎样建立?怎样把面向对像的思想用在程序设计中?谢谢了 请问如何在java应用程序当中实现打印功能? 不知道有没有人用netBeans?有个问题请教。 高分求解:用java怎么扫描端口?一定给分 HashSet中重复对象问题…… 如何实现Choice中的动态添加
如果是字面值,如String name= "axman";
则先在这个入口中查找(当然JVM一启动时不会直接开CONSTAN_string_info.也是在第一次有需求的时候才会开.)
如果其中已经有"axman"这个字符串,则直接指name指向这里提供给调用者.如果没有就在CONSTAN_string_info中放入一个"axman"
的字符序列,并将name指向它.所以如果是字面值,只要字符串内容相同,最后都会指向同一对象.另外如果不是从字面值,比如String s = a_Object.toString();
这时只要调用s =s.intern();就会在池中放入这个字符序列,然后s指向它,原来在堆中那个字符串就会被回收掉.
是不是合逻辑不是你说,而是sun的实现来决定有.
有点思维的人从这句话就可以看出来:
"这时只要调用s =s.intern();就会在池中放入这个字符序列,然后s指向它,原来在堆中那个字符串就会被回收掉. "
这句话本身就说明字符串常量池不在堆中,因为如果在堆中,没有必要创建一个再销毁一个,下次相同内容只要都指向堆中那个对象就行了.常量池到底要多大,这和你没有任何关系,简单说SUN的人不会比你笨.需要大多的时候会自动适应,楼上说的没有错,查找常量池中是否已经存在那个值,确实是用hash来实现的.