`
annan211
  • 浏览: 461123 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 自动拆箱的陷阱

 
阅读更多

先看代码

 public class IntegerDemo {
	public static void main(String[] args) {

		Integer a = 1;
		Integer b = 1;

		Integer c = 128;
		Integer d = 128;
		Integer.valueOf(a);

		System.out.println(a==b);
		System.out.println(c==d);
	}
}


输出是什么

如果不看源码,你肯定想不到结果。对象 a 和 b的地址相同,对象 c和 d 的地址相同,操作符 ==  就是比较地址的,自然都是true,但是结果却不是这样。

程序输出
true
false

为什么呢,
当把int值 赋给 Integer的时候  会自动调用 valueOf 方法,生成Integer对象
对象 a 和 b 的地址是一样的,所以返回true

我们先来看看源码

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }


先来解读一下 java 规定 IntegerCache.high = 127
传入的值 在 -128 到 127 之间的时候,就返回 IntegerCache.cache[i + 128];
由于数组下标是从0开始,从 -128开始,刚好对上。

但是当 传入的值  不在 -128 到 127 之间的时候,就会实例化另外一个对象返回,自然输出false。

在传递参数的时候,经常忽略int 和Integer 的区别,如果超出限制,往往会创建大量的对象,浪!费!

在以 Integer 为key 的HashMap 中,如果忽略了这个大小限制,那就会创建大量的空白空间,但是又不知道是怎么回事。
浪!费!

long 的源码 也是这样

public static Long valueOf(long l) {
	final int offset = 128;
	if (l >= -128 && l <= 127) { // will cache
	    return LongCache.cache[(int)l + offset];
	}
        return new Long(l);
    }


double Float 不是

 public static Double valueOf(double d) {
        return new Double(d);
    }


其他的 自己查看。
分享到:
评论

相关推荐

    浅谈Java自动装箱与拆箱及其陷阱

    // 这里进行了自动拆箱和装箱操作 System.out.println(c); // 输出:300 ``` 在上述代码中,`a + b`首先会将Integer对象转换为int类型进行加法运算,然后将结果300重新装箱成一个新的Integer对象。如果a和b的值超出...

    Java 自动转换的资源

    以下是关于Java自动转换的一些核心知识点: 1. **基本类型与包装类之间的自动转换**: - Java提供了8种基本数据类型,如int、double等,以及对应的包装类Integer、Double等。当基本类型与包装类之间进行操作时,...

    java陷阱之自动装箱共2页.pdf.zip

    反之,自动拆箱则是将包装类对象转换回基本数据类型。例如,当我们把一个Integer对象赋值给int变量时,编译器会自动执行Integer对象的intValue()方法,这就是拆箱。 1. **内存管理与效率问题**:虽然自动装箱简化了...

    Java中的装箱和拆箱深入理解

    在Java SE 5及以后的版本中,为了方便开发者使用,引入了自动装箱和拆箱的功能。 一、什么是装箱和拆箱? 装箱(Boxing)是将Java的基本数据类型转换为其对应的包装器类型的自动过程。例如,将int类型转换为...

    Java 面试中的陷阱

    11. **short变量加法**:`s1 = s1 + 1`是错误的,因为这会导致自动装箱拆箱,可能导致类型不匹配异常;而`s1 += 1`是正确的,因为这是复合赋值操作符,会自动处理类型转换。 12. **sleep() 和 wait()**:`sleep()`...

    那些丑陋的Java API

    例如,自动装箱和拆箱可能导致的意外行为,或者浮点数的精度问题,这些都需要开发者具备深入理解。 5. **理解和规避问题**: - 了解这些API的"丑陋"之处,可以帮助我们编写更健壮、更高效的代码。比如,使用`...

    java解惑(java谜题)中文版的

    1. **类型转换**:Java中的自动装箱和拆箱可能导致一些陷阱,比如Integer对象与int基本类型的比较。在处理数值时,不恰当的类型转换可能导致逻辑错误。 2. **变量作用域**:Java的局部变量、成员变量和静态变量的...

    java笔记,java学习笔记

    `则是自动拆箱的例子。需要注意的是,这种便利性也可能带来陷阱,比如将`null`赋值给`Integer`类型的变量再尝试拆箱时,会在运行时抛出`NullPointerException`。 ### 数组元素的初始化 Java中的数组在创建时会被...

    java SE(入门知识4)原生数据类型使用陷阱.docx

    - 自从Java 5引入了自动装箱和拆箱机制,原始类型和它们对应的包装类之间可以方便地转换。例如,`Short a = 1;`实际上是将`int`类型的`1`自动装箱为`Short`对象。但需要注意的是,这种转换在某些情况下可能会导致...

    java解惑(源代码+教程)

    2. **自动装箱与拆箱**:Java 5引入了自动装箱和拆箱机制,使得基本类型和对应的包装类之间可以无缝切换。但这也可能隐藏潜在的性能问题,因为每次装箱和拆箱都会创建新的对象。 3. **字符串操作**:Java中的字符串...

    More.Java.Pitfalls中文版

    1. **类型转换错误**:Java中的自动装箱和拆箱可能导致类型转换异常,尤其是在涉及原始类型和包装类的操作时。书中可能讲解如何正确处理这类情况。 2. **空指针异常(NullPointerException)**:这是Java中最常见的...

    Java puzzlers(java 解惑)附源码

    例如,puzzler之一可能涉及自动装箱和拆箱,当Integer对象与int基本类型进行操作时,如果不理解它们之间的关系,可能会出现意料之外的结果。源码中可能包含这样的例子,展示了如何正确处理这种情况,避免隐式转换...

    Java面试资料精讲分析.txt

    4. **数据类型转换**:注意自动装箱和拆箱可能导致的问题。 5. **字符串操作**:使用StringBuilder或StringBuffer代替频繁拼接String。 #### 四、Java客户端方面陷阱 客户端开发时可能会遇到的问题: 1. **网络...

    Java 一些值得注意的细节

    1. **自动装箱与拆箱**:Java中的`Integer`等包装类提供了自动装箱和拆箱功能,方便了开发者操作。但需要注意,虽然在基本类型和包装类之间可以直接转换,但它们并不共享同一个缓存池,可能导致不必要的对象创建,...

    通过实例了解Java Integer类和int的区别

    同时Integer i 也可以自动拆箱为 i.intValue()。 知识点2:Integer.valueOf()方法 Integer.valueOf()方法会将int类型的值装箱到Integer对象中,并且在-128到127之间的值会被缓存,以提高性能。 知识点3:Integer...

    java-puzzlers-sampler_java_Joshua_

    《Java Puzzlers Sampler》是由Java领域的权威专家Joshua Bloch和Neal Gafter共同编著的一本书,书中收录了一系列令人困惑、出乎意料的Java编程问题,旨在帮助开发者更好地理解和避免这些潜在的陷阱。书中的...

    <好书>java解惑(java puzzlers),过来挑战吧

    1. 类型转换:Java是一种静态类型语言,但类型转换时可能出现问题,如自动装箱拆箱可能导致的意外行为,或者是不恰当的强制类型转换导致的ClassCastException。 2. 对象引用:Java中的对象引用有时会让人迷惑,例如...

    Java编程中常见的坑

    在Java中,当我们尝试将一个包装类类型的变量(例如`Integer`)自动拆箱为基本类型(例如`int`)时,如果该包装类变量为`null`,那么Java会抛出`NullPointerException`。这种情况下,编译器无法知道`null`代表的数字...

    java-puzzlers源代码

    1. **类型转换和自动装箱拆箱**:Java中的基本类型与对应的包装类之间可以进行自动转换,但这种转换可能隐藏着一些潜在的问题,如精度丢失、隐式转型等。 2. **变量作用域**:Java中变量的作用域是严格控制的,包括...

    Java五道输出易错题解析(进来挑战下).pdf

    Java编程语言中包含许多微妙的陷阱,这些陷阱可能会导致初学者和经验丰富的开发者在编写代码时遇到意外的问题。本文将解析五个容易出错的Java输出题目,并深入探讨相关的知识点。 1. 零宽度空格问题 在第一个题目中...

Global site tag (gtag.js) - Google Analytics