两者的区别:

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和==详解的更多相关文章

  1. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  2. java.util.Scanner应用详解++扫描控制台输入

    java.util.Scanner应用详解   java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java ...

  3. (转)java.util.Scanner应用详解

    java.util.Scanner应用详解   java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java ...

  4. java网络编程(TCP详解)

    网络编程详解-TCP 一,TCP协议的特点              面向连接的协议(有发送端就一定要有接收端)    通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...

  5. Java基础学习总结(24)——Java单元测试之JUnit4详解

    Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before  ...

  6. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  7. 国际化,java.util.ResourceBundle使用详解

    java.util.ResourceBundle使用详解   一.认识国际化资源文件   这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以:          轻松地本地化或翻译成不同的 ...

  8. java之StringBuffer类详解

    StringBuffer 线程安全的可变字符序列. StringBuffer源码分析(JDK1.6): public final class StringBuffer extends Abstract ...

  9. java.util.ResourceBundle使用详解

    java.util.ResourceBundle使用详解   一.认识国际化资源文件   这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以:          轻松地本地化或翻译成不同的 ...

随机推荐

  1. bzoj4896 补退选

    Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选:其中"补退选& ...

  2. BZOJ4894 天赋

    Description 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有 一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在 ...

  3. [SDOI2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  4. ●BZOJ 4698 Sdoi2008 Sandy的卡片

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4698 题解: 后缀数组,二分这个题还是比较套路的.首先依据题意,把各个串差分以后,用分割符号 ...

  5. Bubble Cup X - Finals [Online Mirror]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 组了个菜鸡队打cf上的ACM比赛 比较快做完了8题但是菜的抠脚罚时巨多,所以最后被顶到了19名(居然没出首页) 自己的号自从上次疯狂掉分就没动 ...

  6. 【Gcd】

    [题目描述] 有 n 个正整数 x1~xn,初始时状态均为未选.有 m 个操作,每个操作给定一个编号 i,将 xi 的选取状态取反.每次操作后,你需要求出选取的数中有多少个互质的无序数对. [输入数据 ...

  7. 【UOJ UNR #1】争夺圣杯

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 考虑直接对每个数字,统计它会产生的贡献. 单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等) 假设左 ...

  8. [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症

    来自FallDream的博客,未经允许,请勿转载,谢谢. 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综 ...

  9. linux tracepoint用法【转】

    转自:https://blog.csdn.net/u014089131/article/details/73907995 在kernel中经常会看到trace_XX形式的函数,但是又找不到它的定义. ...

  10. 《cocos2d-x游戏开发之旅》问题2016-10-7

    今天按书上做,遇到问题卡住了 书P115 项目是 littlerunner