1.各种数值类型对象的equals比较问题
// 各种数值类型对象的equals比较问题
// Integer型对象i
Integer i = new Integer(42);
// Long类型对象l
Long l = new Long(42);
// Double类型对象d
Double d = new Double(42.0);
// 编译报错:Incompatible operand types Integer and Long
// System.out.println(i==l);
// 编译报错:Incompatible operand types Integer and Double
// System.out.println(i==d);
// 编译报错:Incompatible operand types Long and Double
// System.out.println(l==d);
// 以下四句测试结果均为false,因为类型都不匹配,无法进行比较
System.out.println(i.equals(l));
System.out.println(i.equals(d));
System.out.println(l.equals(d));
System.out.println(l.equals(42));
// 下句测试结果为true,因为42默认是int型,因为自动打包,变成了Integer类型
System.out.println(i.equals(42));
测试结果:
false
false
false
false
true
相应源代码:
Integer类中的equals方法:
(只有相比较的两个对象都是Integer类型时,才继续进行值是否相等的比较,否则直接返回false)(20090414追加):
-》是啊,假如连类型都不一样,你还比较个啥劲啊?呵呵(20090507追加)
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
分析:
((Integer)obj).intValue()
先将被比较对象,强制类型转换成Integer类型,再使用intValue()方法求出它的值(20090414追加)。
Long类中的equals方法:
(只有相比较的两个对象都是Long类型时,才继续进行值是否相等的比较,否则直接返回false)(20090414追加):
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
2.强制类型转换问题
// 强制类型转换问题
short s1 = 1;
//Type mismatch: cannot convert from int to short
//s1 = s1 + 1;
// 解决方案:从大(int)到小(short),需要加强制类型转换
s1 = (short) (s1 + 1);
short s2 = 1;
// 这种写法没有问题,编译和运行均通过
s2 += 1;
3.不同类型的数值进行四则运算时,类型自动转换
// 不同类型的数值进行四则运算时,类型自动转换
int x = 4;
// 因为99.9默认是double类型,9和其做运算(比较),也会变成double类型,所以输出结果是9.0
System.out.println("value is " + ((x > 4) ? 99.9 : 9));
// 因为99默认是int类型,9和其做运算(比较),也会变成int类型,所以输出结果是9
System.out.println("value is " + ((x > 4) ? 99 : 9));
测试结果:
value is 9.0
value is 9
4.byte的存储范围是-128到127
// byte的存储范围是-128到127
byte b1 = (byte) 128;
// 测试结果是-128
System.out.println(b1);
byte b2 = (byte) -129;
// 测试结果是127
System.out.println(b2);
测试结果:
-128
127
5.String的equals测试:
// 同一个字符串常量,测试结果是true
System.out.println("george" == "george");
// 编译错误:The left-hand side of an assignment must be a variable
// System.out.println("george" = "george");、
// 比较的是两个字符串的内容(尽管前者是存放在数据区的字符串常量,后者是存放在堆中的字符串变量),测试结果是true
System.out.println("george".equals(new String("george")));
// 比较地址,肯定就不相等了,测试结果是false
System.out.println("george" == (new String("george")));
测试结果:
true
true
false
-》编译错误:赋值表达式的左边应该是变量。(20090507追加)