java == 与 equals 相同与不同点
java中与很多有意思又值得深究的点。
写这篇文章呢,是由于在百度知道中看到一个问题:怎样比较两个对象是否相同。这又使我想到了另外一个问题,== 和 equals有什么不同?写了几行代码,看了几篇文章,将见解列出来,分享。
在阐述之前请大家先看一段代码。
public class Equals {public static void main(String[] args) {Integer int1 = new Integer(1);Integer int2 = new Integer(1);String str1 = new String("Hello World");String str2 = new String("Hello World");if(int1==int2){System.out.println("int1 == int2");}if(int1.equals(int2)){System.out.println("int1 equals int2");}if(str1==str2){System.out.println("str1 == str2");}if(str1.equals(str2)){System.out.println("str1 equals str2");}} }
输出结果:
int1 equals int2
str1 equals str2
各位也都知道,java中万物皆对象。那么也有,java中所有声明出来的对象全都继承Object对象。
第一次看到这段代码的输出结果我也是很吃惊的,很奇怪啊。我奇怪的地方有两点:
1、int1和int2的值明明相等,可是却不是==,非常奇怪。
2、int1和int2明明是两个对象,可是却能equals相等,更加奇怪。
对于1,我奇怪的是==比较的是数值相等啊。可是两个明明相等的值却不想等。可是后来查了很多资料之后看到了这么一句话:
对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址;(引用,原文链接在文末)
这就很明了了,也就是说==在比较的int1和int2的时候比的对象的地址,那么分别两次new出来的对象地址自然不可能相同。
对于2,
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;}
则可以看到,在String或者Integer中都可以看到,java对Object的equals方法进行了重写都分别比较的是对象的值。所以才会有第二种结果的产生,其实仔细想想也是,总不可能没有能够正确比较的方法吧。
public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}
总结,即:
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容
原有两段话的原文地址:http://www.cnblogs.com/dolphin0520/p/3592500.html
转载于:https://www.cnblogs.com/yidiandhappy/p/6397635.html
java == 与 equals 相同与不同点相关推荐
- JAVA 中equals()与==的区别
原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...
- java的equals方法_Java Date equals()方法与示例
java的equals方法 日期类equals()方法 (Date Class equals() method) equals() method is available in java.util p ...
- java的equals方法_Java LocalDateTime类| 带示例的equals()方法
java的equals方法 LocalDateTime类equals()方法 (LocalDateTime Class equals() method) equals() method is avai ...
- java的equals方法_Java Vector equals()方法与示例
java的equals方法 向量类的equals()方法 (Vector Class equals() method) equals() method is available in java.uti ...
- java的equals方法_Java Duration类| 带示例的equals()方法
java的equals方法 持续时间类equals()方法 (Duration Class equals() method) equals() method is available in java. ...
- Java中equals()方法和==的区别分析
Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...
- Java中equals()和“==”区别
Java中equals()和"=="区别 1.对于基础数据类型,使用"=="比较值是否相等: 2.对于复合数据类型(类),使用equals()和"== ...
- Java字符串equals()
Java String equals() method is used to compare this string with the passed object as argument. Java字 ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
最新文章
- Amazon运营如何做?Amazon运营需做好全局的加减法
- json相关,浏览器打开json格式的api接口时,进行格式化,chrome插件
- 初学Java开发,这9本书值得一看
- 好文推荐 | 分布式锁用Redis好,还是Zookeeper好?
- java接口与集合_【总结】Java常用集合接口与集合类
- 实践练习四:迁移 MySQL 数据到 OceanBase 集群
- Fast Fourier Transform
- MOSS2007服务器端的安装与基本配置
- textarea统计剩余字数(动态提示)
- 百度网盘也能BT下载ED2K
- Linux下为Calibre书库打中文目录名与文件名补丁
- 链家混三个月底薪_上海链家底薪8000劝退贴
- 计算机学硕和专硕,应该怎么选?
- 【XBEE手册】ZigBee网络
- 【Redis学习05】优惠券秒杀及其优化
- request的setAttribute()用法及request.sendRedirect 与 request.getRequestDispatcher.forward 的区别
- win2003 php asp.net,Win2003下配置iis+php+mysql+zend图文 使其支持asp,.net,cgi,perl和php
- 5分钟教你做一个WebView广告过滤器
- python写一个爬虫、爬取网站漫画信息_python爬取漫画
- 股票API之----------雅虎财经频道
热门文章
- mysql内置多个数据存储引擎_一个mysql数据库,既有myisam存储引擎,又有innodb存储引擎,参数如...
- 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数
- 系统优化怎么做-Tomcat优化
- react 和 lodash 完美结合命令
- python随机生成中文字符串_利用python3随机生成中文字符的实现方法
- mapgis明码文件转为点线面文件_手机上word文档可以转为pdf文件吗?
- 微型计算机硬件的最小配置包括,职中计算机应用基础第一章测试题及答案
- 16.异常处理机制:exception
- 【Linux】34. shell脚本判断当前年份是否正确
- 【C++】17. map []操作符、insert()、emplace()