JDK自带的缓存--包装类的缓存
关于包装类和基本类型的文章我前面已经整理过了,这里大致罗列下重点。我们主要是想研究下包装类的缓存。
- 1,自动装箱和自动拆箱
java1.5之后就提供了自动装箱和自动拆箱的功能,当然我们也可以手动来装箱和拆箱。
基本类型-->包装类对象:new WrapperClass(primitive),Integer a = new Integer(1);
包装类对象-->基本类型:WrapperIntance.xxxValue(),int intValue = a.intValue();
- 2,包装类和字符串的转换
字符串-->包装类:
包装类提供的parseXxx(String)静态方法,Integer aa = Integer.parseInt("1");
包装类提供的Xxx(String)构造器,Integer cc = new Integer("1");注意,不推荐使用这个,因为不能用缓存了呢
包装类-->字符串:
包装类后面加一个加号,String aaa = new Integer(1) + "";
String类提供的valueOf()方法,String bbb = String.valueOf(a);注意,别用这种,加号运算符编码简单而且高效
- 3,包装类的缓存
ok,现在进入我们的真正主题,缓存。我们先来看一段代码:
public static void main(String[] args)
{
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a == b);//false Integer c = 1;
Integer d = 1;
System.out.println(c == d);//true
}
从上面的代码我们看出,如果我们自己人工来装箱和拆箱的话,系统不会给我们缓存的,输出是false,但是如果我们使用JDK的自动装箱和自动拆箱的话,系统就会给我们缓存起来,输出true。所以以后编码不管是为了编码简洁,还是为了性能,我们直接使用自动装箱和自动拆箱就OK了。
现在我们来研究下包装类的缓存:
打开JDK里面Integer的源码,我们看到该类里面有一个内部类IntegerCache,这个内部类里面定义了一个数组,这个数组就是来放我们的缓存数据的。
static
{
//执行初始化,创建-128到127的Integer实例,并放入cache数组中
for (int k = 0; k < cache.length; k++)
{
cache[k] = new Integer(j++);
}
}
总结:以后我们在使用包装类的时候,不管是处理基本类型还是装换包装类型,或者是操作字符串的相关转换,都使用jdk的自动拆箱和自动装箱功能,不要人工的new Integer实例,这样子就可以使用缓存了。
- 最后补充一点包装类的注意点:
应该认真的体会下设计出包装类的良苦用心。JDK设计包装类出来只是更好的支持基本类型的面向对象编程,并不说说从根本上来取代基本类型。系统提供的自动装箱和拆箱功能也不能用来作为消除基本类型的后门。在使用包装类代码和等价使用基本类型的代码从性能上面对比差了好多,因为每次自动装箱和自动拆箱都会增加性能开销的,所以我们不要滥用,一般来说除了在定义对象属性类型用包装类之外,最好都使用基本类型。
JDK自带的缓存--包装类的缓存的更多相关文章
- JAVA包装类的缓存范围
JAVA包装类的缓存范围 前两天面试遇到两个关于JAVA源码的问题,记录下来提醒自己. 1.写出下面的输出结果 System.out.println(Integer.valueOf("100 ...
- java包装类的缓存机制(转)
出处: java包装类的缓存机制 java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存.提高性能的功能,只有在自动装箱时有效 Integer包装类 举个栗子: Integer a = ...
- 一篇文章带你整明白HTTP缓存知识
最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...
- 01-08-04【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之命名缓存
http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 可以在映射文件中定义命名查询,<query>元素提供了很多属性,可以用 ...
- 带你了解MyBatis一二级缓存
在对数据库进行噼里啪啦的查询时,可能存在多次使用相同的SQL语句去查询数据库,并且结果可能还一样,这时,如果不采取一些措施,每次都从数据库查询,会造成一定资源的浪费,所以Mybatis中提供了一级缓存 ...
- JDK 自带的服务发现框架 ServiceLoader 好用吗?
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 Github · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- JDK自带的LinkedHashMap来实现LRU算法
1 代码如下 public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> { private final i ...
- jdk自带监控程序jvisualvm的使用
监控小程序的配置 生产环境tomcat的配置 编辑应用所在的tomcat服务器下的bin目录下的catalina.sh文件,修改如下: 配置如下内容: export JAVA_OPTS="- ...
- JDK自带线程池学习
JDK自带线程池 线程池的状态 线程有如下状态 RUNNING状态:Accept new tasks and process queued tasks SHUTDOWN状态:Don't accept ...
随机推荐
- Java框架之Spring MVC(二)
一.Spring MVC 验证 JSR 303 是ajvaEE6 中的一项子规范 ,叫 Bean Validation 用于对javaBean中的字段进行校验. 官方的参考实现是: Hibernate ...
- 使用FormatMessage函数编写一个内核错误码查看器
在编写驱动程序的时候,常用的一个结构是NTSTATUS,它来表示操作是否成功,但是对于失败的情况它的返回码过多,不可能记住所有的情况,应用层有一个GetLastError函数,根据这个函数的返回值可以 ...
- Java实现 中文转换成Unicode编码 和 Unicode编码转换成中文
想要实现中文字符转换为Unicode编码的话主要用到的是一个这样的包,自己可以去API文档里面查看下的 java.util.Properties; 直接进入主题吧,主要是 package Test01 ...
- Linux 内核死锁
死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态.当等待的资源一直得不到释放,死锁会一直持续下去.死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行, ...
- Meltdown攻击
Meltdown攻击处理器A级漏洞MELTDOWN(熔毁)和SPECTRE(幽灵)分析报告AntiyLabs • 2018年01月05日 • 漏洞 • 阅读 1162一.概述安天应急处理中心在2018 ...
- [bzoj3048] [Usaco2013 Jan]Cow Lineup
一开始一脸懵逼.. 后来才想到维护一左一右俩指针l和r..表示[l,r]这段内不同种类的数字<=k+1种. 显然最左的.合法的l随着r的增加而不减. 顺便离散化,记一下各个种类数字出现的次数就可 ...
- a*b(mod m)的实现过程
/*a*b (mod m) 的实现过程*/ /*当a,b很大的时候mod m就会产生溢出, 故运用乘法原理转换为加法求解*/ LL multi(LL a, LL b, LL m) { LL exp = ...
- flume1.8 Interceptors拦截器(五)
1. Flume Interceptors Flume有能力修改/删除流程中的events.这是在拦截器(interceptor)的帮助下完成的.拦截器(Interceptors)是实现org.apa ...
- oracle 数据库——知识点总结(加示例)
新入oracle数据库,把目前学到的知识点记录下来,可能都比较基础,但还是比较全的,里面的示例都是自己在PL/SQL中跑过的,如果有错误,还望各位大侠指出哈. 创建用户 1.创建用户(使用管理员身份创 ...
- [学习OpenCV攻略][007][缩小图片]
cvPryDown(输入图片,输出图片) 根据输出图片的大小,把输入图片进行压缩 cvPryUp(输入图片,输出图片) 根据输出图片的大小,把输入图片进行放大 #include "cv.h& ...