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 ...
随机推荐
- PHP curl请求https遇到的坑
PHP里curl对https的证书配置默认是服务器端要求验证的,如果服务器端没有配置证书验证,则无法请求https路径.如果为了简便使用不需要配置https证书的话,配置curl时将以下两项设置为fa ...
- 豹哥嵌入式讲堂:ARM开发之文件详解(4)- relocatable文件(object, library)
大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的relocatable文件(object, library). 前三节课里,豹哥都是在给大家介绍嵌入式开发中的input文件. ...
- Redis 部署主从哨兵 C#使用,实现自动获取redis缓存 实例1
源码示例下载链接: https://pan.baidu.com/s/1eTA63T4 密码: un96 实现目标:windows 下安装 一台master服务 一台salve redis服务器 并且哨 ...
- JavaScript(二)基本概念
JS区分大小写 html/css 中 标签选择器不区分大小写 id class 选择器区分大小写 其中属性名 属性名 属性值 不区分大小写 行间事件 onclick 等 不区分大小写 而 执 ...
- JSR-303校验类型
空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不是Null还有被Trim的长 ...
- Android 线程_笔记
多线程 一.为什么要使用多线程 1.提高用户体验或避免ANR 在事件处理代码中需要使用多线程,响应时间超过5s,即会出现ANR(Application is not responding),并因为响应 ...
- bootstrap-table操作之“删除”
最近在做一个新的后台管理系统,在对数据进行操作时需要写一个"删除"功能,如图所示: 下面我来描述一下实现过程中出现的bug以及解决方法: 1.href值为空(href=" ...
- bzoj 1415: [Noi2005]聪聪和可可
直接上记忆化搜索 #include<queue> #include<cstdio> #include<algorithm> using namespace std; ...
- hihoCoder 1039:字符消除(字符串处理)
#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...
- Codeforces Round #328 (Div. 2)_A. PawnChess
A. PawnChess time limit per test 1 second memory limit per test 256 megabytes input standard input o ...