关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系。——摘自《Java编程思想》
多读几遍之后你会发现——这不就是句废话么233333.(开个玩笑不要打我)
先说 == (等于关系操作符)
当你在使用这个关系操作符的时候要注意等号的两边分别是什么
1.同种基本数据类型的比较:
这个相信大家都知道,就是值的比较,相等就true,不等就false
2.同种类型对象与对象之间比较
Integer a =new Integer(100);
Integer b =new Integer(100);
System.out.println(a==b);
输出结果自然是false,这里比较的是a,b在内存中的地址,而这两个对象的地址自然是不同的
说到这里忍不住提一笔(int 这个数据类型有个小特例),看下面代码
Integer a =200; Integer b =200;
Integer c =100;
Integer d =100; System.out.println(a==b);
System.out.println(c==d);
这个输出的是false true 原因嘛看一下源码就了解了
public static Integer valueOf(int i) { //当你输入的int值不在他规定的区间里面时,他就重新new一个对象 assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
3.引用数据类型和基本数据类型比较的时候它会将引用类型拆箱操作,进行值的比较。
int a =200; Integer b =new Integer(200); System.out.println(a==b);
结果是true
下介绍equals
1 /** 2 * 这个是jdk1.7 Integer 里面重写的equals方法 3 * 4 */ 5 6 public boolean equals(Object paramObject) { 7 if (paramObject instanceof Integer) // 如果你传的参数不是integer,直接返回false, 8 //当然如果是int型它会自动装箱成integer 9 return (this.value == ((Integer) paramObject).intValue()); 10 return false; //如果是integer型的,那就很好,直接都转成int型用==比较数值返回相应的true/false 11 } 12 /* 13 * 这个是jdk1.7 String里面equals重写方法 14 */ 15 16 public boolean equals(Object paramObject) { 17 if (this == paramObject)//如果你传的是同一个对象,这里比较的是对象 18 return true; //既然都是同一个了,自然是true; 19 if (paramObject instanceof String) {//这里就是与上面一样判断是不是同一类型,不是就返回false; 20 String str = (String) paramObject; //将传入参数的值给Str,将str分解成单个的char型数据进行单个比较,全相等就是true 21 int i = this.value.length; 22 if (i == str.value.length) { 23 char[] arrayOfChar1 = this.value; 24 char[] arrayOfChar2 = str.value; 25 for (int j = 0; i-- != 0; ++j) 26 if (arrayOfChar1[j] != arrayOfChar2[j]) 27 return false; 28 return true; 29 } 30 } 31 return false; 32 }
结论就是值的比较,当然前提是你比较的是同种类型的数据(仅这里把int和integer这样的看做一种);
转自——这么烂肯定自己写的
原文:http://www.cnblogs.com/nc1904/p/7202159.html