抽象类Number是BigDecimal, BigInteger,Byte,Double,Float,Integer, Long, Short类的父类,实现了java.io.Serializable接口,这个接口以后再说。其中的抽象方法主要是基本数据类型的转换,这些方法都可能涉及到四舍五入和截断

Integer类

实现了父类的抽象方法,利用的机制是强制类型转换。

  • 成员变量
public static final int   MIN_VALUE = 0x80000000;
public static final int   MAX_VALUE = 0x7fffffff;

最大值和最小值,大小都是32位int的最大值和最小值

public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");

类实例的基本类型

final static char[] digits = {'0' , '1' , '2' , '3' , '4' , '5' ,'6' , '7' , '8' , '9' , 'a' , 'b' ,'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,'o' , 'p' , 'q' , 'r' , 's' , 't' ,'u' , 'v' , 'w' , 'x' , 'y' , 'z'};

所有可能的字母,在数字转String的时候用到

final static char [] DigitTens = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0','1', '1', '1', '1', '1', '1', '1', '1', '1', '1','2', '2', '2', '2', '2', '2', '2', '2', '2', '2','3', '3', '3', '3', '3', '3', '3', '3', '3', '3','4', '4', '4', '4', '4', '4', '4', '4', '4', '4','5', '5', '5', '5', '5', '5', '5', '5', '5', '5','6', '6', '6', '6', '6', '6', '6', '6', '6', '6','7', '7', '7', '7', '7', '7', '7', '7', '7', '7','8', '8', '8', '8', '8', '8', '8', '8', '8', '8','9', '9', '9', '9', '9', '9', '9', '9', '9', '9',} ;final static char [] DigitOnes = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9',} ;

这两组变量是String转数字的时候使用,当数字大于65536时,一次转换两位数字,DigitTens 是十位数,DigitOnes 是个位数

final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,99999999, 999999999, Integer.MAX_VALUE };

此变量是用于判断数字的位数,当小于等于sizeTable[i]时,位数为i+1

private final int value;

类实例中存储数据的成员变量

public static final int SIZE = 32;

记录了最长位数的Integer

  • 构造函数

有两个构造函数,分别是:

public Integer(int value) {this.value = value;
}

参数为一个int,赋值给value,另一个构造函数为

public Integer(String s) throws NumberFormatException {this.value = parseInt(s, 10);}

参数为String,调用本类中的parseInt以默认10进制的方式解析成int类型数据,再赋值。

  • 其他函数
public static int parseInt(String s, int radix)throws NumberFormatException
{...return negative ? result : -result;
}public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);
}

参数有两个,s:被解析的字符串,radix:进制(默认是10进制)。排除掉所有的异常后,实现的细节是先取得字符转是否有负号,遍历字符串,得到result,最后加上负号。

public static String toString(int i, int radix) {...if (radix == 10) {return toString(i);}...return new String(buf, charPos, (33 - charPos));
}
public static String toString(int i) {...return new String(buf, true);
}
public String toString() {return toString(value);
}

转字符串的函数,传入的参数还是有进制,当进制为10时,调用另一个重载函数,无参数的函数返回的是value的10进制形式。

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}}

有一个静态嵌套类,定义的是一个缓存,默认值为[-128,127],可以通过设置JVM的参数修改这个缓存区间的最大值,缓存中会提前新建好数组存储缓存区间的对象。在进行解码String的时候,是调用了缓存的,除此之外,什么地方还用到了这个缓存呢?

当我们直接使用整数创建Integer对象时,调用的是valueOf函数,如下

Integer a = 100;//调用valueOf函数创建对象,可以反汇编、设断点去看
public final class Integer extends Number{public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
}

当a的值在缓存区间的时候,那么直接返回缓存的对象,而且下次定义b也等于100的话,a==b的结果是true,因为使用的是同一个对象,如果a和b的值在缓存区间外的话,a==b的结果是false,当然可以通过JVM的参数,设置这个缓存区间。

Short类、Byte类、Long类

都跟Integer很像,其中不少方法也是借鉴了Integer类中的方法去实现,其中一个比较重要的点是,他们中的缓存是固定长度的,是直接写死的。

Float类、Double类

与之前的实现细节是一样的,只是多了很多对浮点的处理

阅读源码为JDK1.7

number 限制最长数字_Java源码阅读-Number相关推荐

  1. 新版NFT数字藏品源码系统源码+已接支付

    正文: 新版NFT数字藏品源码系统源码+已接支付,其它的就没什么好介绍的了,有兴趣的自行拿去研究吧. 程序: wwtegs.lanzoub.com/iUs7u0888jwb 图片:

  2. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】

    卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...

  3. NFT数藏源码/数字藏品源码/space数藏源码

    NFT数藏源码/数字藏品源码/space数藏源码 ☑️ 编号:ym462 ☑️ 品牌:无 ☑️ 语言:ThinkPHP ☑️ 大小:65.3MB ☑️ 类型:NFT数藏源码 ☑️ 支持:PC+WAP

  4. 数字藏品源码APP商城开发团队

    数字藏品源码APP商城开发团队,数字藏品商城软件开发,数字藏品分销模式开发,数字藏品交易平台开发,数字藏品现成源码软件定制,微信分销返利制度开发,NFT数字藏品平台开发定制,数字藏品系统多少钱? 在全 ...

  5. 20221105新手老手怎么把网站权重提高收录提高最新php轻量级插件网站权重8怎么上去的seo到底怎么做看完本视频你就懂了许多了本插件适合所有网站所有cms长河网zhetiaohe源码无加密

    网站权重8怎么上去的seo到底怎么做,看完本视频你就懂了许多了,本插件适合所有网站所有cms长河网zhetiaohe源码无加密,对网站学习爱好者有大大的帮助 网站权重8怎么上去的seo到底怎么做,看完 ...

  6. 以太坊源码阅读5——POW源码分析

    以太坊源码阅读5--POW源码分析 介绍 POW,proof of work,即工作量证明,是著名公bitcoin所采用的共识算法.简单来说,pow就是一个证明,由矿工使用算力进行计算(挖矿),竞争记 ...

  7. 源码阅读:SDWebImage(六)——SDWebImageCoderHelper

    该文章阅读的SDWebImage的版本为4.3.3. 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理. 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算 ...

  8. 代码分析:NASM源码阅读笔记

    NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...

  9. 超像素SLIC算法源码阅读

    超像素SLIC算法源码阅读 超像素SLIC算法源码阅读 SLIC简介 源码阅读 实验结果 其他超像素算法对比 超像素SLIC算法源码阅读 SLIC简介 SLIC的全称Simple Linear Ite ...

最新文章

  1. Nature科学报告:根据大脑思维意图来生成对应匹配的图像
  2. Qt中线程的生命期问题
  3. MySql下视图的创建
  4. 【django】全局上下文
  5. 视频 + PPT 下载 | 挣脱流量束缚,社交电商的未来在哪里?
  6. 汇编 db,dw,dd
  7. 如何禁用计算机的服务,如何彻底禁用电脑中的迅雷服务XLservicePlatform
  8. python装饰器函数执行后日志_python使用装饰器作日志处理的方法
  9. 【STM32】STM32F4 CAN2只能发送无法接收问题解决
  10. 获取本地IP和端口号的指令
  11. 移动端 js 弹出层内容滚动的时候,不影响body的滚动条处理
  12. 不学无数——JAVA中NIO再深入
  13. 十四.jmter图形监控扩展
  14. eclipse 版本 发行版本
  15. IDEA: 遇到问题Error during artifact deployment. See server log for details,解决
  16. ctrl键失灵的问题-记kali 1.0升级kali 2.0
  17. uniapp-微信小程序-ios音乐播放没声音
  18. 【机器学习】一文读懂正则化与LASSO回归,Ridge回归
  19. pikachu——简介
  20. 《江城子·乙卯正月二十日夜记梦》古词鉴赏

热门文章

  1. POJ 1189 钉子和小球
  2. jquerymobile使用技巧
  3. 产品专家Marty Cagan:不做仅仅会编码的人
  4. PHP编写命令行脚本和后台运行程序的注意事项
  5. IBM收购Rational一年总结
  6. 线性回归与 logistic回归
  7. 第三章 随机变量的数字特征
  8. java dictionary遍历_遍历 Dictionary,你会几种方式?
  9. python获取页面隐藏元素_selenium操作隐藏的元素(python+Java)
  10. raid5需要几块硬盘_Raid5磁盘阵列数据恢复思路分析--附真实案例