Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144153
  • 博文数量: 66
  • 博客积分: 1571
  • 博客等级: 上尉
  • 技术积分: 715
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:55
文章分类

全部博文(66)

文章存档

2012年(66)

我的朋友

分类: Java

2012-07-10 14:16:48

    虽是老帖,本人确是第一次接触

    "xyz "作为一个常量字符串首先被创建,它被保存在串池中。所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在 "xyz "这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。 
    当然,使用new   String也创建了一个对象, "xyz "作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的 "xyz "内容一致!

    首先你要理解constant   pool,   这是一个特殊的共享区域,literate,   Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。 如果你用了String   s   =   new   String( "xyz "); 那么,会有两个String被创建,一个是你的ClassCLassLoader加载时,你的 "xyz "被作为常量读入,在constant   pool里创建了一个共享的 "xyz " 然后,当调用到new   String( "xyz ")的时候,会在heap里创建这个new   String( "xyz "); 

    但是如果你把String   s   =   new   String( "xyz ").intern(); 那么具体过程变成,现在heap里创建一个String,   然后调用intern()方法,发现constant   pool里存在 'xyz ',然后就会返回constant   pool内对象的引用,稍后heap里的就not   reachable了,会被gc,最终VM里只有一个 "xyz

 

        所以一个在heap中,一个在String常量池。

 

阅读(1652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~