number 限制最长数字_Java源码阅读-Number

3e174aba30e0c5d0bbab783d16143c5d.png

抽象类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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(JavaScript)实现在客户端动态改变Treeview节点的选中状态

Asp.net 2.0 中的 Treeview 非常好用&#xff0c;而且轻便。但在使用过程中&#xff0c;往往会发现一些不够人性化的地方。例如您要设计一棵树&#xff0c;里面放置了一些收藏的网址。在这棵树中&#xff0c;节点的 SelectAction 只有 Expand 和 NavigateUrl 状态&#xff0c;也…

【转】Castle中AdditionalInterfaces用法介绍

首先见下图&#xff08;图一&#xff09;&#xff0c;其中FooController是一个没有实现任何Interface的空类。需要实现的效果是&#xff1a;通过FooController对象调用FooService的Do方法。设置这一不常见的场景主要是为了说明Castle中AdditionalInterfaces的用法。 这个场景诡…

WinCE上BINFS实现详解

网上不少介绍三星24x0系列的BINFS启动方式实现&#xff0c;有 些内容上描述的不是非常全面。 下面就WinCE6上的BINFS实现&#xff0c;从基本原理到修改BSP &#xff0c;再到如何烧录启动做一个较全面的讲解。 一 BINFS到底是什么&#xff1f; 其实BINFS就是MS给CE做的一种存放…

服务器升级文件 不推送就无法打开吗,Win7升Windows10有获取通知,但是就不推送的解决方法...

js鼠标滚轮滚动图片切换效果效果体验网址:http://keleyi.com/keleyi/phtml/image/12.htm HTML文件代码: /p>Python for Infomatics 第12章 网络编程六(译)注:文章原文为Dr. Charles Severance 的 .文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...Linux下配置…

ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg

实测成功环境: WIN7 VS2013 FFmpeg4.3 和 WIN10 VS2019 FFmpeg4.3(N-98819-ge2589ac)源码下载FFmpeg源码依赖工具MSYS2​YASM下载安装MSYS2&#xff1b; 下载YASM,将文件名改为yasm.exe,将它所在的目录加入到环境变量中。配置头文件和库搜索路径以下几种方法任选一种1.使用…

自动化测试框架:没有Surprise的原因

今日将框架完整走通&#xff0c;给测试试用。但从测试表情看&#xff0c;显然没有Surprise的意思&#xff0c;反而有种因为改变使用习惯并要学习新框架的厌烦。 尽管事前&#xff0c;我们已经对需求做过自认为相当全面的分析&#xff0c;而且在框架设计上也充分进行了斟酌和权衡…

【转】阿里技术专家详解 DDD 系列 第一讲- Domain Primitive

导读 对于一个架构师来说&#xff0c;在软件开发中如何降低系统复杂度是一个永恒的挑战&#xff0c;无论是 94 年 GoF 的 Design Patterns &#xff0c; 99 年的 Martin Fowler 的 Refactoring &#xff0c; 02 年的 P of EAA &#xff0c;还是 03 年的 Enterprise Integratio…

wince编译报错

新建了工程&#xff0c;加入之前完整的BSP&#xff0c;怎么也编译不过&#xff0c;提示&#xff1a; [01:0000009403:ERRORE] NMAKE : U1073: dont know how to make C:\WINCE600\OSDesigns\xyjhht30\xyjhht30\Wince600\SMDK6410_ARMV4I\cesysgen\sdk\lib\ARMV4I\retail\ddraw.…

服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...

java中怎么用tcp/ip将服务器的消息发送给多个用户关注:253 答案:2 mip版解决时间 2021-01-31 01:26提问者╬═掵中注定2021-01-30 20:03java中怎么用tcp/ip将服务器的消息发送给多个用户最佳答案二级知识专家往事叫我剪短发2021-01-30 20:09你服务器accept方法后是不是会得到…

stick和stuck的区别_怎样区别“stick to”、“stick with”和“stick by”这三个表达?...

我小时候有一次把口香糖粘到头发里去了。Verb form: stick, stuck, stuckVerb form: stick, stuck, stuck动词形式&#xff1a;stick, stuck(过去式), stuck(过去分词)2、Stick to:字面意思&#xff1a;粘着字面意思&#xff1a;粘着E.g.The gum is stuck to my shoe.香糖粘我鞋…

VS2005 .vs. Orcas

这两天正在开发自己的一套信息管理系统&#xff0c;开发环境采用 VS2005 C# XP。由于习惯用Dreamweaver 布局&#xff0c;这可好&#xff0c;在DW中布局完成之后&#xff0c;在VS中就完全走形了。郁闷!刚好龙卷风版 Vista 有了&#xff0c;那就装一个试试IIS7和 Orcas。Good&…

解析NK.BIN

最近做NBOOT&#xff0c;EBOOT&#xff0c;对TOC参数不是很明白&#xff0c;老大说得先熟悉一下NK.bin。故找到以下好文&#xff0c;对NK.bin有了一个深入的了解。感谢作者。 study NK.bin format The information from WINCE500\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\VI…

查询链接服务器信息,SQL Server链接服务器

SQL Server提供链接到另一个服务器的选项。这通常被用来连接到其他SQL Server数据库&#xff0c;但它也可以被用来连接到一个Microsoft Access数据库。这是通过链接服务器节点成为可能。链接服务器节点可以连接到另一个数据库&#xff0c;通常/通常在不同的机器上运行&#xff…

【转】阿里技术专家详解DDD系列 第二讲 - 应用架构

填坑。谢谢大家对这个系列的期待&#xff0c;持续更新&#xff0c;欢迎关注此账号。 第一篇内容附地址&#xff1a; 阿里巴巴淘系技术&#xff1a;阿里技术专家详解 DDD 系列 第一讲- Domain Primitive​zhuanlan.zhihu.com 架构这个词源于英文里的“Architecture“&#xff…

正三角形旋转一周得到的图形是_七年级数学上册_第一章《基本的几何图形》_知识点...

第一章 基本的几何图形复习范围&#xff1a;基本的几何图形知识点回顾&#xff1a;知识点一&#xff1a;几何体的认识1.我们常见的几何体有&#xff1a;正方体、长方体、圆锥、圆柱、棱柱、棱台、棱锥、球&#xff0c;其中____________属于柱体&#xff0c; _________属于锥体。…

CEO、COO、CFO、CTO、CIO是什么意思

CEO(Chief executive officer)首席执行官 类似总经理、总裁&#xff0c;是企业的法人代表。COO(Chief operating officer)首席运营官 类似常务总经理CFO(Chief financial officer)首席财务官 类似财务总经理CTO(Chief technology officer)首席技术官 类似总工程师CIO(Chief inf…

Nand Flash原理分析与编程

NAND Flash 在嵌入式系统中的地位与PC机上的硬盘是类似的。用于保存系统运行所必需的操作系统&#xff0c;应用程序&#xff0c;用户数据&#xff0c;运行过程中产生的各类数据&#xff0c;系统掉电后数据不会护丢失。现在的Flash主要有两咱&#xff0c;一种是NAND Flash 一种是…

NetTiers模板中各个选项的一些解释

名称ChooseSourceDatabase选择数据库MappingFileMapping文件位置(会根据output目录自动更改,不需要设置)OutputDirectory文件输出目录RootNameSpace根节点的命名空间Filter by Individual Objects - OptionalEnumTables枚举表,表中的所有数据都会被用作枚举类型,要求:第一列为主…

php调用谷歌翻译接口_一个google翻译的php调用方式

直接看代码<?php /*** translate()** 翻译函数** param mixed $text 待翻译的内容* param string $language 翻译的语言&#xff0c;格式为 当前语言|目标语言* return*/function translate($text,$languagezh-cn|en){if(empty($text)){return false;}set_time_limit(0);$h…

【转】应用架构之道:分离业务逻辑和技术细节

架构 什么是架构&#xff1f; 关于架构这个概念很难给出一个明确的定义&#xff0c;也没有一个标准的定义。 硬是要给一个概述&#xff0c;我认为架构就是对系统中的实体以及实体之间的关系所进行的抽象描述。 架构始于建筑&#xff0c;是因为人类发展&#xff08;原始人自…