equals和==的区别 你真的掌握了吗?
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和==的区别 你真的掌握了吗?的更多相关文章
- 【ASP.net】Equals 和 == 的区别
在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元. ...
- C#中 Equals和= =的区别
C#中 Equals和= =的区别 前言:最近感觉技术进步实在是太慢,一直被游戏缠身不能自拔哈哈,但是游戏打多了真的是感觉整个人浮躁的不行,所以我现在要去游戏多写代码多看书,今天在博客园中看到一个前辈 ...
- Equals 和 == 的区别--转
在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型. byte(1).sbyte(1).short(2).u ...
- java equals和==的区别
大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...
- equals与==的区别
equals与==的区别. 下面是equals的源码 public boolean equals(Object anObject) { if (this == anObject) { //如果两个对象 ...
- 【java】由equals和==的区别引出的常量池知识
equals和==的区别,百度查到的结果大都是:equals比较的是值,==比较的是引用地址. String str1 = "abc"; String str2 = "a ...
- 比较compareTo与equals及==的区别
1.compareTo: 附上:源码: public int compareTo(String anotherString) { int len1 = value.length; ...
- Java笔记——equals和==的区别
摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
随机推荐
- week 4 日志
周一 上上个星期感冒,上个星期看完奇幻森林后痔疮发作,打了整整一礼拜的针,有点背.. 今天看了 css知多少(6)——选择器的优先级 http://www.cnblogs.com/wangfupeng ...
- Linux之源码包安装软件
安装准备 安装c语言编辑器 gcc 压缩包 node-v6.2.0-linux-x64.tar.gz 源码包保存位置 /usr/local/src/ 源码包安装位置 /us ...
- Blend 2015 教程 (二) 样式
前一篇讲述了如何在新Blend中完成一个简单的带数据绑定的界面小例子,本篇将讲述一下,把View层和Style层分开,并搭建Style层框架的方法,并进行细节样式修改. 1. 在解决方案资源管理器面板 ...
- [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst
一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...
- HTML5 WebStorage
WebStorage是HTML5中本地存储的解决方案之一,在HTML5的WebStorage概念引入之前除去IE User Data.Flash Cookie.Google Gears等看名字就不靠谱 ...
- 01- Shell脚本学习--入门
简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说有多少 ...
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性
Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性 项目分离从独立的se ver Run mode from brow ex to ...
- APP性能测试
方法一: 本地安装安卓模拟器,用LR选择模拟器录制方式录制 方法二: 手机真机需要root,可以在电脑上下载一键root工具(如卓大师),然后手机和电脑用数据线连接,然后root. 在手机上运行 Mo ...
- javascript类型系统——数组array
× 目录 [1]创建 [2]本质 [3]稀疏[4]长度[5]遍历[6]类数组 前面的话 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javascript中的数组与 ...