JAVA学习【12】“==”、“equals”判断包装类是否相等
2016-03-29 11:52
501 查看
Java判断基本数据类型变量内容是否相等时用“==”,判断其他类的变量内容是否相等用“equals()”函数,一般在该类中重写equals()函数,判断其他类变量的引用地址是否相同用“==”。
然而,包装类则介于基本数据类型与类之间,使用“==”符号时就会涉及到自动拆装箱。
先看下面一段代码(题目来源牛客网):
![](http://img.blog.csdn.net/20160329103004427)
“Integer n1 = new Integer(47);” 在JVM堆Heap中申请一块区域,存储非基本数据类型变量n1,同理,n2存储在Heap中另一块区域, "=="
比较两个对象的引用(内存地址)是否相同,因此n1!=n2。(包装类作为一种特殊的类,与其他类相同, "==" 比较引用地址,都存储在Heap)
"Integer n3 = 3;"对基本类型数据进行自动装箱,等价于“Integer i = Integer.valueOf(100);”,valueOf()的JDK源代码如下:
对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回Integer缓存,并未新建对象,可以认为n3仍是基本数据类型,“==”相当于只是在栈中对基本数据类型变量进行比较;超过这个范围则在Heap新建一个Integer类。
因此,可以认为自动装箱等价于:
![](http://img.blog.csdn.net/20160329114912435)
示例代码如下:
i1==i2: false
i3==i4: true
具体参考博客http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html
由前面JVM知识,基本类型变量存储在JVM栈(Stack),其他类的对象实例存储在堆(Heap),存储在栈(Stack)中的数据可以更加快速存取。除此之外强调一下:包装类没有初始值,基本类型有初始值。见下例:
n1: 0
n2: null
然而,包装类则介于基本数据类型与类之间,使用“==”符号时就会涉及到自动拆装箱。
先看下面一段代码(题目来源牛客网):
public class CodeOne { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); Integer n3 = 3; Integer n4 = 3; System.out.println("n1==n2: "+(n1 == n2)); System.out.println("n1.equals(n2):"+(n1.equals(n2))); System.out.println("n1!=n2: "+(n1 != n2)); System.out.println("n3==n4: "+(n3 == n4)); System.out.println("n3!=n4: "+(n3 != n4)); } }运行结果:
“Integer n1 = new Integer(47);” 在JVM堆Heap中申请一块区域,存储非基本数据类型变量n1,同理,n2存储在Heap中另一块区域, "=="
比较两个对象的引用(内存地址)是否相同,因此n1!=n2。(包装类作为一种特殊的类,与其他类相同, "==" 比较引用地址,都存储在Heap)
"Integer n3 = 3;"对基本类型数据进行自动装箱,等价于“Integer i = Integer.valueOf(100);”,valueOf()的JDK源代码如下:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回Integer缓存,并未新建对象,可以认为n3仍是基本数据类型,“==”相当于只是在栈中对基本数据类型变量进行比较;超过这个范围则在Heap新建一个Integer类。
因此,可以认为自动装箱等价于:
示例代码如下:
public class CodeOne { public static void main(String[] args) { //在-128~127 之外的数 Integer i1 =200; Integer i2 =200; System.out.println("i1==i2: "+(i1==i2)); // 在-128~127 之内的数 Integer i3 =100; Integer i4 =100; System.out.println("i3==i4: "+(i3==i4)); } }运行结果:
i1==i2: false
i3==i4: true
具体参考博客http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html
由前面JVM知识,基本类型变量存储在JVM栈(Stack),其他类的对象实例存储在堆(Heap),存储在栈(Stack)中的数据可以更加快速存取。除此之外强调一下:包装类没有初始值,基本类型有初始值。见下例:
public class CodeOne { static int n1; static Integer n2; public static void main(String[] args) { int n3; Integer n4; System.out.println("n1: "+n1); System.out.println("n2: "+n2); //System.out.println("n3: "+n3); //错误:可能尚未初始化变量n3 //System.out.println("n4: "+n4); //错误:可能尚未初始化变量n3 } }运行结果:
n1: 0
n2: null
相关文章推荐
- java 应用的路径问题
- java.util.ArrayDeque类使用方法详解
- Spring MVC理解和主要使用的注解详解
- spring security 3.1中基于数据库自定义验证授权功能实现
- [每天一点点]->[中文乱码] Eclipse下J2EE项目乱码问题合集
- SpringMVC笔记
- 浅析Java垃圾回收机制
- Java中重载和重写的区别
- Java ArrayDeque使用方法详解
- MyEclipse创建数据库
- Eclipse(MyEclipse) 常用快捷键
- 约瑟夫环生者死者游戏(JAVA)
- Java中Random类的nextInt()方法详解
- 使用 IDEA + Maven + Git 快速开发 Java Web 应用
- eclipse从数据库逆向生成Hibernate实体类
- [查异常网]-20160329-Java ConcurrentModificationException异常原因和解决方法
- 常用的正则表达式规则和基本规范
- myEclipse快捷键大全
- java方法调用之重载、重写的调用原理(一)
- 怎样使java程序减少内存占用(转载)