执手麦田的咖啡空间  
专注于Java的学习研究
公告
  • 于喧闹网界之中,寻一处僻静之所,与三二好友,品程序、论思想,其乐何融融!
    执手麦田的咖啡馆——在这里关注JAVA的学习研究
日历
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

留言簿(2)

随笔分类(13)

随笔档案(13)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

问题:如何理解
String str=new String("x");

String str="x";

在计算机的内存中有堆和栈两块空间,其中栈中存放所有对象、函数、变量等的饮用;而堆中存放对象、值等。
不管是new出的对象还是用类似String str = "x";这类的对象,都是放在堆中的。
举一个简单的例子:
String str1 = "x" ;
String str2 = "x" ;
String str3 = new String("x") ;
表面上看这三句回实例化3个String对象,实际上是两个。在java中有一个叫“字符数据池”的内存管理机制,在对str2赋值之前,会检查池中有没有相同的数据,如果有,则直接引用;若没有,系统会实例化这个String的对象;而执行到String str3 = new String("x") ;系统会直接实例化该对象,而不会在池中查找。也不会将这个对象放在池中。
你可能会问,如果改动str1或str2时会不会改动另外一个引用的值。答案是不会。系统会首先在池中查找有没有相同的对象,如果没有,会实例化这个对象。

补充一:
注意,对于new出来的对象则要小心。

String str3 = new String("x") ;
String str4 = new String("x") ;
System.out.println(str4==str3);
它的打印结果肯定是false;因为此时new出来的对象并不在一个位置,并不用去检查字符数据池。所以为false。
只有在执行:
System.out.println(str3.equals(str4));时其值才为true。


posted on 2007-04-25 10:58 执手麦田 阅读(309) 评论(1)  编辑  收藏 所属分类: 咖啡馆
评论:
  • # re: 关于Java中String的几个问题  家家 Posted @ 2007-04-25 11:43
    挺实用的,不错。便于理解。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
 
Copyright © 执手麦田 Powered by: 博客园 模板提供:沪江博客