基本的数据类型分析----java.lang.Number类及其子类分析
本文转自http://blog.csdn.net/springcsc1982/article/details/8788345 感谢作者
编写了一个测试程序,如下:
int a = 1000, b= 1000;
System.out.println(a == b);
Integer c = 1000, d = 1000;
System.out.println(c == d);
Integer e = 100,h = 100;
System.out.println(e == h);
得出了一个惊人的结果,结果为:true,false,true,第一个语句好说,比较的是值,所以结果是true,第二个与第三个,区别就只有数值不同,为什么会得出不同的结果?于是查看源代码寻找答案,原来,所有的数字类都存在缓存机制,只要是-128至127之间的数字都会被缓存,在这个范围之外的数据,则会生成新的对象。
由于程序运行得到的结果较为奇怪,于是开始了寻找答案之路,主要涉及到的类包括:
Java.lang.Integer、java.lang.Number,另外由于Number是所有数值类的父类,所以将其相关的类都学习一遍,
包括
java.lang.Byte,
java.lang.Double,
java.lang.Float,
java.lang.Long,
java.lang.Short
以上各类的关系如下:
从上图中看出,这些数据类都是继承自Number类,Number是一个抽象类,包含了各种数据转换的方法,即转换为各种类型的数据:
public abstract int intValue();
public abstract long longValue();
public abstract float floatValue();
public abstract double doubleValue();
public byte byteValue()
public short shortValue()
我们打开Integer来分析一下:
private static class IntegerCache{
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {//静态代码块,虚拟机装载该类时调用
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];//返回缓存中的对象
}
return new Integer(i);//生成新的对象
}
发现Integer类里面包括了一个内部类,在该类中定义一个缓存数组,在静态代码块中生成一个缓存,并存储256个Integer对象。当传递进来的值在-128至127之间,系统自动获取缓存中的对象,当不在这个区间,系统即生成新的对象,所以,执行代码Integer c = 1000, d = 1000; System.out.println(c== d);时,系统会自动生成两个新对象,自然结果为false,当a=100,b=100时,则打印出来的结果为true.
同理,Long、Float、Double、Byte、Short也存在内部的缓存类LongCache、FloatCache、DoubleCache、ByteCache、ShortCache。
我们再来看看Integer类的一些属性与方法:
Size属性:即比特数,Integer为32位,Double为64位,Long也是64位,Float为32个位,Short为16位,Byte为8位
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
Class.getPrimitiveClass("int"):获取虚拟机级别的int类型,说明Integer与int还是有很大区别的,int是虚拟机内部的类型,而Integer不过是在这个类型的基础上进行封装。
toString(int i, int radix) 根据radix进制将数字转换为字符串
toHexString 按照16进制输出
toOctalString 按照8进制输出
toBinaryString 按照二进制输出
stringSize 返回十进制的X位数
parseInt(String s, int radix) 将字符串转换为X进制的整数
parseInt(String s) 默认为十进制的整数
valueOf(String s, int radix) 将字符串转换为X进制的整数,只是返回时new了一个Integer
valueOf(String s,) 默认为十进制的整数,只是返回时new了一个Integer
equals 重写OBJECT的,判断值是否相同,而不是判断对象
getInteger 返回系统属性的数字值,这个方法貌似存在问题
decode 根据字符串解析为Integer类型,字符串可能为X进制
compareTo 比较两个值的大小,分别返回0,1,-1
看完了Integer类,其他类基本是相同的,其他类相关的方法如下:
Byte类,对应虚拟机的byte类
ByteCache 也是在-128到127之间
parseByte 根据X进制转换为Byte类型
valueOf 根据X进制转换为Byte类型,并new一个新的Byte
public static Byte decode(String nm) 根据字符串转换为Byte
compareTo 比较,并返回两个值的差
Double类,对应虚拟机的double
SIZE=64 64个比特,即8个字节
isInfinite 是否无限大无限小
isNaN 判断两个值是否相等
doubleToLongBits long与double都是64位,这个函数是将double转换为long ,因为在JAVA里面,double无法做位运算
longBitsToDouble native方法,应该是bit转为DOUBLE
Float类,相当于虚拟机的float 32位
floatToRawIntBits native方法,float转为int
LongCache,缓存类
highestOneBit 返回Long值的最高一位
lowestOneBit 返回Long值的最低一位
bitCount 返回指定 long 值的二进制补码表示形式中的 1 位的数量
Short相当于虚拟机内部的short 16位,两个字节
基本的数据类型分析----java.lang.Number类及其子类分析的更多相关文章
- 深入研究java.lang.ProcessBuilder类
深入研究java.lang.ProcessBuilder类 一.概述 ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它 ...
- Java 线程--继承java.lang.Thread类实现线程
现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制.先来看线程的基本概念. 线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别: 1.每个进程是一个应用程序,都有 ...
- java.lang.Void类源码解析_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerEx ...
- java.lang.Object类与equals()及toString()的使用
1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...
- 浅析Java.lang.ProcessBuilder类
最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述 P ...
- 浅析Java.lang.Process类
一.概述 Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...
- java.lang.String 类的所有方法
java.lang.String 类的所有方法 方法摘要 char charAt(int index) 返回指定索引处的 char 值. int codePointAt(int index) 返回指定 ...
- 深入研究java.lang.Process类
一.概述 Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的退出状态 ...
- Java反射——java.lang.Class 类简介
Java的基本思想之一是万事万物即对象,类也是一种对象.但是类是什么对象呢?Java中的类是java.lang.Class的实例化对象,这被成为类类型. //java.lang.Class类中的的主要 ...
随机推荐
- 解决WebSocket后台报错:The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session
场景1: 在后台数据对前台页面进行数据实时推送下,后台采取定时查询数据后,推送给前台页面.在这个过程中,前台页面不停的刷新页面,session在不停的关闭和开启,推送数据时,会出现session连接已 ...
- SpringMVC实现Action的两种方式以及与Struts2的区别
4.程序员写的Action可采用哪两种方式? 第一.实现Controller接口第二.继承自AbstractCommandController接口 5.springmvc与struts2的区别? 第一 ...
- PS技巧汇总
一.gif图流程 1:素材图片a 图片b 2:窗口--->时间轴/动画 3:复制所选帧--->设置帧延迟 4:文件--->存储为WEB格式--->gif格式 二.批处理--- ...
- iOS 项目中的常见文件
iOS的笔记-项目中的常见文件 新建一个项目之后,有那么多的文件,下面介绍一下主要的几个. 1.文件名 (1)AppDelegate UIApplication的代理,app收到干扰的时候,进行处 ...
- [ POI 2012 ] Letters
\(\\\) \(Description\) 给出两个长度为 \(N\) 的字符串\(S_1,S_2\),且保证两个字符串中每一个字符出现次数相同. 现在一次操作可以交换相邻的两个字符,问将 \(S_ ...
- java多线程之内存的可见性介绍(备用1)
(仅供参考) a.共享变量的可见能够一定程度保证线程安全,共享变量不可见导致数据不够准确,出现各种各样的问题,导致线程不安全. b.不同线程之间无法直接访问其他线程工作内存中的变量. 1.可见性 2. ...
- 【译】x86程序员手册23-6.5组合页与段保护
6.5 Combining Page and Segment Protection 组合页与段保护 When paging is enabled, the 80386 first evaluates ...
- day18-常用模块III (numpy、pandas、matplotlib)
目录 numpy模块 创建矩阵 获取矩阵的行列数 切割矩阵 矩阵元素替换 矩阵的合并 通过函数创建矩阵 矩阵的运算 矩阵的点乘与转置 矩阵的逆 矩阵的其他操作 numpy.random生成随机数 pa ...
- MxCAD5.2 20181022更新
下载地址: http://www.mxdraw.com/ndetail_10108.html 1. 开放VIP功能,无需购买即可使用 2. 修正一些图纸打开和保存出错的问题 3. 修改填充命令,对某些 ...
- gson序列化后整形变浮点问题解决方案
字段值是json格式的字符串.我需要将这个字段反序列化为List<Map>形式,但是在反序列化后,id变为了1.0. 百度了很多然并卵,最后改用了阿里的fastjson,没问题.(jack ...