java对象比较==和equals的区别
转载:http://blog.csdn.net/bluesky_usc/article/details/51849125
1值比较
即内容相同,我们就认为是相等的。比如:int i=5;int j =5;此时我们说i和j相等,其实指的是i和j的内容相同。
2引用类型比较
但在Java中,除了值类型,另外还有一种引用类型,而不同的对象,其引用值其实并不相等,即在内存中的不同的地 址单元中。比如我们定义了学生类,分别有两个学生对象实例 :
Student stu= new Student(); Student stu1= new Student();
此时我们无论是使用stu==stu1符号,或者stu.equals(stu1)方法,把两个对象进行比较,得到的结果都是不相等的,因为对于引用类型来说,默认是比较两个对象引用的地址,显示,每个对象的引用有自己唯一的地址,所以,是不相等。
有时,我们比较两个对象时,如果他们的内容一样,那么我们就认为这两个对象是相等的,如上面的两个学生对象。这时,我们该怎么办呢?其实,非常简单,只要在类里面重写equals()方法,进行对象里面的内容比较久可以了。如上面,我们只需要在Student类中重写equals()方法即可。
下面,让我们来看看实例吧! 没有重写equals()方法时的比较:
学生类:Student类
class Student
{
int num;
String name;
Student(int num,String name){
this.num=num;
this.name=name;
} public int hashCode(){
return num*name.hashCode();
} public boolean equals(Object obj){
Student s =(Student)obj;
return num==s.num && name.equals(s.name);
} public String toString(){
return num+"name:"+name;
}
}
测试类Test:
1.package com.bluesky;
2.
3.public class Test {
4.
5. public static void main(String[] args) {
6.
7. int i=5;
8. int j=5;
9.
10. if(i==j) System.out.println("i和j相等!");
11. else System.out.println("不相等!");
12.
13. Student s = new Student("BlueSky");
14. Student s1=new Student("BlueSky");
15.
16. if(s==s1) System.out.println("s和是s1相等!");
17. else System.out.println("s和是s1不相等!");
18.
19. if(s.equals(s1)) System.out.println("s和是s1相等!");
20. else System.out.println("s和是s1不相等!");
21. }
22.}
运行结果:
重写equals()方法后再次进行比较:
Student类:
package com.bluesky; 1.
2.public class Student {
3.
4. String name;
5.
6. public Student(){
7.
8. }
9.
10. public Student(String name){
11.
12. this.name=name;
13.
14. }
15.
16.
17. public boolean equals(Object obj) {
18. if (this == obj) //传入的对象就是它自己,如s.equals(s);肯定是相等的;
19. return true;
20. if (obj == null) //如果传入的对象是空,肯定不相等
21. return false;
22. if (getClass() != obj.getClass()) //如果不是同一个类型的,如Studnet类和Animal类,
23. //也不用比较了,肯定是不相等的
24. return false;
25. Student other = (Student) obj;
26. if (name == null) {
27. if (other.name != null)
28. return false;
29. } else if (!name.equals(other.name)) //如果name属性相等,则相等
30. return false;
31. return true;
32. }
33.
34.
35.}
测试类Test:
package com.bluesky; 1.
2.public class Test {
3.
4. public static void main(String[] args) {
5.
6. int i=5;
7. int j=5;
8.
9. if(i==j) System.out.println("i和j相等!");
10. else System.out.println("不相等!");
11.
12. Student s = new Student("BlueSky");
13. Student s1=new Student("BlueSky");
14.
15. if(s==s1) System.out.println("s和是s1相等!");
16. else System.out.println("s和是s1不相等!");
17.
18. if(s.equals(s1)) System.out.println("s和是s1相等!");
19. else System.out.println("s和是s1不相等!");
20. }
21.}
运行结果:
重写equals()方法后,得到s和s1相等。==对引用类型的只能进行地址比较,故还是不相等的。
java对象比较==和equals的区别的更多相关文章
- java对象POJO和JavaBean的区别
"Plain Ordinary Java Object",简单普通的java对象.主要用来指代那些没有遵循特定的java对象模型,约定或者框架的对象.POJO的内在含义是指那些:有 ...
- java中的==和equals的区别
关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...
- 【java基础 15】java代码中“==”和equals的区别
导读:昨夜闲来无事,和贾姑娘聊了聊java基础,然后就说到了这个"=="和equals的问题,我俩都是以前了解过,也常用这个,但是,昨天说到的时候,又乱了,什么比较地址值,什么判断 ...
- Java对象 POJO和JavaBean的区别
转载自https://www.jianshu.com/p/224489dfdec8 这篇博客很通俗易懂的讲明白了什么是POJO,对于刚开始学开发做java项目的菜鸟来说,很有帮助,网课老师是不会讲这些 ...
- Java中的==和equals的区别详解
1.基础知识 (1)String x = "hello"; (2)String x = new String ("hello"); 第1种方式的工作机制是,首先 ...
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- 【java基础】 == 和 equals() 的区别
==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 首先,==号在比较基本数据类型(指的值类型)时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值: int x ...
- java中等于和equals的区别
面试的时候没答上,很受打击,特写在这里. ==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同 除了String和封装器,equals()和“ ...
- Java 面试题 == 和 equals 的区别
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
随机推荐
- 【nginx】之常用命令
查看版本号: nginx -s reload :修改配置后重新加载生效 nginx -s reopen :重新打开日志文件nginx -t -c /path/to/nginx.conf 测试ngi ...
- Elasticsearch 5.2.x 使用 Head 插件连接不上集群
如果访问elasticsearch出现跨域的问题,如下: 修改elasticsearch.yml文件 vim $ES_HOME$/config/elasticsearch.yml # 增加如下字段 h ...
- Ubuntu 14.10 下安装rabbitvcs-版本控制
在Windows下用惯了TortoiseSVN这只小乌龟,到了Ubuntu下很不习惯命令行的SVN,于是经过一番寻找安装了RabbitVCS这款SVN图形化前端工具(官方网站:http://rabbi ...
- MySQL 服务启动y异常: 本地无法启动MySQL服务,报的错误:1067,进程意外终止---解决
启动MySQL后,几秒钟后直接报错了 然后在事件查看器中发现了几条错误信息 Can't start server: Bind on TCP/IP port: No such file or direc ...
- vue中使用elementUI
引入Element 因为整个项目是依赖ElementUI框架做的,所以采用了全部引入 1,在项目根目录执行命令:npm i element-ui -S进行安装 2,在main.js中引入element ...
- timeStamp(时间戳) 事件属性
Event 对象 定义和用法 timeStamp 事件属性可返回一个时间戳.指示发生事件的日期和时间(从 epoch 开始的毫秒数). epoch 是一个事件参考点.在这里,它是客户机启动的时间. 并 ...
- 提取字符串substring()
substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法: stringObject.substring(startPos,stopPos) 参数说明: 注意: 1. 返回的内 ...
- [转]Android 代码自动提示功能
源地址http://blog.sina.com.cn/s/blog_7dbac12501019mbh.html 或者http://blog.csdn.net/longvslove/article/de ...
- Scrapy学习篇(七)之Item Pipeline
在之前的Scrapy学习篇(四)之数据的存储的章节中,我们其实已经使用了Item Pipeline,那一章节主要的目的是形成一个笼统的认识,知道scrapy能干些什么,但是,为了形成一个更加全面的体系 ...
- (转)CS域和PS域
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013485792/article/details/50818356 CS域和PS域的区别: 1.基 ...