黑马程序员技术交流社区

标题: 11111111111 [打印本页]

作者: 肖瑞军    时间: 2011-11-9 21:59
标题: 11111111111
本帖最后由 肖瑞军 于 2013-8-27 23:28 编辑

??????????
!!??
作者: 梦女孩    时间: 2011-11-9 22:02
"abc"字符串存储的是一个对象 new String是你创建的一个实例对象
作者: 海林    时间: 2011-11-9 22:10
字符串最大的特性:一旦被初始化就不可以被改变。重赋值只是改变了引用。
接下来你看,new String("abc"); 他已经创建了一个对象了吧。
然后在给一个String类型的str赋值,他也是一种创建,就像string s1="abc";   这样内存中不就有两份String类型的对象了。
记住前面的特性就能理解了。

作者: 肖瑞军    时间: 2011-11-9 22:18
海林 发表于 2011-11-9 22:10
字符串最大的特性:一旦被初始化就不可以被改变。重赋值只是改变了引用。
接下来你看,new String("abc");  ...

能仔细讲一下它们在内存中的怎样存储的吗??分别存在哪里?两个对象之间怎样关联?
作者: 刘永昌    时间: 2011-11-9 22:22
确切的讲,你的代码里面有三个对象,两个栈内存里的引用对象s1、s2,一个对堆内存里的实例对象“abc"
look yi下测试代码
  1. class  StringTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s1="abc";
  6.                 String s2=new String("abc");
  7.                 System.out.println(s1==s2);
  8.                 System.out.println(s1.equals(s2));
  9.                 System.out.println(s1.hashCode());
  10.                 System.out.println(s2.hashCode());
  11.         }
  12. }
复制代码
s1,s2拥有的句柄是相同的都来自堆里的”abc“,看运行结果
false           
true
96354           //
96354          //这两行结果可以看出,s1,s2指向同一对象
作者: 海林    时间: 2011-11-9 22:31
说实话我并不太了解,我只阐述一下我得观点。
我认为既然是不能改变的,那他就是字符串常量,应该存放在静态内存区域中(有的成为代码块区域)。他们之间的引用是值传递,还是引用传递我就不太清楚了。但是把创建完的给了另一个后,就找不到原来的了。你在重新写一个new String("abc");也不是原来的了。
这个观点只是我从特性去理解的,并不太准确,只当参考。
作者: 肖瑞军    时间: 2011-11-9 22:37
本帖最后由 肖瑞军 于 2011-11-9 22:37 编辑
lyc 发表于 2011-11-9 22:22
确切的讲,你的代码里面有三个对象,两个栈内存里的引用对象s1、s2,一个对堆内存里的实例对象“abc"
look  ...


string s1="abc";中的“abc“存在哪里??这一句中到底有几个对象????”
作者: 刘永昌    时间: 2011-11-9 22:57
本帖最后由 lyc 于 2011-11-9 22:57 编辑
肖瑞军 发表于 2011-11-9 22:37
string s1="abc";中的“abc“存在哪里??这一句中到底有几个对象????” ...


两个,一个是栈内存中的引用对象,另一个是堆内存的实例对象
如果你的代码是String s1=null;那就只有一个对象了,就是栈内存里的,而没有堆内存里的实例对象

如果你System.out.println(s1.hashCode());运行会报错,试试看
作者: 肖瑞军    时间: 2011-11-9 23:03
本帖最后由 肖瑞军 于 2011-11-9 23:03 编辑
lyc 发表于 2011-11-9 22:57
两个,一个是栈内存中的引用对象,另一个是堆内存的实例对象
如果你的代码是String s1=null;那就只有一个 ...


嗯   我也觉得是了,第二句话string s2=new string("abc");建立“abc时检测到已经有了abc,所以s2就直接指向了原来的“abc”,所以它们的哈希码值相同。是这样吗?                                                                                                                              谢谢lyc童鞋!

作者: 刘永昌    时间: 2011-11-9 23:08
肖瑞军 发表于 2011-11-9 23:03
嗯   我也觉得是了,第二句话string s2=new string("abc");建立“abc时检测到已经有了abc,所以s2就直接 ...

:lol:lol:victory:
多写代码测试
作者: 郭学文    时间: 2011-11-9 23:19
  1. String s1="abc"
  2. 内存里会有一个对象"abc"
  3. String s2="abc"
  4. 这时候内存里依然只有一个对象,还是s1时存储的那个"abc"

  5. String s3=new String("abc");
  6. 我管你内存里存不存在一个"abc"的对象,你都得给我再创建一个"abc"对象
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2