转载: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的区别的更多相关文章

  1. java对象POJO和JavaBean的区别

    "Plain Ordinary Java Object",简单普通的java对象.主要用来指代那些没有遵循特定的java对象模型,约定或者框架的对象.POJO的内在含义是指那些:有 ...

  2. java中的==和equals的区别

    关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...

  3. 【java基础 15】java代码中“==”和equals的区别

    导读:昨夜闲来无事,和贾姑娘聊了聊java基础,然后就说到了这个"=="和equals的问题,我俩都是以前了解过,也常用这个,但是,昨天说到的时候,又乱了,什么比较地址值,什么判断 ...

  4. Java对象 POJO和JavaBean的区别

    转载自https://www.jianshu.com/p/224489dfdec8 这篇博客很通俗易懂的讲明白了什么是POJO,对于刚开始学开发做java项目的菜鸟来说,很有帮助,网课老师是不会讲这些 ...

  5. Java中的==和equals的区别详解

    1.基础知识 (1)String x = "hello"; (2)String x = new String ("hello"); 第1种方式的工作机制是,首先 ...

  6. java中hashcode和equals的区别和联系

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  7. 【java基础】 == 和 equals() 的区别

    ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 首先,==号在比较基本数据类型(指的值类型)时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值: int x ...

  8. java中等于和equals的区别

    面试的时候没答上,很受打击,特写在这里. ==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同 除了String和封装器,equals()和“ ...

  9. Java 面试题 == 和 equals 的区别

    int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...

随机推荐

  1. Ubuntu16.04 LTS软件中心闪退及修改阿里源

    现象: 进入软件中心点击任意,直接退出 解决办法: 先更换软件源,我的为阿里云 1. 备份 源位置 :/etc/apt/sources.list 2. 更改 sudo vi /etc/apt/sour ...

  2. 关于Javascript闭包(Closure)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  3. 【redis】之centos6.x安装redis3.0.x

    centos6.9_x86_64 1.下载redis安装包 http://download.redis.io/releases/redis-3.2.9.tar.gz 2.解压 编译到指定得目录 mak ...

  4. CentOS7切换到root用户和退回普通用户

    切换成root用户: sudo su - 退出root用户并切换回普通用户: exit

  5. js中事件三阶段

    js中事件三阶段 先贴代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  6. rsync数据备份

    scp远程复制 scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 命令格式: scp local_file remote_username@ ...

  7. dubbo协议下的单一长连接与多线程并发如何协同工作

    上班的路上突然就冒出了这么个问题:既然在dubbo中描述消费者和提供者之间采用的是单一长连接,那么如果消费者端是高并发多线程模型的web应用,单一长连接如何解决多线程并发请求问题呢? 其实如果不太了解 ...

  8. Android中Handler.removeCallbacksAndMessages(null)的作用

    众所周知,在Android开发中会大量使用到Handler.但是,由于与activity生命周期不一致,当一个Activity被销毁时,如果Handler对象有Message在排队,则无法释放,进而导 ...

  9. C#对windows的IP网络测试(ping ip)

    private string CmdPing(string strIp) { Process p = new Process(); //设定程序名 p.StartInfo.FileName = &qu ...

  10. SqlServer存储过程输出参数

    if exists(select 1 from sysobjects where name='P_PreOrderInfo') drop Procedure P_PreOrderInfo go Cre ...