黑马程序员技术交流社区

标题: 字符串对象问题 [打印本页]

作者: 杨洋    时间: 2012-7-19 16:41
标题: 字符串对象问题
本帖最后由 杨洋 于 2012-7-19 17:04 编辑

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

结果为:false

建立“123”String对象后,在new一个“123”String对象,为什么不是同一个内存地址?

作者: 王龙彪    时间: 2012-7-19 16:46
String str1 = "123" ;
这里的"123"是在常量池中的

String str2 = new String("123") ;
这里的"123"是在堆中的,因为你使用了new,new出来的对象都在堆中放着
而 == 比较的两个 "123" 在内存中的地址,当然就不一样了.呵呵
作者: 山水游客    时间: 2012-7-19 16:49
1)栈中开辟一块空间存放引用str2;
2) 堆中开辟一块新空间存放另外一个(不同于str1所指)新建的String对象;
3) 引用str2指向另外新建的那个String对象 ;
4) str2和str1指向堆中不同的String对象,地址也不相同,输出为false;
作者: 郑明君    时间: 2012-7-19 17:03
D:\Users\v-wentli.FAREAST\Desktop

Untitled.png (4.26 KB, 下载次数: 110)

Untitled.png

作者: 姬仁贵    时间: 2012-7-19 17:42
String str1 = "123" ;
String str2 = new String("123") ;
System.out.println(str1 ==str2) ;

首先第一条语句是定义一个String 类型变量的过程,不是建立对象的过程。在栈内存中开辟一个空间用于存放str1的值。
第二条语句是一个对象建立的过程String str2 = new String("123") 当读到String str2 时在栈内存中开辟一个空间名为str2,读到new String("123")时在堆内存中开辟一个空间用于存放new String("123")里面的数据,并将这个空间的地址值赋值给str2.
第三条语句System.out.println(str1 ==str2) ;因为str1 和str2里面存放的数值是不一样的所以不能用==符号比较。

HEFCVO[V1J(Z`FJ4~ZD4H91.jpg (19.37 KB, 下载次数: 98)

HEFCVO[V1J(Z`FJ4~ZD4H91.jpg





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