java-基础入门-自动装箱与自动拆箱留给我们的坑

其实,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

时间: 2024-11-29 00:13:50

java-基础入门-自动装箱与自动拆箱留给我们的坑的相关文章

java中的自动装箱和自动拆箱

/* JDK5.0新特性: 以下的特性适合JDK1.5版本之后的.包括1.5 jdk1.4,包括1.4在内之前的所有版本不能使用以下特性. 自动装箱(auto_boxing)和自动拆箱(auto_unboxing) */ public class IntegerTest05{ public static void main(String[] args){ //JDK5.0之前的. //int-->Integer (装箱) Integer i1 = new Integer(10); //Integ

Java语法糖2:自动装箱和自动拆箱

一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱.自动装箱是很简单的内容. 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: public class TestMain

自动装箱和自动拆箱

http://www.cnblogs.com/xrq730/p/4869065.html 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: public class TestMain { public st

可能你不知道的,关于自动装箱和自动拆箱

包装类 我们知道,Java中包含了8种基本数据类型: 整数类型:byte.short.int.long 字符类型:char 浮点类型:float.double 布尔类型:boolean 这8种基本数据类型的变量不需要使用new来创建,它们不会在堆上创建,而是直接在栈内存中存储,因此会比使用对象更加高效. 但是,在某些时候,基本数据类型会有一些制约,例如当有个方法需要Object类型的参数,但实际需要的值却是2.3等数值,这就比较难以处理了.因为,所有引用类型的变量都继承了Object类,都可当成

自动装箱,自动拆箱

QUOTE: Integer a=1;//这就是一个自动装箱,如果没有自动装箱的话,需要这样Integer a=new Integer(1)int b=a;//这就是一个自动拆箱,如果没有自动拆箱的话,需要这样:int b=a.intValue() 这样就能看出自动装箱和自动拆箱是简化了基本数据类型和相对应对象的转化步骤. 自动装箱,自动拆箱,布布扣,bubuko.com

Java基础入门 传智播客pdf

下载地址:网盘下载 内容简介 <Java基础入门>从初学者的角度详细讲解了Java开发中重点用到的多种技术.全书共11章,包括Java开发环境的搭建及其运行机制.基本语法.面向对象的思想,采用典型翔实的例子.通俗易懂的语言阐述面向对象中的抽象概念.在多线程.常用API.集合.IO.GUI.网络编程章节中,通过剖析案例.分析代码结构含义.解决常见问题等方式,帮助初学者培养良好的编程习惯.最后,讲解了Eclipse开发工具,帮助初学者熟悉开发工具的使用.  <Java基础入门>附有配套

Java基础之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 自动装箱 Java中所谓的装箱通俗点就是:八种基本数据类型在某些条件下使用时,会自动变为对应的包装器类型. 如下清单1: @Test public void boxingTest() {    Integer i1 = 17; Integer i2 = 17;    Integer i3 = 137; Integer i4 = 137;    System.out.println(i1 == i2)

[java基础] java中的自动装箱与自动拆箱

自动装箱的一个例子: Integer i = 1; //实际上是执行了Integer i = Integer.valueOf(1) 自动拆箱的一个例子: Integer a =1; int b = a; //自动拆箱就是从对象中把基本数据取出来 Integer自动拆箱的一个好玩的例子: Integer a = 100; Integer b = 100; System.out.println(a==b); // true Integer c = 200; Integer d = 200; Syst

Java自动装箱和自动拆箱操作

1.Java数据类型 在介绍Java的自动装箱和拆箱之前,我们先来了解一下Java的基本数据类型. 在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型).基本类型的数值不是对象,不能调用对象的toString().hashCode().getClass().equals()等方法.所以Java提供了针对每种基本类型的包装类型.如下: Java基本数据类型 INDEX 基本类型  大小 数值范围 默认值 包装类型 1 boolea