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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jsfjb 中级黑马   /  2012-12-10 10:57  /  2154 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str2 = new String("abc");
变量str2在内存中是两个对象。我怎么证明它是两个对象。同志们别给我回答,双引号引起的abc已经是一个对象了。new又是一个对象了。

String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1.hashCode() == str2.hashCode());

因为输出是true 所以我说它是一个对象。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

12 个回复

倒序浏览
String str1 = "abc";执行这句代码时,内存中就会有一个字符串“abc”;在执行这句代码时String str2 = new String("abc"),虚拟机就会先检查字符串缓冲区中有没有“abc”这个内容,如果有,就不会创建新的,直接复用了,只是字符串特有的一种机制。   

String str1 = "abc";
String str2 = new String("abc");
这两句话的内容在内存中就是一个,只是他们的引用不相同吧!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
yingying 发表于 2012-12-10 11:06
String str1 = "abc";执行这句代码时,内存中就会有一个字符串“abc”;在执行这句代码时String str2 = new ...

您的意思是 这是 一个对象了?
回复 使用道具 举报
    String str2 = new String("abc");执行时会创建两个或一个对象,”abc”对应一个对象,这个对象放在字符串常量缓冲区,常量”abc”不管出现多少
遍, 都是缓冲区中的那一个,即内存中仅存放一份该字符串变量。 new String() 每执行一遍, 就创建一个新的对象,new String("abc")用到常量”abc”对象的
内容来创建出一个新 String 对象。如果以前内存中已经存在"abc"字符串常量,执行new String("abc")时就不会创建”abc”对象了,直接从缓冲区拿。
回复 使用道具 举报
jsfjb 发表于 2012-12-10 11:31
您的意思是 这是 一个对象了?

还是两个对象,一个对象是内容“abc”,另一个对象是地址,你看看毕老师的视频 记得他讲了
回复 使用道具 举报
吴健 发表于 2012-12-10 12:23
String str2 = new String("abc");执行时会创建两个或一个对象,”abc”对应一个对象,这个对象放在字 ...

直接从缓冲区中拿了的话,也就是只有一个对象了呗。还是没听明白。
回复 使用道具 举报
刘 佳 中级黑马 2012-12-16 10:48:17
7#
String类重写了hashCode()方法,我画了张图给你,看看吧,也许会懂

无标题.jpg (32.36 KB, 下载次数: 93)

无标题.jpg
回复 使用道具 举报
刘 佳 中级黑马 2012-12-16 10:56:21
8#
你可以用==号验证。 ==在基本数据类型中比较值。在引用类型对象比较的是地址。
回复 使用道具 举报
从官方文档显示:
String str = "abc";
等效于:
     char data[] = {'a', 'b', 'c'};
     String str = new String(data);

所以:
String str1 = "abc";   -->  st1 = new String("abc");
String str2 = new String("abc");
回复 使用道具 举报
"=="基本上比较的是值,这里是变量值
"equal"比较的是对象内容
回复 使用道具 举报
博主使用的hashcode()返回的是对象存储物理地址
对象都是同一个所以返回时true
只是引用类型变量不同
回复 使用道具 举报
哈哈,终于找到知音了——有问题,来黑马论坛,高手如云的地方,各抒己见的的地方。呵呵
回复 使用道具 举报
相见恨晚啊!!!:'(:'(:'(
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马