`
syoumei
  • 浏览: 48767 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

AutoBoxing

    博客分类:
  • Java
阅读更多
 
csdn回复的一个帖子。
当时看到这段代码感觉很荒谬。
1.Integer i1=100; //怎么可以这样初始化呢?
2.i1==i2          //2个不一样的对象比较怎么得出来得结果是true?
不过后来看到有人回复说是jdk1.5的新特性。
查了下jdk1.5的java language features
 
对于为什么Integer i1=100可以这样写有一点明白了
 
As any Java programmer knows, you can’t put an int (or other primitive value) into a collection. Collections can only hold object references, so you have to box primitive values into the appropriate wrapper class (which is Integer in the case of int). When you take the object out of the collection, you get the Integer that you put in; if you need an int, you must unbox the Integer using the intValue method. All of this boxing and unboxing is a pain, and clutters up your code. The autoboxing and unboxing feature automates the process, eliminating the pain and the clutter.
 
还附带了一个例子
  1. public class Frequency {   
  2.    public static void main(String[] args) {   
  3.       Map<String, Integer> m = new TreeMap<String, Integer>();   
  4.       for (String word : args) {   
  5.           Integer freq = m.get(word);   
  6.           m.put(word, (freq == null ? 1 : freq + 1));   
  7.       }   
  8.       System.out.println(m);   
  9.    }   
  10. }  

但可以对于为什么i1==i2打印出来时true还是想不明白。网上找资料。终于找到一篇比较靠谱的文章,提示说用dj反编译下看看。我试了下.
java 代码
  1. public static void main(String[] args) {   
  2.  Integer i=200;   
  3.  Integer ii=200;   
  4.  System.out.println(ii==i);   
  5.  Integer iii=100;   
  6.  Integer iiii=100;   
  7.  System.out.println(iii==iiii);   
  8.    Map<String, Integer> m = new TreeMap<String, Integer>();   
  9.    for (String word : args) {   
  10.        Integer freq = m.get(word);   
  11.        m.put(word, (freq == null ? 1 : freq + 1));   
  12.    }   
  13.    System.out.println(m);   
  14. }  
 
反编译为
 
  1. public static void main(String args[])   
  2. {   
  3.     Integer integer = Integer.valueOf(200);   
  4.     Integer integer1 = Integer.valueOf(200);   
  5.     System.out.println(integer1 == integer);   
  6.     Integer integer2 = Integer.valueOf(100);   
  7.     Integer integer3 = Integer.valueOf(100);   
  8.     System.out.println(integer2 == integer3);   
  9.     TreeMap treemap = new TreeMap();   
  10.     String args1[] = args;   
  11.     int i = args1.length;   
  12.     for(int j = 0; j < i; j++)   
  13.     {   
  14.         String s = args1[j];   
  15.         Integer integer4 = (Integer)treemap.get(s);   
  16.         treemap.put(s, Integer.valueOf(integer4 != null ? integer4.intValue() + 1 : 1));   
  17.     }   
  18.     System.out.println(treemap);   
  19. }  
 
发觉原来和我想的不一样,我本来以为AutoBoxing是通过new一个wrapper class实现的结果却是用valueOf()。但是就算这样,那还是2个对象阿。
于是去看了下Integer.valueOf的源码。
 
  1. public static Integer valueOf(int i) {   
  2.     final int offset = 128;   
  3.     if (i >= -128 && i <= 127) { // must cache   
  4.      return IntegerCache.cache[i + offset];   
  5.      }   
  6.         return new Integer(i);   
  7.  }  
 
说明对于一个byte范围大小的参数有特别的处理。于是看了下IntegerCache的源码
 
这是Integer的一个内部类
  1. private static class IntegerCache {   
  2.       private IntegerCache(){}   
  3.       static final Integer cache[] = new Integer[-(-128) + 127 + 1];   
  4.       static {   
  5.          for(int i = 0; i < cache.length; i++)   
  6.          cache[i] = new Integer(i - 128);   
  7.       }   
  8. }   
 
现在我终于明白了
  1. Integer i=200;   
  2. Integer ii=200;   
  3. System.out.println(ii==i);  
 
结果为true是因为它们就是同一个对象。IntegerCache初始化了256个Integer缓存。
i,ii只是一开始初始化的new Integer(100)的引用而已。
 
AutoBoxing终于明白了。
 
 
分享到:
评论
3 楼 denverj 2010-08-23  
别误导新人啊,兄弟。
2 楼 polokang 2009-10-21  
误人子弟!
明明是 false
1 楼 congpeixue 2008-06-09  
现在我终于明白了
Integer i=200;   
Integer ii=200;   
System.out.println(ii==i);  


结果返回true.

相关推荐

    OCJP认证-3期(PX017) 面向对象程序设计-Autoboxing.doc

    面向对象程序设计是Java编程的核心,而Autoboxing(自动装箱)是Java SE 5.0引入的一个重要特性,它极大地简化了基本数据类型与它们对应的包装类之间的转换过程。在Java中,每个基本数据类型都有一个对应的包装类,...

    emb-autoboxing-version-range-0.6.jar

    jar包,官方版本,自测可用

    emb-autoboxing-version-range-0.5.jar

    jar包,官方版本,自测可用

    emb-autoboxing-version-range-0.6-sources.jar

    jar包,官方版本,自测可用

    emb-autoboxing-version-range-0.5-sources.jar

    jar包,官方版本,自测可用

    关于Java自动装箱(autoboxing)的一些意想不到的结果

    Java的自动装箱功能极大地简化了基本数据类型与它们对应的包装类之间的相互转换。然而,这一特性可能会引起一些不易察觉的副作用,这些副作用往往是由于JVM对某些包装类对象实现了缓存机制所致。...

    JDK 1.5新特性

    这些新特性包括泛型(Generics)、增强的“for”循环(Enhanced For loop)、自动装箱/拆箱(Autoboxing/Unboxing)、类型安全的枚举(Typesafe enums)、静态导入(Static import)以及元数据(Metadata)。...

    GitHub 上标星 115k+ 的 Java 教程.pdf

    本文将对 Java 的基础知识点进行总结和解释,涵盖了Java 的基本数据类型、String 相关知识点、Object 方法、基本运算符、Autoboxing 和 Unboxing 等。 一、基本数据类型 Java 中的基本数据类型包括 byte、char、...

    Java语言规范(第三版) 英文

    It provides full coverage of all new features added since the previous edition, including generics, annotations, asserts, autoboxing, enums, for-each loops, variable arity methods, and static import ...

    Java自动装箱与拆箱深度解析:原理、应用与性能考量

    在Java编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个非常核心的概念,它们允许基本数据类型和它们对应的包装类之间无缝转换。这种转换机制在Java 5中引入,极大地简化了代码编写,但同时也带来了一些...

    Java-Language-Specification-3rd-Edition

    全面、准确、详尽地介绍了Java语言及其语法,论述了Java编译器所要检查的语法和Java运行模式的各个方面,同时还描述了Java语盲最重要的新特征(包括generics、annotationS、aSSertS、autoboxing、enumS、for-...

    java学习笔记极品4

    ### Java学习笔记极品4:深入理解autoboxing与unboxing #### 一、对象与基本数据类型:autoboxing与unboxing的意义 在Java的世界里,面向对象编程(OOP)占据着核心地位,对象(Object)是其基础构建单元。然而,...

    Java中的自动装箱与拆箱Java开发Java经验技巧共6

    在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的特性,它们简化了基本类型(如int、double等)与对应的包装类(如Integer、Double等)之间的转换过程。这些特性是在Java 5引入的,极大...

    Android性能优化典范 - 第3季 - 胡凯1

    自动装箱(Autoboxing)是Java的一个特性,将基本数据类型转换为对应的包装类。在循环或使用HashMap等容器时,自动装箱会导致额外的内存开销和性能损失。因此,应避免不必要的自动装箱,特别是在性能敏感的代码段中...

    Java语言 包装类讲解案例代码 ( 设计目的(作用)和用途、自动装箱与拆箱、常用方法、 null和默认值)

    自动装箱与拆箱:自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。 常用方法:演示如何使用包装类中的这些常见方法。 null...

    JAVA数据类型转换.rar

    Java 5引入了自动装箱(Autoboxing)和拆箱(Unboxing)功能,使得基本数据类型与对应的包装类(如Integer、Double等)之间可以无缝转换。例如,`int i = 10; Integer integer = i;` 这里,int类型的i被自动装箱为...

    Java - A Beginner’s Guide - Sixth Edition - Herbert Schildt

    #### Enumerations, Autoboxing, Static Import, and Annotations This final chapter covers additional features introduced in later versions of Java. It explains enumerations, which are a special type of ...

    Lucene3.0浅析

    这次升级主要集中在API的调整和对Java5新特性的支持,包括泛型、可变参数、枚举和autoboxing。 一、API调整与Java5新特性支持 Lucene3.0删除了许多废弃的方法和类,以提供更清晰、更稳定的API。新版本引入了Java5...

    Java The Complete Reference ,11th Edition.pdf

    Enumerations, autoboxing, and annotations The I/O classes Generics Lambda expressions Modules String handling The Collections Framework Networking Event handling AWT Swing The Concurrent API The ...

    2016年Java面试题及回答.doc

    - **自动装箱(Autoboxing)与拆箱(Unboxing)**:自动装箱是指Java编译器自动将基本数据类型转换为其对应的包装类类型的过程。例如,将`int`类型转换为`Integer`对象。相反,拆箱是指从包装类类型转换回基本数据类型的...

Global site tag (gtag.js) - Google Analytics