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实际是对象的引 ...
随机推荐
- Hard commits, soft commits and transaction logs
“Hard commits are about durability, soft commits are about visibility“ Transaction Logs 首先介绍下solrcl ...
- MFC如何在有界面的应用程序中开启控制台窗口
在有界面的应用程序中开启控制台窗口有时候非常有用,尤其是在调试多线程应用程序中,由于通过断点的方式调试程序时会导致线程挂起从而导致各种难于预料的结果.这时候就可以通过开启控制台窗口往窗口输出信息来查看 ...
- bzoj5050: 建造摩天楼
Description 属于小Q管辖的n座摩天楼从左往右排成一排,编号依次为1到n,第i座摩天楼的高度为h_i.小Q会进行m次以下两种 操作之一: 2 l r,询问h_l+h_{l+1}+...+h_ ...
- QLExpress 规则引擎使用介绍
一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用.让业务规则定义简便而不失灵活.让业务人员就可以定义业务规则.支持标准的JAVA语法,还可以支持自定义操作符号.操作符号重载. ...
- [转]Android 代码自动提示功能
源地址http://blog.sina.com.cn/s/blog_7dbac12501019mbh.html 或者http://blog.csdn.net/longvslove/article/de ...
- get和post的解析
get 直接获取数据 post 将数据发送到服务端缓存下来,当无法缓存数据或用户输入未知字符时用post, get:常用于数据 post:不想缓存数据,不再浏览器中缓存数据,在服务端可以,因为取数据及 ...
- go语言学习--map中键值得删除
测试 map1 中是否存在 key1: 在例子 8.1 中,我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1.如果 map 中不存在 key1,val ...
- ROS-MikroTik-RouterOS-培训认证各种证书
官方原文: https://mikrotik.com/training/about MikroTik certified training programs MTCNA - MikroTik Cert ...
- Jmeter(三十九)User.Properties定义全局变量
“烟”从物质上满足吸烟者对尼古丁的依赖,但“烟”更从精神上满足了人们对“思想”的欲望---在抽烟的时刻,每个男人都可能成为思想家. ---<冲突> 前面有记到jmeter读取外部文件内容的 ...
- Jmeter(十六)Logic Controllers 之 Runtime Controller
Runtime Controller-----运行时间控制器:控制其下的Sampler运行时间. 该控制器较为简单,官方文档也没作太多说明.照着Blazemeter写个例子: 运行,查看结果. 可以看 ...