Java中equals()和==的区别
2016-06-06 00:46
441 查看
本文主要针对在进行判断两个数据是否相等时,用到的equals()和“==”进行说明,以便于在实际使用时,选择正确的方式进行比较。
首先,看一个简单的例子,代码如下:
这段代码执行后的输出结果是什么呢?
其中,示例中的1处,不用说,输出结果肯定是true,那么2和3呢?正确的输出结果分别是false和true。针对这两种不同的比较方式,返回的结果不一样,主要是因为Java中原始数据类型和引用类型的不同而引起的。
示例中,变量a和b均是原始数据类型,因此变量a和b中存放的就是“3”这个数值,因此用“==”比较时,输出结果为true;同时需要注意,原始数据类型,不能调用equals()方法。
而变量str1和str2,是对象引用,它们存放的是并不是String对象中的值,存储的是该对象的在内存中的物理地址,因此当声明str1和str2时,分别指向了不同的对象,即存储了不同的物理地址,因此在实例中的2处,输出结果为false。3处调用了String对象的equals方法,该方法重载了Object类的equals方法,比较的是对象中的内容。因此输出结果为true。
将程序稍微改一下,如下:
那么,程序运行后,输出的结果,全部为true。1处和3处不用说,通过前面的介绍,这是肯定的,但2处确不一样了。这是因为程序在运行的时候会创建一个字符串缓冲池当使用 str1 ="hello world"这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在这个实例程序中,str1先被放到了池中,所以在str2被创建的时候,程序找到了具有相同值的str1,因此就将str2直接使用str1所引用的对象"hello world"的物理地址,也就是说str1和str2拥有相同的物理地址。
通过上面两个例子,对equals()和“==”做一个总结:
1) 对于“==”,如果是用于比较连个原始数据类型,则比较的是其存储的“值”是否相等,而用于比较两个引用类型的变量时,则比较的是所指向的对象的物理地址。
2)对于equals(),在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。但如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了,比较的是所指向的对象的内容。
首先,看一个简单的例子,代码如下:
public static void main(String args[]){ int a = 3; int b = 3; String str1 = new String("hello world"); String str2 = new String("hello world"); System.out.println(a==b); //1 System.out.println(str1==str2); //2 System.out.println(str1.equals(str2)); //3 }
这段代码执行后的输出结果是什么呢?
其中,示例中的1处,不用说,输出结果肯定是true,那么2和3呢?正确的输出结果分别是false和true。针对这两种不同的比较方式,返回的结果不一样,主要是因为Java中原始数据类型和引用类型的不同而引起的。
示例中,变量a和b均是原始数据类型,因此变量a和b中存放的就是“3”这个数值,因此用“==”比较时,输出结果为true;同时需要注意,原始数据类型,不能调用equals()方法。
而变量str1和str2,是对象引用,它们存放的是并不是String对象中的值,存储的是该对象的在内存中的物理地址,因此当声明str1和str2时,分别指向了不同的对象,即存储了不同的物理地址,因此在实例中的2处,输出结果为false。3处调用了String对象的equals方法,该方法重载了Object类的equals方法,比较的是对象中的内容。因此输出结果为true。
将程序稍微改一下,如下:
public static void main(String args[]){ int a = 3; int b = 3; String str1 ="hello world"; String str2 ="hello world"; System.out.println(a==b); //1 System.out.println(str1==str2); //2 System.out.println(str1.equals(str2)); //3 }
那么,程序运行后,输出的结果,全部为true。1处和3处不用说,通过前面的介绍,这是肯定的,但2处确不一样了。这是因为程序在运行的时候会创建一个字符串缓冲池当使用 str1 ="hello world"这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在这个实例程序中,str1先被放到了池中,所以在str2被创建的时候,程序找到了具有相同值的str1,因此就将str2直接使用str1所引用的对象"hello world"的物理地址,也就是说str1和str2拥有相同的物理地址。
通过上面两个例子,对equals()和“==”做一个总结:
1) 对于“==”,如果是用于比较连个原始数据类型,则比较的是其存储的“值”是否相等,而用于比较两个引用类型的变量时,则比较的是所指向的对象的物理地址。
2)对于equals(),在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。但如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了,比较的是所指向的对象的内容。
相关文章推荐
- Struts2实现文件下载
- JAVA-switch语句详解
- Struts2实现文件批量上传
- Java实现表达式的运算
- 享元模式 Java
- SPringMVC各层浅析
- java中Scanner类nextLine()和next()的区别和使用方法
- javaBean中 字符串 转 date 类型转换
- Java 设计模式——外观模式
- Java 设计模式——外观模式
- JavaSE_Java中的流重定向_重新定位到控制台
- spring-springmvc-shiro整合(转载)
- Java Web应用安全
- 异步Servlet
- Java Jest for Elasticsearch
- Spring4 MVC 整合Hibernate5 附源码下载
- Java之LinkedList源码解读(JDK 1.8)
- JAVA 内存泄露详解(原因、例子及解决)
- Java 并发
- 手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含源码下载)