随笔-10  评论-11  文章-20  trackbacks-0
大家先来看看下面这段程序:
public class Test{
    public static void main(String args[])
{
    String str1 = "abc";
    String str = "abc;
    String str2 = new String("abc");

    System.out.println(str1 == str2);
    System.out.println(str1.equals(str2));
    System.out.println(str == str1);
}
}

这段代码的运行结果是:
第一句println输出的是false;而第二句则输出为true;但是第三句却是true。

在这里很多人会误认为第一句应该是true的,但是事实却是false。这是因为第一句在进行“==”比较的时候比较的是两个指向,而不是具体指向的内容。而第三句在进行“==”比较的时候同样比较的是指向,但是他们的指向是相同的。这种现象出现的原因和字符串在内存中实例化的时候有关。
具体情况如下图所示:

当执行第一句Str1 = "abc" 实例化出第一个指向;当进行第二句Str = "abc" 的时候出现第二个指向,因为堆内存中存在"abc",而且str也没有new一个新的对象,所以为了节省内存,str指向了str1所指向的对象;但是第三句的时候出现new语句,他实例化出了一块新的空间用来盛放"abc",自然str2的指向也也是指向这段新开辟的空间。
posted on 2010-10-23 16:25 Soap MacTavish 阅读(6054) 评论(4)  编辑  收藏

评论:
# re: String str1 = new String("abc")与 String str1 = "abc"的区别 2011-10-14 18:01 | jjavaboy
str也没有new一个新的对象,所以为了节省内存,str指向了str1所指向的对象;
这名话解决我的问题,thanks.  回复  更多评论
  
# re: String str1 = new String("abc")与 String str1 = "abc"的区别 2013-03-10 11:04 | 大的
str1,str的内容“abc”不是在栈空间吗?  回复  更多评论
  
# re: String str1 = new String("abc")与 String str1 = "abc"的区别 2015-01-23 14:39 | 顶顶顶
所以为了节省内存,str指向了str1所指向的对象, 后面对象两个字应该改为内存吧


  回复  更多评论
  
# re: String str1 = new String("abc")与 String str1 = "abc"的区别 2015-01-23 14:39 | 顶顶顶
所以为了节省内存,str指向了str1所指向的对象 后面对象应该改为内存吧  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: