Java中==与equals的区别
来源:互联网 发布:堆优化的dijkstra 编辑:程序博客网 时间:2024/05/29 00:34
表面看都是判断两个“值”是否相等,其实不然
1、==:用来判断两个变量的值是否相等,即两个对象在内存中存储的值是否相等,内存中的值相等,那么内存的首地址就要相等,要比较两个基本类型的数据或两个引用变量是否 相等,只能用==操作符;
2、equals:用来判断两个独立对象的内容是否相等,即不管你在内存里是怎么存的,只要内容相同就相等,字符串的比较基本上都是使用equals方法。
1)、Object的equals源码分析:
从下面代码可以看出,Java基类中equals就等于==
public boolean equals(Object obj) { return (this == obj);}
2)、Integer的equals源码分析:
从下面代码中可以看出,对于基本数据类型,如果一个对象是该基本数据类型,并且他们在内存中的值相等,则他们equals。
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false;}
3)、String的equals源码分析:
从下面的代码中可以看出,对于一个独立对象,可以自己实现自己的equals方法,在Sting里,如果两个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; }
4)、自定义的equals方法:
下面的内容,只要输入的内容有一个字符与zhangsan中的字符相同就相equals。
public class EqualsTest {String name = "zhangsan";public static void main(String[] args) {EqualsTest et = new EqualsTest();System.out.println(et.equals("白z白"));}@Overridepublic boolean equals(Object obj) {if (this.name == obj) {return true;}if (obj instanceof String) {String objStr = (String) obj;for (int i = 0; i < this.name.length(); i++) {for (int j = 0; j < objStr.length(); j++) {if(this.name.charAt(i)==objStr.charAt(j)){return true;}}}}return false;}}
3、例子分析:
public class EqualsTest {public static void main(String[] args) {System.out.println("1="+(aStr==bStr));System.out.println("2="+(aStr.equals(bStr)));String cStr ="foo";String dStr ="foo";System.out.println("3="+(aStr==cStr));System.out.println("4="+(cStr==dStr));System.out.println("5="+(cStr.equals(dStr)));}}
输出结果分析:
1=false:因为在内存中存在两个foo,所以肯定首地址不同;
2=true:因为他们内容是相同的;
3=false:因为aStr是new出来的,那么每次他所在内存和其他任何一个不同;
4=true:其实是指向同一内存地址,也就是只有cStr开辟内存空间,dStr其实是直接指向cStr;
5=true:内容当然相等。
总结:
要比较两个基本类型(如byte、short 、int 、long 、float、double、char、boolean)的数据或两个引用变量是否相等,只能用==操作符;
字符串的比较基本上都是使用equals方法,因为两个字符串只要字符序列相等,也是equals的。
- 【java中==与equals的区别】java中==与equals的区别
- java中equals的用法,与“==”的区别
- java中“==”与equals区别
- java中equals与==区别
- Java中"equals()"与"=="区别
- Java中equals()与==区别
- Java中equals与==区别
- java中“==” 与 equals 区别
- java中equals与==的区别
- java中equals() 与==的区别
- java中“==”与“equals”的区别
- java中“==”与“equals”的区别
- Java中==与equals的区别
- java中equals与==的区别
- java中equals与==的区别
- Java中== 与 equals的区别
- java中== 与equals的区别
- java中==与equals的区别
- zookeeper api demo
- C#自身包含其他应用程序(或者文件)并在运行时调用
- 【部门管理入门-1】软件部技术管理纲要
- Eclipse安装SVN支持详解
- Linux/Window 7 Telnet 配置(二)
- Java中==与equals的区别
- 网页中document.readyState几种状态 (下载完成等)及示例
- ARM编程进阶之一 —— ARM汇编伪指令
- 细观Google全面大揭秘
- 正则表达式 基础认识
- 那个允许挥霍的年代叫青春
- 网络工具集线器、交换机、路由器和网关
- 使用IDirectDrawClipper进行裁剪
- iOS5编程 -- main函数研究