java equal和==的区别

今天看thinking in java , 看到讲equal和==的区别。但是了解的比较片面,只是知道equal比较内容,==比较地址。今天才发现原来Object类的equal也是用==实现的,比较的内容也是内存地址。只有那些重写覆盖了的equal方法才可能是比较的内容。

下面是找到的一些更详细的讲解,摘录下来,增强记忆。

-------------------------------------------------------------------------------------

java中的数据类型,可分为两类:

1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean

他们之间的比较,应用双等号(==),比较的是他们的值。

2.复合数据类型(类)

当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

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

public class TestString {
  public static void main(String[] args) {
 String s1 = "Monday";
 String s2 = "Monday";
 if (s1 == s2)
 {
 System.out.println("s1 == s2");}
 else{
 System.out.println("s1 != s2");}
 }
 }

编译并运行程序,输出:s1 == s2说明:s1 与 s2 引用同一个 String 对象 -- "Monday"!

2.再稍微改动一下程序,会有更奇怪的发现:

public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}

我们将s2用new操作符创建

程序输出:

s1 != s2

s1 equals s2

说明:s1 s2分别引用了两个"Monday"String对象

3. 字符串缓冲池

原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1

将s2引用s1所引用的对象"Monday"

第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?

4.再次更改程序:

public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
s2 = s2.intern();
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}

这次加入:s2 = s2.intern();

程序输出:

s1 == s2

s1 equals s2

原来,(java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。

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

时间: 2024-10-18 21:50:27

java equal和==的区别的相关文章

JAVA中equal()和==的区别

一般认为: ==比较的是基础数据的值或者是对象的引用地址 equal()比较的是对象的内容 其实: ==和equal()都是比较的引用地址,其实是栈内存中变量(包括基本数据类型的变量和对象变量)的值 equals()方法在object类中定义如下: public boolean equals(Object obj) { return (this == obj); } 但是在String.Integer.Math.Double......等这些封装类中,覆盖了Object类中的equal()方法,

java中==与equal()方法的区别

java中==与equal()方法的区别 java中==比较的是地址,equal比较的是值. 示例: 1 2 3 4 Integer a1 = new Integer(456);//实例化一个对象 Integer a2 = new Integer(456);//实例化一个对象 System.out.println(a1.equals(a2));//这里比较的是值,都是456,结果是true System.out.println(a1==a2);//这里比较的是地址,因为是2个对象,所以地址不同,

java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别 以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自己测试验证了一下.虽然网上说法很多,但是关于NoClassDefFoundError并没有给出一个样例,所以一直无法理解,索性自己验证了一下,收获还不少. ClassNotFoundException ClassNotFoundException这个错误,比较常见也好理解. 原因:就是找不到指定的cla

原码,反码,补码详解及 Java中>>和>>>的区别

前两天分析 HashMap 的 hash 算法的时候,遇见了 >> 和 >>> 这两个符号,当时查了下资料,在脑子中过了一下.今天又碰到了,没想到竟然忘了  0-0........ 我这记忆力哎,不说了.只好做个笔记,提醒自己,遇到啥不会的最好记下来,好记性不如烂博客啊~ 既然涉及到位运算,我们追本索源,就先从最基础的原码,补码和反码学起.搜了一下这方面的资料,发现一篇专门介绍这方面的文章,写的很是透彻,便直接引用过来了,原文地址是:http://www.cnblogs.co

java 和javaw 的区别——<转>

java 和javaw 的区别 javaw.exe用法和java.exe 相同 javaw的程序不在java console 上面显示任何东西,如果在开发程序,就用java,这样可以看到错误提示, 如果是运行完成了的程序,就用javaw, 可以提高一点速度 两个应用程序都能运行你的程序,并非常相似,但是有一个重要的区别,java通过控制台运行,javaw则不是. 控制台几乎是为纯文本编成的,例如如果你用javaw运行所有你打印的状态不会被打印出来.你打印在程序中的有用 信息,错误信息也是一样.

Java:集合类的区别详解

Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可变 List: 有顺序的,元素可以重复 遍历:for .迭代 排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的Lis

java,jsp,javascript的区别

在我回答你问题之前请允许我对Java语言作一个简单的介绍,你不了解这些很难和你说明白你的问题Java是一种面向对象独立于平台的安全的计算机语言,你也可以认为它是一个平台这种语言针对应用领域不同,共分为三个版本JavaSE Java平台标准版 其属于Java基础部分,用JavaSE可以开发C/S架构的桌面式应用程序JavaME Java平台迷你版 用于为嵌入式设备开发应用程序,如手机或掌上电脑的软件.游戏之类的JavaEE Java企业开发版本 用于企业级软件的开发,用JavaEE可以开发大型的B

Java ArrayList 和 LinkedList区别

ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的.对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配:而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象. 2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动:而在LinkedList的中间插入或删除一

Java JDK 版本的区别

jdk6和jdk5相比的新特性有: 1.instrumentation 在 Java SE 6 里面,instrumentation 包被赋予了更强大的功能:启动后的 instrument.本地代码 instrument,以及动态改变 classpath 等等. 2.Http有所增强 3. Java 管理扩展(JMX) 架构及其框架,以及在 Java SE 5 中新引入的 JMX API -- java.lang.management 包 4.JDK 6 中新增加编译器 API(JSR 199)