number 限制最长数字_Java源码阅读-Number
抽象类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相关推荐
- 新版NFT数字藏品源码系统源码+已接支付
正文: 新版NFT数字藏品源码系统源码+已接支付,其它的就没什么好介绍的了,有兴趣的自行拿去研究吧. 程序: wwtegs.lanzoub.com/iUs7u0888jwb 图片:
- 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】
卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...
- NFT数藏源码/数字藏品源码/space数藏源码
NFT数藏源码/数字藏品源码/space数藏源码 ☑️ 编号:ym462 ☑️ 品牌:无 ☑️ 语言:ThinkPHP ☑️ 大小:65.3MB ☑️ 类型:NFT数藏源码 ☑️ 支持:PC+WAP
- 数字藏品源码APP商城开发团队
数字藏品源码APP商城开发团队,数字藏品商城软件开发,数字藏品分销模式开发,数字藏品交易平台开发,数字藏品现成源码软件定制,微信分销返利制度开发,NFT数字藏品平台开发定制,数字藏品系统多少钱? 在全 ...
- 20221105新手老手怎么把网站权重提高收录提高最新php轻量级插件网站权重8怎么上去的seo到底怎么做看完本视频你就懂了许多了本插件适合所有网站所有cms长河网zhetiaohe源码无加密
网站权重8怎么上去的seo到底怎么做,看完本视频你就懂了许多了,本插件适合所有网站所有cms长河网zhetiaohe源码无加密,对网站学习爱好者有大大的帮助 网站权重8怎么上去的seo到底怎么做,看完 ...
- 以太坊源码阅读5——POW源码分析
以太坊源码阅读5--POW源码分析 介绍 POW,proof of work,即工作量证明,是著名公bitcoin所采用的共识算法.简单来说,pow就是一个证明,由矿工使用算力进行计算(挖矿),竞争记 ...
- 源码阅读:SDWebImage(六)——SDWebImageCoderHelper
该文章阅读的SDWebImage的版本为4.3.3. 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理. 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算 ...
- 代码分析:NASM源码阅读笔记
NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...
- 超像素SLIC算法源码阅读
超像素SLIC算法源码阅读 超像素SLIC算法源码阅读 SLIC简介 源码阅读 实验结果 其他超像素算法对比 超像素SLIC算法源码阅读 SLIC简介 SLIC的全称Simple Linear Ite ...
最新文章
- Nature科学报告:根据大脑思维意图来生成对应匹配的图像
- Qt中线程的生命期问题
- MySql下视图的创建
- 【django】全局上下文
- 视频 + PPT 下载 | 挣脱流量束缚,社交电商的未来在哪里?
- 汇编 db,dw,dd
- 如何禁用计算机的服务,如何彻底禁用电脑中的迅雷服务XLservicePlatform
- python装饰器函数执行后日志_python使用装饰器作日志处理的方法
- 【STM32】STM32F4 CAN2只能发送无法接收问题解决
- 获取本地IP和端口号的指令
- 移动端 js 弹出层内容滚动的时候,不影响body的滚动条处理
- 不学无数——JAVA中NIO再深入
- 十四.jmter图形监控扩展
- eclipse 版本 发行版本
- IDEA: 遇到问题Error during artifact deployment. See server log for details,解决
- ctrl键失灵的问题-记kali 1.0升级kali 2.0
- uniapp-微信小程序-ios音乐播放没声音
- 【机器学习】一文读懂正则化与LASSO回归,Ridge回归
- pikachu——简介
- 《江城子·乙卯正月二十日夜记梦》古词鉴赏