A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肖瑞军 黑马帝   /  2011-11-9 21:59  /  2182 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 肖瑞军 于 2013-8-27 23:28 编辑

??????????
!!??

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

10 个回复

倒序浏览
"abc"字符串存储的是一个对象 new String是你创建的一个实例对象

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
字符串最大的特性:一旦被初始化就不可以被改变。重赋值只是改变了引用。
接下来你看,new String("abc"); 他已经创建了一个对象了吧。
然后在给一个String类型的str赋值,他也是一种创建,就像string s1="abc";   这样内存中不就有两份String类型的对象了。
记住前面的特性就能理解了。

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
海林 发表于 2011-11-9 22:10
字符串最大的特性:一旦被初始化就不可以被改变。重赋值只是改变了引用。
接下来你看,new String("abc");  ...

能仔细讲一下它们在内存中的怎样存储的吗??分别存在哪里?两个对象之间怎样关联?
回复 使用道具 举报
确切的讲,你的代码里面有三个对象,两个栈内存里的引用对象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指向同一对象
回复 使用道具 举报
说实话我并不太了解,我只阐述一下我得观点。
我认为既然是不能改变的,那他就是字符串常量,应该存放在静态内存区域中(有的成为代码块区域)。他们之间的引用是值传递,还是引用传递我就不太清楚了。但是把创建完的给了另一个后,就找不到原来的了。你在重新写一个new String("abc");也不是原来的了。
这个观点只是我从特性去理解的,并不太准确,只当参考。
回复 使用道具 举报
肖瑞军 黑马帝 2011-11-9 22:37:29
7#
本帖最后由 肖瑞军 于 2011-11-9 22:37 编辑
lyc 发表于 2011-11-9 22:22
确切的讲,你的代码里面有三个对象,两个栈内存里的引用对象s1、s2,一个对堆内存里的实例对象“abc"
look  ...


string s1="abc";中的“abc“存在哪里??这一句中到底有几个对象????”
回复 使用道具 举报
刘永昌 黑马帝 2011-11-9 22:57:22
8#
本帖最后由 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:11
9#
本帖最后由 肖瑞军 于 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:03
嗯   我也觉得是了,第二句话string s2=new string("abc");建立“abc时检测到已经有了abc,所以s2就直接 ...

:lol:lol:victory:
多写代码测试
回复 使用道具 举报
  1. String s1="abc"
  2. 内存里会有一个对象"abc"
  3. String s2="abc"
  4. 这时候内存里依然只有一个对象,还是s1时存储的那个"abc"

  5. String s3=new String("abc");
  6. 我管你内存里存不存在一个"abc"的对象,你都得给我再创建一个"abc"对象
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马