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 ...
随机推荐
- 史上最简单的js+css3实现时钟效果
今天我看到百度搜索的时间那个效果不错,于是就产生了模仿一下的效果,不过为了节省时间,就随便布了下局,废话不多说,先看看效果吧,顺便把百度的效果也拿过来. 对比样子差了好多啊,但是基本功能都是实现了的, ...
- python 3.x 与2.x的区别
前言 保持学习的态度,学一门动态语言其实是很早以前的就准备要做的事情,当时还在纠结python与ruby.现在不单单是要学python,还在考虑用它做点什么,这些等后续再说吧,因为看的是python2 ...
- (GO_GTD_1)基于OpenCV和QT,建立Android图像处理程序
一.创建新QT工程 一定要是全英文路径,比如"E:\android_qt_opencv\GO_GTD" 由于我们在安装的时候,选择android的工具链,所以在这里会出现以下选择, ...
- 85、flask之wtforms
本篇导航: wtforms组件的使用 自定义From组件 一.wtforms组件的使用 1.flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进 ...
- Zabbix实战-简易教程--拓扑图(Maps)
一.拓扑图(Maps) 二话不说,有图有真相,先看看效果,再详细讲解配置过程: 图1:全国网络质量图 图2 核心机房网络质量图 二.详细配置 1.添加 map 选择 系统管理-->基础配置-- ...
- Oracle 11G Client 安装就可以用上Oracle11G啦,不用傻傻的安装2G多的Oracle啦,安装特别简单,使用起来更简单
下载地址: http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip 先将下载下来的ZIP文件解压,并运行se ...
- 获取tranform参数函数的封装
平时我们都会去获取元素的各种属性值,例如宽高等等的值!但是tranform是个让人很头疼的点,获取出来的是矩阵,耐何线性代数学的并不是那么6啊. 解决方法的思路:只能采取有点取巧的方法,在我们设置的时 ...
- RabbitMQ的基本使用到高级特性
简介 继上一篇 CentOS上安装RabbitMQ讲述RabbitMQ具体安装后,这一篇讲述RabbitMQ在C#的使用,这里将从基本用法到高级特性的使用讲述. 前序条件 这里需要增加一个用户,并且设 ...
- 接口自动化测试框架 (一) :APIAutoTest框架
前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...
- 【Java学习笔记之七】java函数的语法规则总结
函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. ...