代码改变世界

String的声明问题解疑

2010-11-09 00:03  Back2Earth  阅读(272)  评论(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。