PS:最近读Java编程思想的时候发现了一些小问题.就是equals方法和==,感觉自己是真正掌握了,其实并没有.简单的记录一下.

学习内容:

1.equals 和 == 的区别

 equals和==想必大家都很熟悉,但是是否真正的掌握了呢?还真就不好说.这个东西没有什么过多好讲的.我们通过例子来分析一下问题.

1. 基本数据类型

 先来个简单的.基本数据类型的比较.

package com.equal.test;

public class Equal {

    public static void main(String[] args) {
// TODO Auto-generated method stub
int i=3;
int i1=3;
System.out.println(i==i1);
}
}
true.

这个相对而言就非常的简单,打印台打印出来的一定是true.并且这一类的数据都只有 == 方法去比较值.而没有equals方法..没什么好说的.

2. Integer类型数据.

package com.equal.test;

public class Equal {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Integer i2 = new Integer(3);
Integer i3 = new Integer(3);
System.out.println((i2==i3)+" "+i2.equals(i3));
}
}
false true

 这样的比较大家还是明白的,使用new方法之后生成的两个对象,即使我们赋给两个对象的值是相同的,但是不一样的是我们创建了两个对象.也就是说i2和i3拿到的是两个不同对象的引用.因此在使用==方法的时候,那么会输出false,因为==比较的是两个对象之间的引用.说白了也就是比较二者的内存地址,那么很明显,二者的内存地址肯定是不相同的.所以 == 会输出false 而equals方法会输出true.

  public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}

Integer中equals方法还是非常的简单的.判断当前的对象是否为Integer对象.如果是,那么只需要比较具体的数值,如果不是,那么就会返回false.

 那么搞明白了上面这块,我们看一下这个情况.

package com.equal.test;

public class Equal {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Integer i = 3;
Integer i1 = 3;
System.out.println((i==i1)+" "+i.equals(i1)); int i4 =3;
System.out.println((i==i4)+" "+i.equals(i4));
}
}
true true
true true

 这次我们是直接使用Integer定义了两个Integer变量,但是 == 和equals方法输出的都是true.equals方法可能很容易理解.输出为true也是必然的但是 == 也输出了true.这是因为我们虽然定义了两个Integer变量,但是我们把一个常量值赋给了两个变量.那么二者拿到的是同一个对象的引用.也就是说内存地址是相同的.因此 == 方法输出为true.

第二个相对而言就非常简单了.虽然i4只是一个int类型的变量,但是在使用equals方法的时候被装箱成Integer,因此可以使用equals方法比较, ==就是先把i进行拆箱,拆成int类型的数据,然后进行比较.相对而言还是非常简单的.

3.String类型数据.

package com.equal.test;

public class Equal {

    public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "3";
String s1 = "3";
System.out.println((s==s1)+" "+s.equals(s1)); String s2 = new String("3");
String s3 = new String("3");
System.out.println((s2==s3)+" "+s2.equals(s3));
}
}
true true
false true

String类型其实和Integer基本都是相似的,原理是一样的.但是如果我们这样就觉得我们真正掌握了的话,那么来看一下下面的代码.

 我们定义了一个test类.

package com.map.test;

public class test {

    protected int number;

    public test(int n) {
// TODO Auto-generated constructor stub
this.number = n;
}
}

然后我们的测试代码如下.

public static void main(String[] args) {

        test t = new test(3);
test t1 = new test(3);
System.out.println(t.equals(t1)+" "+(t==t1));
}
false false

这里输出的全部都为false,这是为什么呢?都是对象类型,这是什么原因呢?这是因为,我们的test方法里没有重写equals方法.也就导致了,默认去使用了Object的equals方法.

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

这是Object的equals的源码.我们不难发现,比较的是两个对象是否相同,这毋庸置疑,两个test对象一定是不同的,两个对象的两个引用,内存地址自然是不一样的.这就使得equals方法和==方法是没有区别的。因此我们如果想让equals方法输出true.那么我们必须重写equals方法.

 

 

equals和==的区别 你真的掌握了吗?的更多相关文章

  1. 【ASP.net】Equals 和 == 的区别

    在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元. ...

  2. C#中 Equals和= =的区别

    C#中 Equals和= =的区别 前言:最近感觉技术进步实在是太慢,一直被游戏缠身不能自拔哈哈,但是游戏打多了真的是感觉整个人浮躁的不行,所以我现在要去游戏多写代码多看书,今天在博客园中看到一个前辈 ...

  3. Equals 和 == 的区别--转

    在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型. byte(1).sbyte(1).short(2).u ...

  4. java equals和==的区别

    大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...

  5. equals与==的区别

    equals与==的区别. 下面是equals的源码 public boolean equals(Object anObject) { if (this == anObject) { //如果两个对象 ...

  6. 【java】由equals和==的区别引出的常量池知识

    equals和==的区别,百度查到的结果大都是:equals比较的是值,==比较的是引用地址. String str1 = "abc"; String str2 = "a ...

  7. 比较compareTo与equals及==的区别

    1.compareTo: 附上:源码: public int compareTo(String anotherString) {         int len1 = value.length;   ...

  8. Java笔记——equals和==的区别

    摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...

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

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

随机推荐

  1. 双击防止网页放大缩小HTML5

    幕双击放大或缩小.即相当于这样设置 <meta name="viewport" content="width=device-width, initial-scale ...

  2. C#动态调用WCF

    public class WcfChannelFactory { public WcfChannelFactory() { } /// <summary> /// 执行方法 WSHttpB ...

  3. [Asp.net 开发系列之SignalR篇]专题四:使用SignalR实现发送图片

    一.引言 在前一篇博文已经介绍了如何使用SignalR来实现聊天室的功能,在这篇文章中,将实现如何使用SignalR来实现发送图片的功能. 二.实现发送图片的思路 我还是按照之前的方式来讲述这篇文章, ...

  4. 使用JS或jQuery模拟鼠标点击a标签事件

    <a id="alink" href="abc.aspx"  style="visibility: hidden;">下一步&l ...

  5. 让ZenCoding提升编码速度

    日前写了一篇关于VS神级插件Web Essentials的系列博客,其中在HTML&CSS操作技巧一节简单提到了ZenCoding,今天来详细说一下这个东西. 摘要 Zen Coding是一种 ...

  6. dex分包变形记

    腾讯Bugly特约作者:李金涛 一.背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败.这一问题意味着项目 ...

  7. 人人都是 DBA(I)SQL Server 体系结构

    在了解 SQL Server 数据库时,可以先从数据库的体系结构来观察.SQL Server 的体系结构中包含 4 个主要组成部分: 协议层(Protocols) 关系引擎(Relational En ...

  8. MapReduce原理与设计思想

    简单解释 MapReduce 算法 一个有趣的例子 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃? MapReduce方法则是: 给在座的所有玩家中分配这摞牌 让每个玩家 ...

  9. Wix 安装部署教程(九) --用WPF做安装界面

    经常安装PC端的应用,特别是重装系统之后,大致分为两类.一类像QQ,搜狗输入法这样的.分三步走的:第一个页面可以自定义安装路径和软件许可.第二个页面显示安装进度条,第三个页面推荐其他应用.先不管人家怎 ...

  10. Guava - EventBus(事件总线)

    Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计 ...