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.
还附带了一个例子
- public class Frequency {
- public static void main(String[] args) {
- Map<String, Integer> m = new TreeMap<String, Integer>();
- for (String word : args) {
- Integer freq = m.get(word);
- m.put(word, (freq == null ? 1 : freq + 1));
- }
- System.out.println(m);
- }
- }
但可以对于为什么i1==i2打印出来时true还是想不明白。网上找资料。终于找到一篇比较靠谱的文章,提示说用dj反编译下看看。我试了下.
java 代码
- public static void main(String[] args) {
- Integer i=200;
- Integer ii=200;
- System.out.println(ii==i);
- Integer iii=100;
- Integer iiii=100;
- System.out.println(iii==iiii);
- Map<String, Integer> m = new TreeMap<String, Integer>();
- for (String word : args) {
- Integer freq = m.get(word);
- m.put(word, (freq == null ? 1 : freq + 1));
- }
- System.out.println(m);
- }
反编译为
- public static void main(String args[])
- {
- Integer integer = Integer.valueOf(200);
- Integer integer1 = Integer.valueOf(200);
- System.out.println(integer1 == integer);
- Integer integer2 = Integer.valueOf(100);
- Integer integer3 = Integer.valueOf(100);
- System.out.println(integer2 == integer3);
- TreeMap treemap = new TreeMap();
- String args1[] = args;
- int i = args1.length;
- for(int j = 0; j < i; j++)
- {
- String s = args1[j];
- Integer integer4 = (Integer)treemap.get(s);
- treemap.put(s, Integer.valueOf(integer4 != null ? integer4.intValue() + 1 : 1));
- }
- System.out.println(treemap);
- }
发觉原来和我想的不一样,我本来以为AutoBoxing是通过new一个wrapper class实现的结果却是用valueOf()。但是就算这样,那还是2个对象阿。
于是去看了下Integer.valueOf的源码。
- public static Integer valueOf(int i) {
- final int offset = 128;
- if (i >= -128 && i <= 127) {
- return IntegerCache.cache[i + offset];
- }
- return new Integer(i);
- }
说明对于一个byte范围大小的参数有特别的处理。于是看了下IntegerCache的源码
这是Integer的一个内部类
- private static class IntegerCache {
- private IntegerCache(){}
- static final Integer cache[] = new Integer[-(-128) + 127 + 1];
- static {
- for(int i = 0; i < cache.length; i++)
- cache[i] = new Integer(i - 128);
- }
- }
现在我终于明白了
- Integer i=200;
- Integer ii=200;
- System.out.println(ii==i);
结果为true是因为它们就是同一个对象。IntegerCache初始化了256个Integer缓存。
i,ii只是一开始初始化的new Integer(100)的引用而已。
AutoBoxing终于明白了。
分享到:
相关推荐
面向对象程序设计是Java编程的核心,而Autoboxing(自动装箱)是Java SE 5.0引入的一个重要特性,它极大地简化了基本数据类型与它们对应的包装类之间的转换过程。在Java中,每个基本数据类型都有一个对应的包装类,...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
Java的自动装箱功能极大地简化了基本数据类型与它们对应的包装类之间的相互转换。然而,这一特性可能会引起一些不易察觉的副作用,这些副作用往往是由于JVM对某些包装类对象实现了缓存机制所致。...
这些新特性包括泛型(Generics)、增强的“for”循环(Enhanced For loop)、自动装箱/拆箱(Autoboxing/Unboxing)、类型安全的枚举(Typesafe enums)、静态导入(Static import)以及元数据(Metadata)。...
本文将对 Java 的基础知识点进行总结和解释,涵盖了Java 的基本数据类型、String 相关知识点、Object 方法、基本运算符、Autoboxing 和 Unboxing 等。 一、基本数据类型 Java 中的基本数据类型包括 byte、char、...
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编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个非常核心的概念,它们允许基本数据类型和它们对应的包装类之间无缝转换。这种转换机制在Java 5中引入,极大地简化了代码编写,但同时也带来了一些...
全面、准确、详尽地介绍了Java语言及其语法,论述了Java编译器所要检查的语法和Java运行模式的各个方面,同时还描述了Java语盲最重要的新特征(包括generics、annotationS、aSSertS、autoboxing、enumS、for-...
### Java学习笔记极品4:深入理解autoboxing与unboxing #### 一、对象与基本数据类型:autoboxing与unboxing的意义 在Java的世界里,面向对象编程(OOP)占据着核心地位,对象(Object)是其基础构建单元。然而,...
在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的特性,它们简化了基本类型(如int、double等)与对应的包装类(如Integer、Double等)之间的转换过程。这些特性是在Java 5引入的,极大...
自动装箱(Autoboxing)是Java的一个特性,将基本数据类型转换为对应的包装类。在循环或使用HashMap等容器时,自动装箱会导致额外的内存开销和性能损失。因此,应避免不必要的自动装箱,特别是在性能敏感的代码段中...
自动装箱与拆箱:自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。 常用方法:演示如何使用包装类中的这些常见方法。 null...
Java 5引入了自动装箱(Autoboxing)和拆箱(Unboxing)功能,使得基本数据类型与对应的包装类(如Integer、Double等)之间可以无缝转换。例如,`int i = 10; Integer integer = i;` 这里,int类型的i被自动装箱为...
#### 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 ...
这次升级主要集中在API的调整和对Java5新特性的支持,包括泛型、可变参数、枚举和autoboxing。 一、API调整与Java5新特性支持 Lucene3.0删除了许多废弃的方法和类,以提供更清晰、更稳定的API。新版本引入了Java5...
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 ...
- **自动装箱(Autoboxing)与拆箱(Unboxing)**:自动装箱是指Java编译器自动将基本数据类型转换为其对应的包装类类型的过程。例如,将`int`类型转换为`Integer`对象。相反,拆箱是指从包装类类型转换回基本数据类型的...