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使用详解 一.认识国际化资源文件 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以: 轻松地本地化或翻译成不同的 ...
随机推荐
- [USACO09DEC]牛收费路径Cow Toll Paths
跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费. 农场中 ...
- GotoAndPlay
10月3日,在杭州市西湖景区,一只小松鼠不停地接受一道道食物,花生.玉米.饼干,可谓来者不拒,憨态可掬的模样吸引了众多围观者...Description 小松鼠终于吃撑了,她决定逃离这个地方. 我 ...
- [APIO2016]划艇
题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 NNN 个划艇学校,编号依次为 111 到 NNN.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇 ...
- 【以2-SAT为主题的婚礼UVA11294】
·新娘头饰复杂,这个婚礼怪异非凡. ·英文题,述大意: 婚宴上,有一个很长的桌子.桌子两边坐人(即人们坐成两排).新娘坐在其中一排,只能看见桌子对面所有的人.输入的m表示有m对人打过架. ...
- Codeforces #Round 406(Div.2)
来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------- 大家好,我是一个假人.在学习O ...
- Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)
在线教育平台项目演示地址 项目部署教程 1.1.工作原理介绍 django 一个基于python的开源web框架 uwsgi 一是一个web服务器,也可以当做中间件 nginx 常用高性能代理服务器 ...
- solr6.6初探之主从同步
1.关于solr索引数据同步 通常情况下,单节点部署的solr应用很难在并发量很大的情况下"久存",那么多节点部署提高Solr应用的负载量和响应时间势在必行. solr索引同步有以 ...
- 【iOS】苹果开发者账号申请
[1]首先登陆苹果开发者中心:https://developer.apple.com/programs/ 如图有一个按钮enroll,意思是苹果开发者报名(说白了就是要交钱,好让你具备APP测试和上线 ...
- C语言程序设计第六次作业--循环结构2
(一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...
- Cisco banner 登陆消息提示设置命令详解
从法律角度来看,登陆消息非常重要.当入侵者进入网络而没有受到适当的警告时,他们有可能赢得官司.在放置登陆消息之前应让律师检查下,永远不要使用"欢迎"等问候语,以免被误解为邀请大家使 ...