黑马程序员之装箱与拆箱(享元设计模式的应用)
来源:互联网 发布:jumpsoles 淘宝 编辑:程序博客网 时间:2024/05/22 01:33
------- android培训、java培训、期待与您交流! ----------
下面这个小例子,有一个注意点就是:对于-128~127之间的数转化成的Integer对象,用==比较结果是相等的,也就是返回结果是true;而在这个范围外的用==比较结果是不相等的,也就是false的。
总结:
/**
* 上面说的这种情况,其实是一个设计模式:把一个字节内-128~127之间的数分别封装成256个Integer对象,存储到内存缓存区, 程序中用到的所有数字(比如3),都共享一个3的对象,不用每次都去创建一个新的3的对象,这样节约了资源。
* 享元设计模式flyweight:运用共享技术有效地支持大量细粒度的对象。
* 也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。
* 比如说一个文本系统,每个字母定义一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。
* 如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。
* 那么如果要是每个字母都共享一个对象,就大大节约了资源。
* 比如:在windows系统,需要很多图标,使用频率很高,把它定义成一个对象,
* 不同的属性变成外部状态,相同的属性编成内部状态
*/
* 上面说的这种情况,其实是一个设计模式:把一个字节内-128~127之间的数分别封装成256个Integer对象,存储到内存缓存区, 程序中用到的所有数字(比如3),都共享一个3的对象,不用每次都去创建一个新的3的对象,这样节约了资源。
* 享元设计模式flyweight:运用共享技术有效地支持大量细粒度的对象。
* 也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。
* 比如说一个文本系统,每个字母定义一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。
* 如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。
* 那么如果要是每个字母都共享一个对象,就大大节约了资源。
* 比如:在windows系统,需要很多图标,使用频率很高,把它定义成一个对象,
* 不同的属性变成外部状态,相同的属性编成内部状态
*/
package fighting;
/**
* 装箱与拆箱
*
*/
public class AutoBox {
public static void main(String[] args) {
//jdk1.5以前这样直接把基本数据类型赋给一个对象是不对的,装箱与拆箱算是Jdk1.5的新特性
//装箱,jdk1.5自动把基本数据类型int装箱成一个Integer对象
Integer iObj = 3;
//拆箱:Integer对象是不支持加法的,
//看下面这句代码,之所以能够直接用Integer对象和12相加,
//是因为jdk1.5会把iObj转换成基本类型(即拆箱),再进行相加
System.out.println(iObj+12);//15
Integer i1 =13;
Integer i2 =13;
System.out.println(i1==i2);//true
Integer i3 =137;
Integer i4 =137;
System.out.println(i3==i4);//false
System.out.println(i3.equals(i4));//true
//对于基本数据类型的整数-128~127之间的数据在装箱成Integer对象的时候,
//会把它们放到一个缓存区,等下次要把基本类型当成Integer对象使用的时候,
//会先看缓存区有没有这个,因为一般小的整数使用的频率比较高
//大的整数(在-128~127之外的数)装箱后,拆箱出来会是不同的整数。
Integer i5 = Integer.valueOf(3);
Integer i6 = Integer.valueOf(3);
System.out.println(i5==i6);//true
Integer i7 = Integer.valueOf(128);
Integer i8 = Integer.valueOf(128);
System.out.println(i7==i8);//false
System.out.println(i7.equals(i8));//true
/**
* 装箱与拆箱
*
*/
public class AutoBox {
public static void main(String[] args) {
//jdk1.5以前这样直接把基本数据类型赋给一个对象是不对的,装箱与拆箱算是Jdk1.5的新特性
//装箱,jdk1.5自动把基本数据类型int装箱成一个Integer对象
Integer iObj = 3;
//拆箱:Integer对象是不支持加法的,
//看下面这句代码,之所以能够直接用Integer对象和12相加,
//是因为jdk1.5会把iObj转换成基本类型(即拆箱),再进行相加
System.out.println(iObj+12);//15
Integer i1 =13;
Integer i2 =13;
System.out.println(i1==i2);//true
Integer i3 =137;
Integer i4 =137;
System.out.println(i3==i4);//false
System.out.println(i3.equals(i4));//true
//对于基本数据类型的整数-128~127之间的数据在装箱成Integer对象的时候,
//会把它们放到一个缓存区,等下次要把基本类型当成Integer对象使用的时候,
//会先看缓存区有没有这个,因为一般小的整数使用的频率比较高
//大的整数(在-128~127之外的数)装箱后,拆箱出来会是不同的整数。
Integer i5 = Integer.valueOf(3);
Integer i6 = Integer.valueOf(3);
System.out.println(i5==i6);//true
Integer i7 = Integer.valueOf(128);
Integer i8 = Integer.valueOf(128);
System.out.println(i7==i8);//false
System.out.println(i7.equals(i8));//true
}
}
}
在此,在总结一下:equals和==的区别?
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。
- 黑马程序员之装箱与拆箱(享元设计模式的应用)
- 黑马程序员_ java高新之自动装箱与拆箱(引入设计模式:享元模式)
- 黑马程序员:装箱拆箱与享元模式
- 黑马程序员--高新技术--静态导入,基本数据类型拆箱与装箱,享元设计模式
- 《黑马程序员》 jdk 1.5的新特性:自动装箱与拆箱练习及享元设计模式
- 黑马程序员Java基础之泛型(Genric)、拆箱与装箱、享元模式
- 黑马程序员--基本数据类型的自动装箱与拆箱(享元模式的初步认识)
- 《黑马程序员》自动装箱拆箱 (享元模式)
- 黑马程序员--张孝祥Java高新技术-JDK1.5新特性(二)【基本数据类型的自动拆箱与装箱,枚举】以及享元设计模式
- 黑马程序员_加强11_基本数据类型的自动拆箱与装箱+享元模式
- 黑马程序员_可变参数、增强for循环、基本数据类型的自动装箱与拆箱、享元模式
- 自动装箱与拆箱引发的享元设计模式
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- 黑马程序员——静态导入,可变参数,自动拆箱装箱以及享元设计模式 JDK1.5新特性
- 黑马程序员——Java1.5新特性之享元模式、增强for循环、可变参数、静态导入、自动装箱和拆箱
- 【自动装箱、自动拆箱】享元设计模式:对于小的整数,装箱装成的对象都是同一个
- 黑马程序员 高新技术之可变参数与装箱拆箱
- 黑马程序员----java设计模式之装饰设计模式和享元设计模式
- 逆向一个三层循环的算法
- 搭建可复用的游戏服务器框架的思路
- 获取手机中安装的所有应用程序
- Android_AsyncTask详解及其应用(三)_图片错位以及AsyncTask重复创建的问题
- Android开发:系统自动实现开机启动
- 黑马程序员之装箱与拆箱(享元设计模式的应用)
- 游戏服务器的总体框架
- 逆向随机生成100个数
- JAVA工厂模式举例
- 消息中间件的比较-转载
- Android_AsyncTask详解及其应用(二 )_RejectedExecutionException问题
- Android UI设计
- 计算无符号整型变量的二进制中的1的个数
- 逆向判断素数