Java中类型区别、Java中equals()方法和"=="的比较

通过对很多篇网络博客的内容以及课件内容的整理,针对基本数据类型和对象数据类型,两种比较相同的方法总结为一张图表

知其然知其所以然,下面就我目前对Java的了解,对上图进行解释。

Java中数据类型可大致分为两种:基本数据类型和对象。

Java所谓“面向对象编程”,实际上其中的“对象”是不包含八种基本类型的数据的。

基本数据类型和对象,本质上的区别在于存储位置的不同:

  基本数据类型(int、long、char等)存储在栈中,意思是int a = 10中标志a和数值10都是放在栈内存中的。

  而对象类型(例如class Person)存储在堆和栈中,意思是String a = "10";中标志a存在栈内存中,它只是数据“10”的一个索引,而真正的数值“10”是存放在栈内存中的。

Java这样的设计可能是为了运行效率,栈内存位于L1 Cache中,堆内存位于L2 Cache中,访问速度是相差很多的。

 

下面举例子来具体说明“==”和equals()的区别:

对于“==”,这里为例1:

  int a = 10;

  int b = 10;

这里a和b只是两个标志,而其中的数值10是存放在栈中的,此时a==b的结果为true,因为==的作用是比较栈内存中二者的数据是否相等

同理,例2:

  String a = "hello";

  String b = "hello";

a和b的内容同样都存在栈内存中,直接a == b的结果是为真的。

下面来讨论对象类型(Object):

Java中的Object类是自带equals()方法的,这也是为什么int等基本类型没有equals()这一方法(因为基本类型不具备此方法)。

对于例3:

  Person a = new Person("zhangsan" , "male");

  Person b = new Person("zhangsan" , "male");

Person是对象类型,例子里面a和b都只是一个索引,两个索引存放在栈内存中;而他们真正的内容——各自的姓名和性别,是存放在堆内存中的。

上面说过,==比较的是栈内存中的数据,显然两者不相等,因此a==b的结果为false。

equals()方法对于对象类型来说,默认为引用"=="方法,即

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

所以此时使用a.equals(b),得到的结果还是false。

但equals()是一种方法,它是可以重写的。事实上,Java中最常见的String类型下的equals()方法是默认已被重写的。

举例说明,例4:

  String a = new String("hello");

  String b = new String("hello");

a和b同样只是索引,存放在栈内存中;内容"hello"和"hello"存放在堆内存中,而且是两个不同的位置。

此时使用a.equals(b)得到的结果为true,因为String类下的equals()方法已被重写为关于二者在堆内存中的内容的比较。即

可以将String看作Object类中在equals()方法下的特例


 

posted @ 2021-07-06 11:04  御用马铃薯  阅读(128)  评论(0)    收藏  举报