黑马程序员技术交流社区

标题: String a = "java"和 String a = new Stirng("java") [打印本页]

作者: youtianlong123    时间: 2014-10-18 19:12
标题: String a = "java"和 String a = new Stirng("java")
String a = "java"和 String a = new Stirng("java")这两句有什么区别?
作者: Paul_Chang    时间: 2014-10-18 19:28
本帖最后由 Paul_Chang 于 2014-10-18 19:30 编辑

Java中的堆栈  http://blog.csdn.net/gaowenming/article/details/5316423 我也刚看到的,讲的蛮清楚
作者: 森屿北巷    时间: 2014-10-18 19:31
之前帖子画的图片。不再从新画了。
总之就是 new出来的是一个对象,“*”又是一个对象

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

无标题.png

作者: nerveva2000    时间: 2014-10-18 22:08
本帖最后由 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 。比较的是内容。(也可以理解为比较的是地址值)。




作者: 夜雪天狼    时间: 2014-10-19 08:31
nerveva2000 发表于 2014-10-18 22:08
貌似有人问过了着个问题
String a1 = "java" ,在栈内存里 将字符串“java”存储在内存中,引用变量是a1 。 ...

最后两句不对吧,==比较的是地址值,和对象数没关系,而equals比较的是字符串是否相同
作者: wf111sxwf    时间: 2014-10-19 12:44
一个是在字符串常量池中创建了一个对象,一个是在堆内存中创建了两个对象。
作者: 踏云    时间: 2014-10-19 12:53
本帖最后由 踏云 于 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方法,使其只是比较类中的字符串值,而不是对象引用





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