不同于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方法而不是“==”来比较封装类对象的值。
测试代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
}
}
{
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
}
}