【转】Java自动装箱、拆箱、缓冲池
JDK5以后
Integer a = 3; 这是自动装箱
int i = new Integer(2); 这是自动拆箱
就是基本类型和其对应的包装类型在需要的时候可以互相转换,具体过程由编译器完成
比如自动装箱:
Integer a=3;
其实编译器调用的是static Integer valueOf(int i)这个方法
查阅JDK知道,
valueOf(int i)返回一个表示指定的int 值的Integer 对象
那么就变成这样: Integer a=3; => Integer a=Integer.valueOf(3);
对应的 int intValue() 返回该Integer对象的int值,是拆箱
我们再来看Integer缓存,
下面是IntegerCache类的源码
Java代码
private static class IntegerCache //定义类名
{
static final int high;
static final Integer cache[]; //cache缓存是一个存放Integer类型的数组
static //初始化
{
final int low = -128; //最小值是固定的
int h = 127; //最大值暂时是127
if (integerCacheHighPropValue != null) //这段if代码不用深究,是一些判断,我看得眼花啊
{
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h; //此时high就是127
cache = new Integer[(high - low) + 1]; //有256个元素
int j = low; //j的初始值是-128
for(int k = 0; k < cache.length; k++) //缓存区间数据
cache[k] = new Integer(j++); //将-128~127包装成256个对象存入缓存
}
private IntegerCache(){} //构造方法,不需要构造什么
}
再来看valueOf方法
Java代码
public static Integer valueOf(int i)
{
if(i >= -128 && i <= IntegerCache.high)
{
//如果i在-128~127之间,就直接在缓存中取出i的Integer类型对象
return IntegerCache.cache[i + 128];
}
else
{
return new Integer(i); //否则就在堆内存中创建
}
}
valueOf方法会自动调用IntegerCache这个类,
IntegerCache初始化后内存中就有Integer缓冲池cache[]了,
-128~127区间的int值有其对应的的包装对象
java使用该机制是为了达到最小化数据输入和输出的目的,这是一种优化措施,提高效率
其他的包装器:
Boolean:(全部缓存)
Byte: (全部缓存)
Character ( <=127 缓存)
Short (-128~127 缓存)
Long (-128~127 缓存)
Float (没有缓存)
Doulbe (没有缓存)
主题:java迷题:等于,还是不等于?
代码片段1
public static void main(final String[] args) {
Integer a = new Integer(100);
Integer b = 100;
System.out.println(a == b);
}
解答:
结果输出false
因为new Integer(100)是指明了再堆内存中创建对象
而Integer b = 100; 这句是自动装箱,
得到的是Integer缓冲池中的对象,是这句代码return IntegerCache.cache[100 + 128]
明显a和b的地址是不一样的,不是同一个对象
代码片段2
public static void main(final String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
}
解答:
结果输出true
a和b指向了同一个对象,都是IntegerCache.cache[100 + 128]
代码片段3
public static void main(final String[] args) {
Integer a = 156;
Integer b = 156;
System.out.println(a == b);
}
解答:
结果输出false
由于156大于128,它的包装对象不在缓冲池中,而是执行return new Integer(156);
new了2次,都在堆内存中,但地址不一样
代码片段4
public static void main(final String[] args) {
Integer a = Integer.valueOf(100);
Integer b = 100;
System.out.println(a == b);
}
解答:
结果输出true
我们上面说过了,Integer b = 100 就相当于Integer b=Integer.valueOf(100)
所以a和b指向缓冲池中的同一对象
【转】Java自动装箱、拆箱、缓冲池的更多相关文章
- java自动装箱拆箱总结
对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a ...
- JAVA自动装箱拆箱与常量池
java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...
- Java 自动装箱/拆箱
自动装箱/拆箱大大方便了基本类型(8个基本类型)数据和它们包装类的使用 自动装箱 : 基本类型自动转为包装类(int >> Integer) 自动拆箱: 包装类自动转为基本类型(Integ ...
- Java自动装箱拆箱
一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要in ...
- 深入理解Java自动装箱拆箱机制
1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer): 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int). Java中 ...
- 那些年一起踩过的坑 — java 自动装箱拆箱问题
坑在哪里? 我们都知道Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean 分别有各自对应的包装类型:Integ ...
- Java 的自动装箱拆箱
Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...
- Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?
参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...
- java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容
8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character ...
- Java的自动装箱/拆箱
概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...
随机推荐
- Cocos2d-x中SQLite数据库管理工具
数据库创建完成后,我们可能需要看看数据库中数据是否成功插入,很多人喜欢使用图形界面工具来管理SQLite数据库.SQLite图形界面管理工具有很多,我推荐使用SQLiteStudio工具,下载地址ht ...
- HTML+CSS学习笔记(1) - Html介绍
HTML+CSS学习笔记(1) - Html介绍 1.代码初体验,制作我的第一个网页 <!DOCTYPE HTML> <html> <head> <meta ...
- 【整理】c# 调用windows API(user32.dll)
User32.dll提供了很多可供调用的接口,大致如下(转自http://blog.csdn.net/zhang399401/article/details/6978803) using System ...
- Js 赋值传值和引用传址
赋值传值和引用传址 在JavaScript中基本数据类型都是赋值传值,复合数据类型都是引用传址(传地址) 基本数据类型的变量名和数据是直接存在"快速内存"(栈内存)中,而复合数据类 ...
- Spring boot 1.3.5 RELEASE 官方文档中文翻译--目录
说明: 打算利用闲暇时候翻译一下Spring boot的官方文档,翻译的版本是1.3.5 RELEASE. 做这件事的目的呢有四: 国内中文的Spring boot资料实在不多,希望能给后来人一点小小 ...
- 关于apache Alias斜杠/的实验
1.Alias /icons/ "D:/wamp/bin/apache/Apache2.2.17/icons/" 访问http://localhost/icons/正常,访问htt ...
- 使用Hibernate 拦截执行sql语句,并输出sql语句,获取sql语句
重建包名 org.hibernate.type.descriptor.sql 重建类BasicBinder 代码如下 package org.hibernate.type.descriptor.sql ...
- 谈谈C语言的数据类型
本文摘要: 本文主要讲述C语言中的数据类型,从基本的数据类型到派生的数据类型,从int ,char ,float double ....到指针,数组,函数,指向指针的指针,指向数组的指针,指向函数的指 ...
- dbt
Procedure Relocate(s : state; b : base_index) { Move base for state s to a new place beginning at b ...
- phpstorm配置取消掉63342
http://ask.csdn.net/questions/171665