其实,java在自动装箱和自动拆箱的过程里面,留了不少的坑给我们,我们下面将以integer这个类为基础讨论一下
其实这里面主要涉及的是两点
1.当使用Integer x=1,这样的方式来赋值的时候,其实,编译器当那个1是String,然后需要通过valueof的方法转换过来,但是在转换的过程中,他为了优化速度,使用了我们所不知道的缓存,因为在这里会出现一些坑
2.Integer类里面重写了equals方法,里面不但对比对象,而且还对比里面的值
下面先上代码:(请仔细观看注释,里面已经提供了上面所述两个方法的源码)
package com.ray.object;
/**
* 自动装箱与自动拆箱的坑
*
* @author ray
* @since 2015-05-04
* @version 1.0
*
*/
public class Test {
public static void main(String[] args) {
// 其实下面这几句后面的赋值1,1,1000,1000,都被当做是string,
// 然后通过Integer.valueOf()这个方法转换过来,
// 我们下面来看看Integer.valueOf()这个方法的源码
// public static Integer valueOf(int i) {
// if(i >= -128 && i <= IntegerCache.high)
// return IntegerCache.cache[i + 128];
// else
// return new Integer(i);
// }
// 在源码里面其实是缓存了一部分数据,是-128-127
// 因此,在a==b是返回true
// c==d是返回false
Integer a = 1;
Integer b = 1;
Integer c = 1000;
Integer d = 1000;
System.out.println("a == b ---- " + (a == b));// true
System.out.println("c == d ---- " + (c == d));// false
// 这下面是构造4个integer的对象出来
Integer a_1 = new Integer(1);
Integer b_1 = new Integer(1);
Integer c_1 = new Integer(1000);
Integer d_1 = new Integer(1000);
// 下面两句是通过==对比对象,当然是false了
System.out.println("a_1 == b_1 ---- " + (a_1 == b_1));// false
System.out.println("c_1 == d_1 ---- " + (c_1 == d_1));// false
// 下面两句是通过equals对比对象,integer类里面重写了equals方法
// 看看重写后equals方法的代码
// public boolean equals(Object obj) {
// if (obj instanceof Integer) {
// return value == ((Integer)obj).intValue();
// }
// return false;
// }
// 我们可以看到出来对比对象之外,还对比本身的值,所以返回true
System.out.println("a_1.equals(b_1) ---- " + a_1.equals(b_1));// true
System.out.println("c_1.equals(d_1) ---- " + c_1.equals(d_1));// true
}
}
输出:
a == b ---- true
c == d ---- false
a_1 == b_1 ---- false
c_1 == d_1 ---- false
a_1.equals(b_1) ---- true
c_1.equals(d_1) ---- true
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
计算机后端-Java-Java核心基础-第14章 面向对象06 24. 新特性:自动装箱与自动拆箱.avi
1. 自动装箱: 2. 自动拆箱: 3. 缓存问题
什么是自动装箱和自动拆箱
Java中的自动装箱与拆箱Java开发Java经验技巧共6页.pdf.zip
//这里就是自动的装箱,将3转换成Integer类型并放到集合中自动拆箱包装类自动转为基本类型 Integer >> int面试常见题目:自动拆箱与自动装箱的问
Java中的自动装箱与拆箱_.docx
行业文档-设计装置-用于自动装箱生产线的纸箱自动识别装置.zip
学士学位论文--87c51单片机自动装箱控制系统.doc
java装箱拆箱.ppt java装箱拆箱.ppt
行业文档-设计装置-用于自动装箱生产线的纸箱自动识别方法及装置.zip
自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。 如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放...
Tedu正则表达式与Object与自动装箱与拆箱。
计算机后端-Java-PHP视频教程javascript03-213_214 自动装箱系统自带构造方法.wmv
C#中必备知识点 装箱与拆箱(2)
很详细的介绍了java装箱拆箱的相关知识,用例子来讲述,易于理解!
基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱)
自动装箱与拆箱:自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。 常用方法:演示如何使用包装类中的这些常见方法。 null...
主要给大家介绍了关于Java中自动装箱、拆箱引起的耗时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
《深入理解java虚拟机》自动装箱拆箱实例.doc
6个重要的NET概念:栈-堆-值类型-引用类型-装箱-拆箱.doc