java中equals和‘==’的详解
来源:互联网 发布:怎么找手机淘宝小二 编辑:程序博客网 时间:2024/06/03 05:04
"==" 一般用于基本数据类型,它比较的是两者的值,而对于引用数据类型,"=="比较的却是两个引用 (即栈中的内容),而引用类型正真的值是放在堆中的(即new出来的对象),euqals()比较的才是堆中的值。
一、引用数据类型
看一下Object中的equals();方法:
public boolean equals(Object obj) {return (this == obj); }即比较的是实际的对象(堆中),先看一张内存存储图:
创建s1和s2,在堆中分别开辟两个空间存放,而s3 = s2 只是把s2的引用赋给s3。可得出以下结论:
s1 == s2 // false
s2 == s3 // true
s1.equals(s2) // false
s2.equals(s3) // true
所以证明了,在引用数据类型中 "==" 比较的是引用(栈)是否相同,而equals()比较的是两者实际对象(堆)是否是同一个。
二、String
接下来看一个特殊的类--String。String自身重写了equals();
public boolean equals(Object anObject) {if (this == anObject) { return true;}if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) { if (v1[i++] != v2[j++])return false;}return true; }}return false; }它是逐个字符判断,看两个字符串是否有相同的字符组成。而说到String,还要提起一个内存空间,即常量池,如图:
new 出来的对象还是放在堆中,但String s = "helloJava"; 像这种却是放在常量池中,常量池的特点是:常量池的字符串常量,不能重复出现,也就是说,在定义多个常量时,编译器先去常量池查找该常量是否已经存在,如果不存在,则在常量池创建一个新的字符串常量;如果该常量已经存在,那么新创建的String类型引用指向常量池中已经存在的值相同的字符串常量,也就是说这是不在常量池开辟新的内存。
代码测试:
public class StirngTest {public static void main(String[] args) {String str1 = "java";String str2 = "java";String str3 = new String("java");String str4 = new String("java");System.out.println( str1==str2 );//trueSystem.out.println( str1==str3 );//falseSystem.out.println( str3==str4 );//falseSystem.out.println( str1.equals(str2) );//trueSystem.out.println( str1.equals(str3) );//trueSystem.out.println( str3.equals(str4) );//true}}String 中 "==" 还是比较其引用,而equals();比较的是字符串是否一致(重写了)。
三、基本数据类型
类型 字节
===============友情链接===============
http://blog.csdn.net/sinat_32430939/article/details/70989731
0 0
- java中equals和==详解
- java中"=="和equals的区别详解
- 详解java中equals和== 的区别
- 关于java中 == 和 equals 的详解
- Java中equals和==的区别 (详解)
- Java语言中==和equals的区别详解
- java中equals和‘==’的详解
- java equals和==的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- 杭电oj-1102 Constructing Roads(最小生成树Kruskal算法)
- 一.SpringIOC深入理解
- 深度学习之模型finetuning
- 浅入浅出TensorFlow 9
- 虚函数与纯虚函数
- java中equals和‘==’的详解
- 今天,是伟大的一天 !
- [LeetCode]283. Move Zeroes
- Django_TemplateNotExist
- [代码片]同步锁内外判断
- CountDownLatch和CyclicBarrier使用示例
- 湖大C语言程序设计7
- mysql 常见分表方案
- CWnd直接派生的窗口下使用CToolBar笔记