==与equals()方法的不同
2015-07-22 17:42
489 查看
==比较分为两种情况:基本数据类型比较与引用数据类型比较
1.基本数据类型,根据基本数据类型的值是否相等来判断,相等则返回true,不相等则返回false。两端数据类型可以不同,如果转换后的数值相等,则也返回true
2.引用数据类型,比较引用类型变量的地址值(即引用类型变量对应的堆空间的对象实体的首地址)是否相等。
java.lang.Object@5197848c
java.lang.Object@17f052a3
java.lang.Object@5197848c
false
true
equals()比较,则只能用于引用数据类型比较
以下是Object类的equal方法的源代码:
Object类中的equal()方法比较的仍然是两个引用变量的地址值是否相等
以上比较的结果仍然是false。
而String类、包装类、File类、Date类都重写了Object类的equal()方法,此时的equal()方法比较的是两个对象的实体内容是否相同
以上代码中调用的equal()方法是java.lang.String.equals(Object anObject)方法,即String类重写后的方法,所以打印的结果是:
false
true
需要注意的是,StringBuffer类没有重写Object的equal()方法。
String类重写equal()方法的源代码如下:
所以说,以后再辨析==与equal()方法时,要分情况辨析。
一道面试题:
打印出的结果是;
false
true
为什么?
1.基本数据类型,根据基本数据类型的值是否相等来判断,相等则返回true,不相等则返回false。两端数据类型可以不同,如果转换后的数值相等,则也返回true
@Test public void test1() { int i = 65; int j = 65; char c = 65; float f = 65.0f; char a = 'A'; System.out.println(i == j); System.out.println(i == c);// char型隐式转换成int型 System.out.println(i == f);// char型隐式转换成float型 System.out.println(i == a);// char型隐式转换成int型 }以上全部是true。
2.引用数据类型,比较引用类型变量的地址值(即引用类型变量对应的堆空间的对象实体的首地址)是否相等。
@Test public void test2() { Object obj1 = new Object(); Object obj2 = new Object(); Object obj3 = obj1; System.out.println(obj1); System.out.println(obj2); System.out.println(obj3); System.out.println(obj1 == obj2); System.out.println(obj3 == obj1); }以上打印的结果是:
java.lang.Object@5197848c
java.lang.Object@17f052a3
java.lang.Object@5197848c
false
true
equals()比较,则只能用于引用数据类型比较
以下是Object类的equal方法的源代码:
public boolean equals(Object obj) { return (this == obj); }
Object类中的equal()方法比较的仍然是两个引用变量的地址值是否相等
@Test public void test3() { Object obj1 = new Object(); Object obj2 = new Object(); System.out.println(obj1.equals(obj2)); }
以上比较的结果仍然是false。
而String类、包装类、File类、Date类都重写了Object类的equal()方法,此时的equal()方法比较的是两个对象的实体内容是否相同
@Test public void test4() { String str1 = new String("aaa"); String str2 = new String("aaa"); System.out.println(str1 == str2); System.out.println(str1.equals(str2)); }
以上代码中调用的equal()方法是java.lang.String.equals(Object anObject)方法,即String类重写后的方法,所以打印的结果是:
false
true
需要注意的是,StringBuffer类没有重写Object的equal()方法。
String类重写equal()方法的源代码如下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
所以说,以后再辨析==与equal()方法时,要分情况辨析。
一道面试题:
@Test public void testTrim() { System.out.println((" String ").trim() == "String"); System.out.println((" String ").trim().equals("String")); }
打印出的结果是;
false
true
为什么?
相关文章推荐
- HDU 1714 math
- ***PHP请求服务curl以及json的解析
- Linux日常管理-复习练习
- BZOJ 1531: [POI2005]Bank notes( 背包 )
- transform应用详解
- 微信平台抽奖算法总结-再也不用怕奖品被提前抢光
- 内存管理
- Linux RedHat 6.4 MySQL5.6源码包安装
- Redis复制与可扩展集群搭建
- 傅立叶外推算法的python实现和缺点
- MSSQL数据库邮件配置
- Virtual、虚函数、指针、 引用、基类、父类
- 2015年需要了解的前端框架和语言
- 【iOS开发系列】用简单工厂模式理解OC反射机制
- 2015年需要了解的前端框架和语言
- after Normal block(#47) at 0x001D3908 错误的一次解决经历
- IP地址划分类型和子网划分
- 11111111111
- Invalid number of data directories in NT header
- debian 切换默认桌面命令