String的声明问题解疑
2010-11-09 00:03 Back2Earth 阅读(277) 评论(0) 编辑 收藏 举报JAVA中,String类和VB中有很多不同,和C的字符数组更有很大差别。
在这里举个例子:
public class StringTest {
public static void main(String[] args) {
String a="abc";
String b="abc";
String c=new String("abc");
System.out.println(a==b);//结果true
System.out.println(a==c);//结果false
a=a+“”;
System.out.println(a==b);//结果false
}
}
学过C/C++的同学可能会感觉十分不习惯,因为在Java里,a和b是引用,从语句来看,
是声明的两个对象,第一个结果处不应为true。但实际上Java将"abc"作为字符串常量
来处理,第一次声明a时,在堆中产生"abc",而在声明b时,则会在堆中查找"abc"这样
一个常量,如果有则令b指向它。所以本例中结果一显然是true。
那么同学们会问,为什么结果二为false呢,c不也是"abc"吗?其实不然,在Java中用
new关键字是会在堆中开辟一个新的空间,这是与直接给变量传一个字符串常量是不同
的。所以不管传给c的是何值,a都不会和c指向同一地址。
本例中结果三则向大家反映了这样一个事实。就是当给变量赋予与之前常量不同的字符串
值时,变量所指的地址也随之改变。在第三次测试中,a=a+""看似并没有改变变量的值,
但a本身是变量,不能按常量来处理,所以结果为false。如果将该句改为a="ab"+"c",
那么结果将变成true。