- 浏览: 592783 次
-
文章分类
最新评论
-
wjwjwjwj:
void T0_Work() //T0定时器调用的工作函数 ...
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连发) -
xouou_53320:
lastSeries 写道前辈,是不是在工作以后连System ...
java学习笔记:TCP通讯,传送任意文件(服务端并发) -
lastSeries:
前辈,是不是在工作以后连System.out.println( ...
java学习笔记:TCP通讯,传送任意文件(服务端并发) -
xouou_53320:
chuanwang66 写道不过改了iconv.exe路径也不 ...
Source Insight 中文乱码,用iconv转码,解决中文乱码问题_20150930更新 -
anazel:
正在学习,多谢分享
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连发)
jdk1.5以后
用Integer举例
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类的源码,我加上了注释,便于讨论
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方法
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 (没有缓存)
补充下我对Integer缓冲池对理解:
(这个观点是我在网上看到的一些资料加上自己看源码后的一些推断,但没有在哪本书上看到过这种说法,最近打算看think in java)
缓冲池是java对系统的优化,它是一种管理内存的机制,是一种数据结构,它可以管理多个缓冲区,IntegerCache就是一个缓冲区,cache[]数组中保存的是指向Integer类型对象的指针,虽然Integer缓冲对象是new出来的,但是是由缓冲池管理,欢迎一起讨论.
然后回答一个网友的提问,问题比较典型,我贴到上面来,
先说String str = "aaa";
"aaa"本身就是一个字符串对象,它在编译时就被定义在了数据区,在运行时直接创建到常量池,或者说数据区,而str是当程序运行到这句代码时系统在内存的栈区分配的一个指针变量,指向了常量池中的"aaa"对象,
如果是String str = new String("aaa"); 在编译时,"aaa"对象被创建到数据区,在运行时执行到new String()时,程序动态的开辟一块内存空间,
并将数据区中的"aaa"对象复制一份到堆中,并返回一个引用给str所在栈中,此时这一条语句创建了1个新的String对象。加上原来在数据区中的对象一共2个对象,不知道我说的对不对,请大家指教..
还有一网友问 "Doulbe没有缓存,能说为啥莫?"
Doulbe (没有缓存)
我也是在网上看到的,我查了下java文档源码
public static Double valueOf(double d) {
return new Double(d);
}
代码中确实没有用到缓冲
对比Integer的valueOf方法,是不一样的,所以才有这个结论的吧!
====================================================
知道了这些原理 我们再来看一些网上关于java的有趣问题,就能知道答案了 下面我们对一网友帖子中的问题的做解答,我当时也是看到这个帖子才baidu学到这些内容的 http://xiaoyu1985ban.iteye.com/blog/1384191 主题: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指向缓冲池中的同一对象
评论
Doulbe (没有缓存)

这2句话,我也是在网上看到的,我查了下java文档源码
public static Double valueOf(double d) {
return new Double(d);
}
它确实没有用到缓冲池
对比Integer的valueOf方法,是不一样的,所以才有这个结论的吧!
你认为呢?
我不是很清楚,
{
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
h = Math.min(i, Integer.MAX_VALUE - -low);
}
这个判断的作用是,cache中的最大值是可以配置的,integerCacheHighPropValue 是胚子的值
哦,多谢
{
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
h = Math.min(i, Integer.MAX_VALUE - -low);
}
这个判断的作用是,cache中的最大值是可以配置的,integerCacheHighPropValue 是胚子的值
而且源码中似乎也是这样的,但我
没有具体看到哪本书上有这个说法,最近打算看看 think in java ,
是啊。我也觉得是这样的啊。我感觉你技术应该不错啊。。
我也比较喜欢研究底层的技术。。源码什么的。。。
而且源码中似乎也是这样的,但我
没有具体看到哪本书上有这个说法,最近打算看看 think in java ,
我觉得是的,因为是new出来的对象,你认为呢?
我觉得有可能啊,就是说不同的引用共享了堆内存。那会不会有可能是和String str = "aaa"中的str一样不放在堆中呢?
先来补充下我对Integer缓冲池对理解:
缓冲池是java对系统的优化,它是一种管理内存的机制,是一种数据结构,它可以管理多个缓冲区,IntegerCache就是一个缓冲区,cache[]数组中保存的是指向Integer类型对象的指针,虽然Integer缓冲对象是new出来的,但是是由缓冲池管理,我没有书本,这个理解方式只是看源代码自己想的,可能不对,欢迎一起讨论.
然后说String str = "aaa";
"aaa"本身就是一个字符串对象,它在编译时就被定义在了数据区,在运行时直接创建到常量池,或者说数据区,而str是当程序运行到这句代码时系统在内存的栈区分配的一个指针变量,指向了常量池中的"aaa"对象,
如果是String str = new String("aaa"); 在编译时,"aaa"对象被创建到数据区,在运行时执行到new String()时,程序动态的开辟一块内存空间,
并将数据区中的"aaa"对象复制一份放到堆中,并返回一个引用复制到str所在栈中,此时这一条语句创建了1个新的String对象。加上原来在数据区中的对象一共2个对象,不知道我说的对不对,仅供讨论..
我觉得是的,因为是new出来的对象,你认为呢?
我觉得有可能啊,就是说不同的引用共享了堆内存。那会不会有可能是和String str = "aaa"中的str一样不放在堆中呢?
先来补充下我对Integer缓冲池对理解:
缓冲池是java对系统的优化,它是一种管理内存的机制,是一种数据结构,它可以管理多个缓冲区,IntegerCache就是一个缓冲区,cache[]数组中保存的是指向Integer类型对象的指针,虽然Integer缓冲对象是new出来的,但是是由缓冲池管理,我没有书本,这个理解方式只是看源代码自己想的,可能不对,欢迎一起讨论.
然后说String str = "aaa";
"aaa"本身就是一个字符串对象,它在编译时就被定义在了数据区,在运行时直接创建到常量池,或者说数据区,而str是当程序运行到这句代码时系统在内存的栈区分配的一个指针变量,指向了常量池中的"aaa"对象,
如果是String str = new String("aaa"); 在编译时,"aaa"对象被创建到数据区,在运行时执行到new String()时,程序动态的开辟一块内存空间,
并将数据区中的"aaa"对象复制一份放到堆中,并返回一个引用复制到str所在栈中,此时这一条语句创建了1个新的String对象。加上原来在数据区中的对象一共2个对象,不知道我说的对不对,仅供讨论..
不错、、这位童鞋理解的很到位
我觉得是的,因为是new出来的对象,你认为呢?
我觉得有可能啊,就是说不同的引用共享了堆内存。那会不会有可能是和String str = "aaa"中的str一样不放在堆中呢?
先来补充下我对Integer缓冲池对理解:
缓冲池是java对系统的优化,它是一种管理内存的机制,是一种数据结构,它可以管理多个缓冲区,IntegerCache就是一个缓冲区,cache[]数组中保存的是指向Integer类型对象的指针,虽然Integer缓冲对象是new出来的,但是是由缓冲池管理,我没有书本,这个理解方式只是看源代码自己想的,可能不对,欢迎一起讨论.
然后说String str = "aaa";
"aaa"本身就是一个字符串对象,它在编译时就被定义在了数据区,在运行时直接创建到常量池,或者说数据区,而str是当程序运行到这句代码时系统在内存的栈区分配的一个指针变量,指向了常量池中的"aaa"对象,
如果是String str = new String("aaa"); 在编译时,"aaa"对象被创建到数据区,在运行时执行到new String()时,程序动态的开辟一块内存空间,
并将数据区中的"aaa"对象复制一份放到堆中,并返回一个引用复制到str所在栈中,此时这一条语句创建了1个新的String对象。加上原来在数据区中的对象一共2个对象,不知道我说的对不对,仅供讨论..
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
Doulbe (没有缓存)

这2句话,我也是在网上看到的,我查了下java文档源码
public static Double valueOf(double d) {
return new Double(d);
}
它确实没有用到缓冲池
对比Integer的valueOf方法,是不一样的,所以才有这个结论的吧!
你认为呢?
Doulbe (没有缓存)

我觉得是的,因为是new出来的对象,你认为呢?
我觉得有可能啊,就是说不同的引用共享了堆内存。那会不会有可能是和String str = "aaa"中的str一样不放在堆中呢?
我觉得是的,因为是new出来的对象,你认为呢?
2楼的朋友可以编译的 ,我的是jdk7
Integer b = 156;
胡扯这样写jdk编译都不会通过需要转换成int类型的
Integer b = 156;
胡扯这样写jdk编译都不会通过需要转换成int类型的
发表评论
-
java学习笔记:内部类实现单链表
2012-02-18 10:12 2458/* 第一个节点称 ... -
java学习笔记:龙抓手之抓取网页中的邮件地址
2012-02-12 23:08 1230/* 正则表达式 [示例]: ... -
java学习笔记:模拟浏览器,访问网址
2012-02-04 19:05 4837/* 使用UI界面,输入 ... -
java学习笔记:TCP通讯,传送任意文件(服务端并发)
2012-01-31 19:46 18703/* TCP通讯 ... -
java学习笔记:TCP通讯应用,传送文本文件
2012-01-29 13:28 2015/* TCP通讯 [示例]:传送文本文件 ... -
java学习笔记:TCP通信应用,字符大写转换服务器
2012-01-28 18:30 2172先启动服务端 再启动客户端,并输入字符 Student ... -
java学习笔记: 实现简易局域网聊天程序
2012-01-18 19:50 2485/* 使用UDP模式,编写一个聊天程序 有发送和接收 ... -
java学习笔记:字符的编码与解码练习
2012-01-08 22:06 1783编码:字符串转成字符数组 解码:字节数组转成字符串 ... -
java学习笔记:常见字符编码和编码头BOM
2012-01-07 23:24 6467ANSI(American National Standa ... -
java类初始化过程
2012-01-03 21:53 2586/* 测试3个内容: 类加载顺序 子父类执行 ... -
java学习笔记:管道流PipedInputStream和PipedOutputStream
2012-01-03 13:39 14817/* 管道流: PipedInputStr ... -
java学习笔记:文件的分割合并
2012-01-02 20:40 1495/* 分割合并小文件 在c盘先手动粘贴一个jpg ... -
元旦恶搞:模仿360和QQ大战(献给2011网络流行新词榜!)
2011-12-30 20:45 1601元旦即将来临,谨以此文献给2011网络流行新词榜... 榜首 ... -
java学习笔记:File类的listFiles方法,及使用匿名内部类和递归调用
2011-12-27 21:21 138841.File类的带参数的list方法的使用 2.复习使用匿名 ... -
java学习笔记:关于IO转换流InputStreamReader和OutputStreamWriter
2011-12-24 09:43 122191 字节流InputStream ... -
java自动编译批处理
2011-11-26 11:29 2105最近开始学习java 教程中用的是dos命令行环境, 每次 ...
相关推荐
- 字符串池:Java为优化字符串操作提供,常量池的一部分。 - 字符串创建的区别: - `String s = "abc"`:直接引用字符串池中的对象。 - `String s = new String("abc")`:创建新的String对象。 - 字符串连接...
在Java中,包装类型具有缓冲池机制,以提高性能。 1. **Integer缓存池**:在-128到127的整数值范围内,Integer对象会复用已存在的实例,避免重复创建。这是因为Integer类中有一个私有的静态内部类IntegerCache,它...
- **作用**:装箱和拆箱。 - **构造方法**:`new Integer(10);` - **常用方法**: - `parseInt(String s)`:字符串转整数。 - `toString(int i)`:整数转字符串。 **3.3 Math类** - **常用方法**: - `abs...
以上是根据传智播客视频JavaSE学习笔记总结的关键知识点,覆盖了Java基础环境配置、字符串操作、多线程编程、集合框架、输入输出流、网络编程、反射机制、正则表达式等多个方面,希望对Java初学者和进阶者有所帮助。
少儿编程scratch项目源代码文件案例素材-直升机飞行.zip
wanjunshe_Python-Tensorflow_12888_1745868924470
健康监测_Android开发_BLE蓝牙通信_心率数据采集与存储_基于小米手环2的实时心率监测应用_支持后台长时间运行的心率记录工具_可导出SQLite数据库的心率数据分析系统_适
少儿编程scratch项目源代码文件案例素材-种花模拟器.zip
嵌入式系统开发_FreeRTOS实时操作系统_STM32F103C8T6微控制器_OLED显示屏_DHT11温湿度传感器_多任务调度_多级菜单设计_万年历算法_电子闹钟功能_参数配
基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
scratch少儿编程逻辑思维游戏源码-猫猫粉碎.zip
scratch少儿编程逻辑思维游戏源码-蓝胡子.zip
scratch少儿编程逻辑思维游戏源码-美食大亨.zip
scratch少儿编程逻辑思维游戏源码-洛克人.zip
scratch少儿编程逻辑思维游戏源码-龙冲刺.zip
思幻个人引导页V2.2版本11月29日更新.zip
scratch少儿编程逻辑思维游戏源码-骑士风斩法.zip
移动应用开发_H5CSS3ionicng-cordovaMVVM模式_基于HTML5和CSS3技术实现多页面布局ionic指令数据绑定ui-route单页跳转调用手机
少儿编程scratch项目源代码文件案例素材-植物大战僵尸创造版 Ver. 1.0.3.zip
scratch少儿编程逻辑思维游戏源码-日落(2).zip