不同于C#的Java值类型和String类型

与C#一样,java也对基本类型进行了封装,int封装出Integer类,boolean封装出Boolean类。这样一来,基本类型就突破了值类型的限制,获得了面向对象的好处。然而,与.NET不同,java中的封装类是真正的引用类型,比如在java中用“==”比较两个封装类对象,尽管值相等,得到的结果也很可能是false,而不是像.NET一样,将基本类型的一些操作符作了重载,使得“==”符号的行为看起来与基本类型完全一致。

在java中,“Integer i=10,j=10;”使得i==j为true,但如果i或者j任何一个使用“new Integer(10)”,那么i==j的值将是false,因为java遇到new关键字就会开辟新的堆空间,这样就导致两个封装类对象的引用地址不同。同样的差异还出现在String类型。对此在java中强烈推荐使用equals方法而不是“==”来比较封装类对象的值。

 

测试代码如下:

code
public class ValueType
{
    
public static void main(String[] args)
    {
        
int ii = 10, jj = 10;
        System.out.println(
"ii==jj:" + (ii == jj)); // true

        Integer i 
= new Integer(10), j = new Integer(10);
        System.out.println(
"i==j:" + (i == j)); // false
        System.out.println("i.equals(j):" + i.equals(j)); // true

        System.out.println(
"ii==j:" + (ii == j)); // true
        System.out.println("i.equals(jj):" + i.equals(jj)); //true

        String x 
= "xxx";
        String y 
= "xxx";
        String z 
= new String("xxx");

        System.out.println(
"x==y:" + (x == y)); //true
        System.out.println("x.equals(y):" + (x.equals(y))); // true
        System.out.println("x==z:" + (x == z)); // false
        System.out.println("x.equals(z):" + (x.equals(z))); // true

        System.out.println(
"x.subString(1,2):" + x.substring(1,2)); // x
    }
}

 

 

posted @ 2010-02-18 19:33  Bryan Wong  阅读(510)  评论(0编辑  收藏  举报