Java之equals和==详解
两者的区别:
A:==
基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同
B:equals()
只能比较引用类型。
默认情况下,比较的是地址值是否相同,因为我们可以看源代码可以看到,在Object类中该方法的比较是用==比较的
public boolean equals(Object obj) { return (this == obj); }
。比如当我们想要比较两个引用类型的某些内容是否相等(student类中学生姓名或者年龄是否相等),这时比较地址值是没有意义的,所以我们一般会重写该方法,因为该方法是Object类中的方法,一般用快捷键重写equals方法(Alt+Shift+S)。在系统API中的类都自己重写了equals方法,所以直接调用比较的实际上是比较对象的值是否相等,而不是比较对象的地址值。而我们自己写的类。比如学生Student类等等,如果不重写equals方法,则默认是比较对象的地址值,所以要比较对象的值时候都会重写该方法。如下代码:
public class Equal { public static void main(String[] args) { Integer a1 = new Integer(10); Integer a2 = new Integer(10); System.out.println(a2.equals(a2));//true System.out.println(a1 == a2);//false System.out.println("------------"); String a = new String("ha"); String b = new String("ha"); System.out.println(a.equals(b));//true System.out.println(a == b);//false System.out.println("------------"); <span style="color:#ff0000;">Student s1 = new Student(10); Student s2 = new Student(10); Student s3 = s1; System.out.println(s1.equals(s3));//true System.out.println(s1.equals(s2));//false System.out.println(s1 == s2);//false</span> System.out.println("------------"); int s4 = 3; int s5 = 3; //System.out.println(s4.equals(s5));//会报错,equals只能比较引用类型 System.out.println(s5 == s4);//true System.out.println("------------"); String s6 = "ha"; String s7 =new String("ha"); System.out.println(s6.equals(s7));//true System.out.println(s6 == s7);//flase System.out.println("------------"); ArrayList list1 = new ArrayList(); list1.add("aa"); ArrayList list2 = new ArrayList(); list2.add("aa"); System.out.println(list1.equals(list2));//true System.out.println(list1 == list2);//false System.out.println("------------"); ArrayList list3 = new ArrayList(); list1.add("aa"); ArrayList list4 = new ArrayList(); list2.add("bb"); System.out.println(list1.equals(list2));//false System.out.println(list1 == list2);//false //==在基本类型中比较的是值,在引用类型中比较的是地址值 } } class Student { private int age; public Student(int age) { this.age = age; } //没有重写equals方法,则调用的是Object中的,默认比较地址值 }
在Student类中重写equals方法后:
<pre name="code" class="java">Student s1 = new Student(10); Student s2 = new Student(10);
s1.equals(s2);//就为true
class Student { private int age; public Student(int age) { this.age = age; } //重写equals方法 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; return true; } }
<span style="white-space:pre"> </span>Student s1 = new Student(10); <span style="white-space:pre"> </span>Student s2 = new Student(10); <span style="white-space:pre"> </span>Student s3 = s1; <span style="white-space:pre"> </span>System.out.println(s1.equals(s3));//true <span style="white-space:pre"> </span>System.out.println(s1.equals(s2));//<span style="color:#ff0000;">true</span> <span style="white-space:pre"> </span>System.out.println(s1 == s2);//false
其它的一些方法:
A:hashCode() 返回对象的哈希值,根据哈希算法计算出来的一个值,这个值和地址值有关,但不是实际地址值。
B:getClass() 返回对象的字节码文件对象
C:finalize() 用于垃圾回收,在不确定的时间
D:clone() 可以实现对象的克隆,包括成员变量的数据复制,它是在堆内存新创建了一个一模一样的对象,但是要克隆的类必须实现该Cloneable接口:实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 这个个接口是标记接口,没有方法,告诉我们实现该接口的类就可以实现对象的复制了。
Java之equals和==详解的更多相关文章
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- java.util.Scanner应用详解++扫描控制台输入
java.util.Scanner应用详解 java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java ...
- (转)java.util.Scanner应用详解
java.util.Scanner应用详解 java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java ...
- java网络编程(TCP详解)
网络编程详解-TCP 一,TCP协议的特点 面向连接的协议(有发送端就一定要有接收端) 通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...
- Java基础学习总结(24)——Java单元测试之JUnit4详解
Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
- 国际化,java.util.ResourceBundle使用详解
java.util.ResourceBundle使用详解 一.认识国际化资源文件 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以: 轻松地本地化或翻译成不同的 ...
- java之StringBuffer类详解
StringBuffer 线程安全的可变字符序列. StringBuffer源码分析(JDK1.6): public final class StringBuffer extends Abstract ...
- java.util.ResourceBundle使用详解
java.util.ResourceBundle使用详解 一.认识国际化资源文件 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以: 轻松地本地化或翻译成不同的 ...
随机推荐
- 【bzoj4570 scoi2016】妖怪
题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景. 环境对妖怪的战斗力有很大影响,在 ...
- js打印小结
<script type="text/javascript"> //打印必备参数 var hkey_root,hkey_path,hkey_key; hkey_root ...
- Tensorflow从入门到精通之——Tensorflow基本操作
前边的章节介绍了什么是Tensorflow,本节将带大家真正走进Tensorflow的世界,学习Tensorflow一些基本的操作及使用方法.同时也欢迎大家关注我们的网站和系列教程:http://ww ...
- JSSDK实现微信自定义分享---java 后端获取签名信息
一.首先说下关于微信Access_token的问题,微信Access_token分为2中: 1.授权token获取方式: 这种token需要code值(如何获取code值查看官方文档) "h ...
- Weekly Contest 75题解
Q1. Rotate String(796) We are given two strings, A and B. A shift on A consists of taking string A a ...
- mybatis添加记录时返回主键id
参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...
- Go 完整实现版本比较 VersionCompare 函数
[转] http://www.syyong.com/Go/Go-implementation-version-comparison-VersionCompare-function.html Versi ...
- python map filter reduce的优化使用
这篇讲下python中map.filter.reduce三个内置函数的使用方式,以及优化方法. map()函数 map()函数会根据提供的函数对指定序列做映射. 语法: map(function,it ...
- java线程与进程
Java线程与进程 进程与线程的关系 进程里面至少有一个线程,进程间的切换会有较大的开销 线程必须依附在进程上,同一进程共享代码和数据空间 多线程的优势 多线程可以达到高效并充分利用cpu 线程使用的 ...
- Maven实现多环境打包
在开发的过程中,经常需要面对不同的运行环境(开发环境.测试环境.生产环境.内网环境.外网环境等等),在不同的环境中,相关的配置一般不一样,比如数据源配置.日志文件配置.以及一些软件运行过程中的基本配置 ...