`
lizhensan
  • 浏览: 378542 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 语法糖-自动装箱的陷阱

    博客分类:
  • java
 
阅读更多

  public static void main(String[] args) {
  Integer a=1;
  Integer b=2;
  Integer c=3;
  Integer d=3;
  Integer e=321;
  Integer f=321;
  Long g=3L;
  System.out.println(c==d);true
  System.out.println(e==f);false
  System.out.println(c==(a+b));true
  System.out.println(c.equals(a+b));true
  System.out.println(g==(a+b));true
  System.out.println(g.equals(a+b));false
 }
}



反编译的代码

 Integer a = Integer.valueOf(1);
    Integer b = Integer.valueOf(2);
    Integer c = Integer.valueOf(3);
    Integer d = Integer.valueOf(3);
    Integer e = Integer.valueOf(321);
    Integer f = Integer.valueOf(321);
    Long g = Long.valueOf(3L);
    System.out.println(c == d);
    System.out.println(e == f);
    System.out.println(c.intValue() == a.intValue() + b.intValue());
    System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
    System.out.println(g.longValue() == a.intValue() + b.intValue());
    System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));

 

 

 

 

在自动装箱时对于值从128127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用==进行比较时,i1 i2实际上参考至同一个对象。如果超过了从–128127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以范例4.7使用==进行比较时,i1i2参考的是不同的对象。

 

 

源代码

 

public static Integer valueOf(int i) {
	final int offset = 128;
	if (i >= -128 && i <= 127) { // must cache 
	    return IntegerCache.cache[i + offset];
	}
        return new Integer(i);
    }

 

static final Integer cache[] = new Integer[-(-128) + 127 + 1];

	static {
	    for(int i = 0; i < cache.length; i++)
		cache[i] = new Integer(i - 128);
	}
    }
分享到:
评论
1 楼 sacoole 2013-10-14  

相关推荐

    java-puzzlers源代码

    通过对"java-puzzlers"源代码的学习,读者可以加深对Java语法、内存管理、异常处理、并发编程等多个方面的理解,并提升编程技巧。这些知识不仅适用于初学者,对于有一定经验的开发者来说,也是巩固和扩展Java知识...

    Java 面试中的陷阱

    在Java面试中,面试官经常会提出一些看似...以上就是Java面试中的一些陷阱问题及其详细解答,涵盖了基本语法、面向对象、集合框架、多线程、异常处理等多个方面。理解并掌握这些知识点对于面试和实际开发都至关重要。

    java笔记,java学习笔记

    Java支持自动装箱和拆箱,这是一种语法糖,允许程序员在基本数据类型和其对应的包装类之间自动转换。例如,`Integer i = 10;`是自动装箱的例子,而`int j = i;`则是自动拆箱的例子。需要注意的是,这种便利性也可能...

    JavaJava%BEE软件工程师就业求职手册.doc

    - **3.2.1 int和Integer的区别**:对比了基本类型`int`与包装类`Integer`之间的差异,包括自动装箱与拆箱的概念。 - **3.2.2 原始数据类型的分类**:概述了Java中的所有原始数据类型,并比较了它们的特性和适用...

    圣思园java视屏

    - **自动装箱与拆箱**:Java提供了自动装箱(primitive to wrapper)和拆箱(wrapper to primitive)的功能,需要注意装箱后的对象引用可能会带来的性能影响。 - **溢出问题**:对于有符号的整数类型,当数值超过...

    Java面试资料精讲分析.txt

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

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

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

    SCJP1.4陷阱总结

    1. **基本语法与数据类型**:SCJP考试会测试对Java基础语法的理解,如变量声明、数据类型(包括原始类型和引用类型)、运算符优先级等。笔记可能会特别强调容易混淆的点,比如自动装箱拆箱可能导致的类型转换异常。 ...

    JavaScript 10分钟速成 (js-in-ten-minutes)

    - **自动装箱**:在某些情况下,JavaScript会自动将原始类型转化为对象类型,这被称为自动装箱。 #### 高级特性 对于那些希望进一步探索JavaScript高级特性的学习者来说,还有一些额外的内容可供参考: - **构造...

    Java编写中容易搞错的一些东西

    在Java编程过程中,即使是经验丰富的开发者也可能会遇到一些常见的陷阱和误区。以下是对标题和描述中提到的关键知识点的深入解析: ### 1. 使用 `instanceof` 运算符 `instanceof` 是一个二元运算符,用来检查对象...

    Java面试宝典2011版

    《Java面试宝典2011版》涵盖了...以上是对《Java面试宝典2011版》中提及的知识点的详细解析,涵盖了Java的基础语法、面向对象特性、异常处理、线程处理等多个方面,有助于深入理解和掌握Java语言的关键概念和技术细节。

    你必须学习的21个JAVA核心技术

    了解它们之间的转换,如装箱和拆箱,以及如何避免潜在的陷阱,如比较Integer对象的相等性。此外,熟悉Object类的方法如equals()和hashCode(),以及String类的独特性质,如不可变性,也是很重要的。 对象和实例的...

Global site tag (gtag.js) - Google Analytics