“==”与equals方法区别的深入分析
来源:互联网 发布:劲舞团淘宝代理 编辑:程序博客网 时间:2024/05/17 22:32
在正式开始之前,先来看一个有趣的程序吧:
int a = 100, b = 100;System.out.println(a == b);//(1) trueint c = 1000, d = 1000;System.out.println(c == d);//(2) trueInteger e = 100, f = 100;System.out.println(e == f); //(3) trueInteger g = 1000, h = 1000;System.out.println(g == h); //(4) false
上面的程序大家都知道(1)(2)输出的是true,这是肯定没错的!
But(3)(4)输出的也是true吗?答案是否定的,运行一下程序得到的结果是(3)为true,(4)为false!!
先来解释一下上面的原因:如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。所以如果值范围在-128-127之间,它就从高速缓存中返回实例,所以e、f就指向了同一个对象,结果返回true。这里使用缓存的理由是在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。
上面讲述了“==”,进一步联想思考和判等相似的还有一个“equals”,举例程序如下:
String str1 = new String("test");String str2 = new String("test");System.out.println(str1 == str2); //(5) false System.out.println(str1.equals(str2));//(6) true结果(5)输出false,(6)输出true!
我们知道,Java中两个比较方式,“==”与“equals”:
“==”可以用来比较两个基本类型的数值是否相等,同时如果两个引用指向同一个对象则它们也是相等的;如果两个引用指向不同的对象,即使它们的内容相同用“==”表示它们是不相等的。此时需要用equals来比较,equals方法比较两个独立对象的内容是否相同(equal比较字符串时比较的是字符序列是否相等),并且equal方法是java.lang.Object的方法,也就是所有Java类都会有的方法,它可以被程序员覆盖重写,通过自定义的方式来判断两个对象是否相等。所以(5)的结果为false,而(6)的结果为true。
(这里说明一下,Java中的基本类型有boolean,byte,short,char,int,float,double,long,Java.lang.String是final类型)
知道了“==”和“equals”的用法,我们来自己写一类测试一下刚才的说法:
class Stu{String name;Stu(){name = "";}Stu(String name, int age, int score){this.name = name;}}Stu stu1 = new Stu("Jack", 24, 100);Stu stu2 = new Stu("Jack", 24, 100);System.out.println(stu1 == stu2); // falseSystem.out.println(stu1.equals(stu2));// false
自定义一个类,然后再用“==”和“equals”比较,又发生变化了,“equals”又不起作用了啊???
查一查原因是如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法,而Object 类的 equals 方法的实现代码如下:
boolean equals(Object o){ return this==o;}
class Stu{String name;Stu(){name = "";}Stu(String name, int age, int score){this.name = name;}boolean equals(Stu stu){return this.name == stu.name;}}Stu stu1 = new Stu("Jack", 24, 100);Stu stu2 = new Stu("Jack", 24, 100);System.out.println(stu1 == stu2); // falseSystem.out.println(stu1.equals(stu2));// true结果就自然而然出来了!!!
- “==”与equals方法区别的深入分析
- equals()方法与==的区别
- ==与equals()方法的区别?
- ==与equals方法的区别
- equals()方法与==的区别
- “==”与 equals 方法的区别
- ==与equals方法的区别
- ==与equals方法的区别
- 深入了解Java中“==”与“equals”的区别
- 深入理解equals与==的区别
- 深入理解==与equals的区别
- Java中==与equals的区别(可以试下重写hashcode与equals方法)
- “==”运算符与equals方法的区别
- “==”运算符与equals()方法的区别
- C#中==与Equals方法的区别
- equals方法与"=="号的区别
- 字符串==与equals方法的区别
- Java中"=="与equals()方法的区别
- 关于向上转型与向下转型的一点个人见解
- Deep learning学习
- 2、图像灰度变换,加法减法乘法除法差异最大处理
- 一个不错的手册网址
- React服务器端渲染
- “==”与equals方法区别的深入分析
- 主从同步检查脚本
- 3、图像几何变换和差值缩放实例
- Python计算机视觉编程练习15:pyspider爬虫--json语法篇
- mysql MyISAM 转 Innodb
- Android 中 getApplicationContext()、this、getApplication()之间的区别
- JSP的option动态绑定默认值
- 原创/自译教程:并没什么卵用的移动端UI姿势(原创文章)
- android 图片叠加效果——两种方法