【J2SE快速进阶】——Java中的equals和==的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/43313353

       我们都知道,Java中数据类型大体上可分为两类:基本数据类型和引用数据类型。equals和==都是用来比较数据与数据是否“相等”。

基本数据类型的比较

       基本数据类型之间的比较用“==”,用来判断它们的值是否相等。

       示例代码:

public class Test{
	public static void main(String[] args){
		int i1=9;
		int i2=9;
		boolean b1=true;
		boolean b2=true;	
		char c1='c';
		char c2='c';
		System.out.println(i1==i2);    //输出为true
		System.out.println(b1==b2);    //输出为true
		System.out.println(c1==c2);    //输出为true
	}
}

        基本数据类型之间的比较不用equals。  

引用数据类型的比较

        引用类型之间既可用“==”来比较,又可以用equals来比较。

        用“==”来比较引用对象

        用“==”来比较引用对象的时候,比较的是他们的地址,即在栈中存放的变量值。

public class Test{
        public static void main(String[] args){
                Person p1=new Person("Danny",24);
                Person p2=p1;
                Person p3=new Person("Danny",24);
                System.out.println(p1==p2);    //输出为true
                System.out.println(p1==p3);    //输出为false
        }
}
class Person{
        public String name;
        public int age;
        public Person(String name,int age){
        this.name=name;
        this.age=age;
        }
}

         这时的内存图为:

          p1和p2都指向同一个对象,所以p1和p2中存放的地址是一样的,而“==”比较的正是他们在栈中存放的值,所以p1==p2的值为True; p3和p1指向的对象虽然一模一样,但是不是同一个对象,所以p1!=p3(或者p1==p3==false)。

         特殊情况,

         对于String和Integer来说,创建对象的方式不同,用“==”比较的结果是不同的,比如:

public class Test{
	public static void main(String[] args){
		String a1="hello";
		String a2="hello";
		String a3=new String("world");
		String a4=new String("world");
		System.out.println(a1==a2);    //输出为true
		System.out.println(a3==a4);    //输出为false
	}
}

         用equals来比较引用类型

         在基类Object中定义了equals方法,这个方法比较的也是对象的内存地址,即上例中如果把“p1==p2”换成p1.equals(p2),结果也是一样的。

         特殊情况,

         如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是比较两个变量指向的对象是否是同一个对象,这时候使用equals和使用==会得到同样的结果。

         但有些类重写了Object类中的方法,这时它比较的是所指对象的内容是否相同。比如:

public class Test{
	public static void main(String[] args){
		String a1="hello";
		String a2="hello";
		String a3=new String("hello");
		String a4=new String("hello");
		System.out.println(a1==a2);    //输出为true
		System.out.println(a3==a4);    //输出为false
		System.out.println(a1.equals(a4));    //输出为true		
	}
}
class Person{
	public String name;
	public int age;
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
}

         上面的a1和a4显然不是指向同一个对象,但它们所指对象中的内容相同,所以a1.equals(a4)的值为true。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏null的专栏

python基础知识——内置数据结构(列表)

列表是python中使用较多的一种数据结构,通常是作为函数的返回类型。相比较于元组,列表中的元素是可以修改的,可以实现添加、删除和查找的操作。 1、列表的创建 ...

34710
来自专栏互联网开发者交流社区

Java关键字final、static使用总结

1413
来自专栏牛肉圆粉不加葱

(3) - Scala case class那些你不知道的知识

除了在模式匹配中使用之外,unapply 方法可以让你结构 case class 来提取它的字段,如:

901
来自专栏吾爱乐享

java之学习Integer类相关面试题

1404
来自专栏前端正义联盟

一道 js 闭包面试题的学习

最近看到一条有意思的闭包面试题,但是看到原文的解析,我自己觉得有点迷糊,所以自己重新做一下这条题目。

3844
来自专栏鸿的学习笔记

python的对象引用

Every object has an identity, a type and a value. An object’s identity never cha...

1113
来自专栏程序生活

Java学习(二)Static关键字的理解

在讲Static之前,引入一个小题 ? 答案为“c” ? 运行结果 Cannot make a static reference to the non-stat...

3858
来自专栏静默虚空的博客

[Java 基础]方法

方法的定义 Java方法是语句的集合,它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 ...

1967
来自专栏JetpropelledSnake

Python面试题之Python中的类和实例

类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规范,从这个角度来看,在以后...

1082
来自专栏技术专栏

Python3入门与实践(四): 面向对象

==当通过 student.name获取变量值的时候,首先会查找实例变量里有没有name属性,如果有则返回,如果没有就会去类变量里找,如果还是没有则会报错==

852

扫码关注云+社区

领取腾讯云代金券