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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String a = "java"和 String a = new Stirng("java")这两句有什么区别?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 Paul_Chang 于 2014-10-18 19:30 编辑

Java中的堆栈  http://blog.csdn.net/gaowenming/article/details/5316423 我也刚看到的,讲的蛮清楚
回复 使用道具 举报
之前帖子画的图片。不再从新画了。
总之就是 new出来的是一个对象,“*”又是一个对象

无标题.png (70.04 KB, 下载次数: 61)

无标题.png
回复 使用道具 举报
本帖最后由 nerveva2000 于 2014-10-18 22:11 编辑

貌似有人问过了着个问题
String a1 = "java" ,在栈内存里 将字符串“java”存储在内存中,引用变量是a1 。
String a2 = new Stirng("java"),在堆内存中new一个新对象,将这个对象的地址引用给a2,并创建字符串“java”赋给new的对象。

String a1 = "java" 在内存总有一个对象,“abc”。  
String a2 = new Stirng("java")在内存中有两个对象,分别是 new 和 “abc”。


a1==a2  结果为 false。比较的是对象数

a1.eauqls(a2) 结果为ture 。比较的是内容。(也可以理解为比较的是地址值)。



回复 使用道具 举报
nerveva2000 发表于 2014-10-18 22:08
貌似有人问过了着个问题
String a1 = "java" ,在栈内存里 将字符串“java”存储在内存中,引用变量是a1 。 ...

最后两句不对吧,==比较的是地址值,和对象数没关系,而equals比较的是字符串是否相同

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
一个是在字符串常量池中创建了一个对象,一个是在堆内存中创建了两个对象。
回复 使用道具 举报
踏云 中级黑马 2014-10-19 12:53:59
7#
本帖最后由 踏云 于 2014-10-19 13:02 编辑

楼上说的或是不是从运行机制说,或是说错了,我总结一些我所学到的String运行机制。
String a=“java”; 这种属于直接赋值,直接赋值的对象都是在字符串常量池中建立的,字符串常量池位于内存的方法区中是一个共享的区域。
字符串常量池的字符串是唯一的,也就是String a=“java”;String b=“java”;所引用的是同一个字符串对象。
String a="字符串";运行时,先查看字符串常量池中有没有“字符串”这个字符串变量,如果没有创建一个返回,如果有直接返回地址

而String a=new String(“java”);会有两个步奏,就是先到字符串常量池中检查有没有,如果没有就创建一个,第二步是在内存堆中创建一个String类型的对象,然后赋值为“java”,最后返回new的对象的地址(java原则:凡是调用到new创建的对象都在内存堆中创建一个)

所以,String a=“java”;与String b=new String(“java”);两个所指的对象是不同的,一个再方法区一个再内存堆。
而String a=“字符串”;String b=“字符串”;因为都在字符串常量池中(只有一个“java”的字符串对象),所以指向的对象相等


String a=new String(“java”);String b=new String(“java”);两个不是指向同一对象的,他们new了两个对象。所以不相等
而有人想问为什么a.equals(b);返回true,那是因为String类重写了Object类的equals方法,使其只是比较类中的字符串值,而不是对象引用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马