新手学Java(一)——Equals和“==”的区别

一句话概括:

如果操作两边都是对象句柄,就比较两个句柄是否指向同一个对象。如果两边是基本类型,则比较的就是值。

==不属于任何类,而equals则是任何类(Java中)的一个方法。

equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身);而equals()是Object的方法之一。

我们可以这样比较:

1)Primitive1(基本类型)== Primitive2(基本类型)

2)Object1 Reference1(对象引用)== Object1 Reference2(对象引用)

3)Object1 Reference1(对象引用).equals(Object1 Reference2(对象引用))

但是却不能这么比较:

Primitive1(基本类型).equals(Primitive2(基本类型))

然后下面看具体的比较

基本数据类型的值:

   int a = 4;
   int b = 4;
   System.out.println(a==b);  //True

对于基本数据类型的值只能用“==”比较运算符进行比较。

引用类型的值的比较

   Test t1 = new Test();
   Test t2 = new Test();

   System.out.println(t1==t2);          //Fasle
   System.out.println(t1.equals(t2));   //False

两句的结果都是False。

原因:

第一句:用new操作符创建的对象都会在内存中分配一个新的内存地址,所以两个对象的内存地址不同,为fasle.

第二句:必须明确equals到底比较的是对象的什么~~

看一看Object类的equals方法源码:

  public boolean equals(Object obj) {
     return (this == obj);
     }

内部使用的也是==比较的,所以equals和==在对象的比较上是一样。

那equals还有什么用?

每个对象都有自己的内存,但是每个对象也都有自己的一些属性。

比如说,马和牛都有腿,我们希望通过腿的数量来判断马和牛这两个对象是否相同。

这个时候,再使用Object类中的equals方法就不能够满足需求了。就需要通过覆盖equals的方式,建立两个对象比

较相同的具体内容。

实例如下:

  //马类
  class Horse{
	String Type;
	int Legs;

	//相等的标准,腿的数目相等
	public boolean equals(Object o){
		if(this.Legs==((Cattle)o).Legs){
			return true;
			}
			return false;
		}

	public Horse(String Type,int legs){
		this.Type=Type;
		this.Legs=legs;
		}
	}

	//牛类
	class Cattle{
		String Type;
		int Legs;

		//相等的标准,腿的数目相等
		public Cattle(String Type,int legs){
			this.Type=Type;
			this.Legs=legs;
			}

		public boolean equals(Object o){
			if(this.Legs==((Horse)o).Legs){
				return true;
				}
			return false;
			}
		}

	public class EqualsTest{
	        public static void main(String[] args){
	        Cattle c = new Cattle("I am the Cattle",4);
		Horse h = new Horse("I am the Horse",4);
		if(c.equals(h)){
			System.out.println(c.Type);
			System.out.println(h.Type);
			System.out.println("Cattle Equals Horse");
			}
		}
	}	

最终的结果:

"I am the Cattle"

"I am the Horse"

"Cattle Equals Horse"

通过上面这个用equals方法将风马牛不相等的事物变得相等,我们可以看出,其实对象是否相等,取决于用户的需

求。我们定义什么样的标准,计算机就会踏踏实实的为我们实现。

所以,在用Java的类描述对象的时候,如果要判断该对象是否相同时,通常都会覆盖equals方法,建立根据该对

象特征进行比较相同的依据。

时间: 2024-12-25 12:05:47

新手学Java(一)——Equals和“==”的区别的相关文章

新手学JAVA(三)----StringBuilder类

上一篇文章新手学JAVA(二)----String类与StringBuffer类的区别中了解到,String的值是不可变的,这就导致 每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变 类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象. StringBuffer类和StringBuilder类功能基本相似.算是两个双胞胎. 下面主要说两点 第一点  线程安全 StringBuffer  线程安全

【经验分享】新手学Java编程语言怎么入门?

新手学Java编程语言怎么入门?掌握语言基础是第一步,了解java基础知识,Java关键字.核心概念或者基本编码技术.掌握操作符.控制执行流程.访问权限控制.复用类.多态.接口.字符串.泛型.数组.容器深入研究.JavaI/O系统.枚举类型.并发以及图形化用户界面等内容. 为了帮助大家更轻松的学好java开发,给大家分享一套java开发学习资料,小编推荐一个学java开发技术的学习裙:三七四三二零二八二,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干

【转】Java中equals和==的区别

[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,

java中equals和==的区别 (转)

java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同. equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同.  ==比较的是2个对象的地址,而equals比较的是2个对象的内容. 显然,当equals为true时,==不一定为true: 一.String中

java 笔记 == , equals , hashcode()的区别

== , equals , hashcode()的区别: 基本数据类型:比较用==, 比较他们的值 复合数据类型:用==比较时,比较的是它们在内存中存放的地址,除非是同一个new出来的对象,他们的比较后果为true,否则为false. object基类中定义了equals()方法,它的初始行为是比较它们的内存地址(就是和==功能一样),但在有些类库中覆盖了,比如String类的equals()方法是比较它们的内容.equals()方法在object类中定义如下:   public boolean

新手转行学java难吗?新手学java需要注意的6个方面!

新手转行在成都学java到底难不难,对于这个问题,我们专门做过一个调查,超过1000名已经在职的java从业者,其中有80%的程序员觉得学java不难,20%的程序员觉得前期有点难,其中对于50%自学的新手认为java很难学,遇到问题没人解答,又或者是答案太多,根本不知道哪个回答是正确的.所以,我们得出结论,能系统学习的,有老师指导的java课程学起来相对容易,而没有人指导,仅仅靠看视频学习的同学来说会无形中增加难度. 很多新手在准备转行学习java之前,在网上看到或听到很多不懂的人会说,jav

关于java中equals与==的区别的小实验

java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的是二者是都为同一对象,是一种操作符. 做了几个小实验比较结果. 实验一: String str1="ab": String str2="ab": System.out.println(s1==s2)://trueSystem.out.println(str1.equals(str2));//true 这里的str1与str2都指向了常量池中的同一对象,所以S

Java 中 Equals和==的区别

equals和==的区别 equals方法最初是在所有类的基类Object中进行定义的,源码是 1 2 3 public boolean equals(Object obj) {     return (this == obj);     } 由equals的源码可以看出这里定义的equals与==是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String.Integer等类)对equals进行了重写,但是没有对equals进行重写的类(比如我们自己写的类)就只

新手学JAVA(二)----String类与StringBuffer类的区别

在Java中有两种字符串的操作:String类和StringBuffer类(缓冲字符串处理类). 下面先简单的说一下两者的区别. String类和StringBuffer类都提供了相应的方法实现字符串的操作,但二者略有不同. (1) String类 该类一旦产生一个字符串,其对象就不可变.String类的内容和长度是固定的.如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现.虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成一个新的实例.系统为Stri