大家先来看看下面这段程序:
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 阅读(6092)
评论(4) 编辑 收藏