“==”与“equals”的区别之我见

一直以来老为这个问题头疼,最近亲自翻阅了各种书籍,又亲身实验。得出如下结论,如有纰漏之处,烦请各位不吝指正!

先上结论:

1、equals方法比较两个对象的内容(不能用于基本数据类型)

2、==比较两个对象是否是同一对象,或者说对象在内存中的首地址是否相同(仅在引用类型中做此功能)

java数据类型可分为两类:

1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
  他们之间的比较,应用双等号(==),比较的是他们的值。

2.复合数据类型(类) 
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址。

JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址(等同于==)。但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

至于其他复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

1)两个都是new出来的String类对象

public class Test
{

public static void main(String [] args)
{
String a=new String("abc");
String b=new String("abc");
System.out.println(a==b);
System.out.println(a.equals(b));

}
}

  结果输出为

false

true

new的话就不可能进入sting pool了,先在栈区创建一个a指针,在堆区创建一块新的内存区指向它。

由此可知,String类里==比较的是存储地址(a和b不等)。而在String类中重写的equals方法比较的只有内容。

所以前者为false,后者为true

2)没有new的String类对象

public class Test
{

public static void main(String [] args)
{
String a="abc";
String b="abc";

System.out.println(a==b);
System.out.println(a.equals(b));

}
}

 结果输出为

true

true

这里 "== "判断的是a,b 是否都指向"abc"这个字符内存池,在堆区里面的一块相同地址!s1 与 s2 引用同一个 String 对象“abc”

3)一个有new,一个没new的String对象

public class Test
{
  public static void main(String [] args)
{
String a = "abc";
String b = new String("abc");
System.out.println(a==b);
System.out.println(a.equals(b));

}
}

输出结果为:

false

true

a 指向"abc"这个字符内存池,等于创建了一个地址a(栈)--->abc(堆)

b是new出来的对象,先在栈区创建一个b指针,在堆区创建一块新的内存区指向它,等于创建了两个地址。(栈)abc--->b(堆)

==比较的是地址,a和b地址不同。所以为false

而在String类中的equals方法比较内容,所以为true

   总结来说

  1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

附:堆与栈的区别

1、栈区(stack)―   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

2、堆区(heap) ―   一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 

参考文章:http://www.cnblogs.com/FlyFive/archive/2013/01/05/2845314.html

http://www.cnblogs.com/dolphin0520/p/3592500.html

http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html

时间: 2024-10-04 10:57:34

“==”与“equals”的区别之我见的相关文章

==与equals的区别

==与equals的区别 == 可以比较基本数据类型,也可以比较引用数据类型: 比较基本数据类型,比较的是值是否相等: 比较引用数据类型,比较的是地址值是否相等 equals 只能比较引用数据类型, 默认情况下比较的是地址值是否相同: 如果相比较内容,就必须重写Object类的equals()方法

Java中字符串比较时==和equals的区别

==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同. 例如String a = "abc"; String b = "abc"; a == b返回true,a.equals(b)同样返回true,这是为什么呢? 原来程序在运行时有一个字符串池,创建字符串时会先查找池中是否有相应的字符串,如果已经存在的话只需把引用指向它即可,如果没有则新建一个. 上例中创建a时,会在字符串池中首先创建一个"abc&qu

java中,==跟equals的区别

在java中,经常有一些刚入行的新手分不清==跟equals的区别.==操作符是专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或者两个变量是否相等,只能用==操作符.如果一个变量指向的数据是对象类型,这时候就涉及了两块内存,对象本身占用已快内存,变量本身也占用一块内存,例如:Object obj = new Object();中,变量obj是一个内存,new Object();是另一个内存.此时,变量obj所对应的内存中存储的数值

Java杂谈之String----"=="与equals的区别

在程序代码的编写中,经常涉及到两个字符串的比较 这个时候一般困惑我们的是"=="和equals方法的取舍问题,实际上,只要明白了这两者 比较的区别,我们就能够正确的选择出到底采用哪种方式进行字符串的比较了 首先我们定义两个字符串 String s1 = "hello"; String s2 = new String("hello"); 这两个都建立了"hello"的字符串,但到底有什么不同呢 注意,Java中没有指针的概念,这

==和equals的区别案例+解析

什么理论也先不说,代码先给大家看下: 接下来:用一句话总结==和equals的区别 ==号比较的是内存地址 || equals()比较的是字符串的内容 解析: A ==操作符专门用来比较两个变量的值是否相同,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等       只能用==操作符. B equals方法用来比较两个独立对象的内容是否相同,两条new语句创建了两个对象,然后用s3,s4两个变量分别指向其中的一个对象,这是两个不同的对象,它们

java中的==和equals的区别

关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指正,谢谢. 在JAVA程序中一般的基本类型(值类型int,double,boolean等)都只能通过 = = 来判断值是否相等. 如:System.out.println(1==1);System.out.println(true==true);√ 不能写成System.out.println(1.

==和equals的区别

== 和 Equals 的区别 1. == 是一个运算符. 2.Equals则是string对象的方法,可以.(点)出来. 我们比较无非就是这两种 1.基本数据类型比较 2.引用对象比较 1.基本数据类型比较 ==和Equals都比较两个值是否相等.相等为true 否则为false: 2.引用对象比较 ==和Equals都是比较栈内存中的地址是否相等 .相等为true 否则为false: 需注意几点: 1.string是一个特殊的引用类型.对于两个字符串的比较,不管是 == 和 Equals 这

“==”与equals的区别

"=="与equals的区别: "==":两个对象比较的是对象的引用地址比较,对象的hashCode值是对象的引用地址,只有两个对象的hashCode值一样,此比较符才会返回true,否则即使两个对象的相同也会返回false. equals:值的比较,即基本类型的变量值一样或两个不同对象的域值一样即可返回true,否则返回false,不会比较hashCode值是否一致. 备注:String类型变量比较特殊,可以使用equals或"=="比较是否相

写这篇博客之前,我又忘了“==”和equals的区别。

没错.嘟嘟又把==号和equals 的区别给忘掉了 ==号比较基本类型的时候比的是值,比较引用类型的时候比较的是地址.equals比较基本类型的时候.... 脑子里关于这道题的答案好模糊好没有安全感 但是请相信,看完嘟嘟这篇文章保证让你记住至少一年.记不住一年算我输. 首先==号是人家java设计之初定好的,不可能改的,更何况第一句话很好理解.就硬记吧. 至于有些人说是怎么比较基本类型的(就是关于常量池,堆内存那块的东西)嘟嘟以后有缘再研究一下.毕竟面向目的编程才是嘟嘟现在的首要目标. 然后咱们