Integer 源码记录
Integer
公共方法结构
注意:
- 通过构造函数创建一个Integer对象,每次都会返回一个新的对象,如果使用 == 进行对象的比较,那么结果是false。
public Integer(int value) {this.value = value;}
- 与之对应的是,
valueOf
方法,在Integer类中,默认缓存了 -128——127 的数据,在此范围内的数据,使用 == 进行比较,返回的结果是 true
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
- 在平时的开发过程中,对于 Integer 等包装类进行 相等比较 时,使用 equals 方法
public static int parseInt(String s, int radix)方法
radix
参数,将x进制 转为 10进制compareUnsigned
方法的作用是比较两个整数x
和y
,将它们作为无符号整数进行比较。虽然Java中没有直接的无符号整数类型,但可以通过位操作或加上一个固定偏移量的方式,间接实现无符号整数的比较。
代码解释:
java
复制代码
public static int compareUnsigned(int x, int y) {return compare(x + MIN_VALUE, y + MIN_VALUE);
}
1. 无符号整数比较的背景:
在Java中,int
类型是32位有符号整数,数值范围是从 -2^31
到 2^31 - 1
(即从 -2147483648
到 2147483647
)。当我们使用compare(int x, int y)
方法时,它会进行有符号整数比较,正数总是比负数大。但有时候我们需要像无符号整数一样对两个整数进行比较,也就是不区分正负号。
2. MIN_VALUE的作用:
Integer.MIN_VALUE
是 -2147483648
。在无符号比较中,通过对每个数加上 MIN_VALUE
,我们可以把原本范围为 -2^31
到 2^31 - 1
的有符号整数映射到 0
到 2^32 - 1
的无符号整数范围。这是因为加上 MIN_VALUE
相当于将负数部分映射到无符号整数的高位。
例如:
- 当
x
是负数时,加上MIN_VALUE
使得它变成了一个较大的正数(无符号范围的高位)。 - 当
x
是正数时,加上MIN_VALUE
会把它映射到无符号整数的低位。
3. compare(x + MIN_VALUE, y + MIN_VALUE)
:
Java已经有一个compare(int x, int y)
方法用于比较有符号整数:
compare(x, y)
如果x
小于y
返回负数,x
等于y
返回 0,x
大于y
返回正数。
通过将 x
和 y
都加上 MIN_VALUE
,我们把它们从有符号数空间映射到无符号数空间,然后使用现有的 compare()
方法来比较它们。加上 MIN_VALUE
的这一步确保了两个数都按照无符号整数的逻辑进行比较。
工作示例:
-
输入:
x = -1
,y = 1
(在有符号表示中,-1 比 1 小)转换:
x + MIN_VALUE = -1 + (-2147483648) = 2147483647
和y + MIN_VALUE = 1 + (-2147483648) = -2147483647
比较:
2147483647
比-2147483647
大,因此无符号情况下x > y
。
总结:
- 目的:
compareUnsigned
是为了实现无符号整数的比较。 - 原理: 通过将两个整数加上
MIN_VALUE
,将它们从有符号空间映射到无符号整数空间,然后用已有的compare
方法进行比较。
decode
方法的作用:
- 参数:
String nm
—— 一个表示数字的字符串,可能带有进制前缀(例如,0x
表示十六进制,0
表示八进制)。 - 返回: 返回解析后的
Integer
对象。 - 异常: 如果传入的字符串格式不正确,则抛出
NumberFormatException
异常。
支持的输入格式:
- 十进制(decimal): 普通的数字字符串,例如
"123"
,"456"
. - 十六进制(hexadecimal): 以
"0x"
或"0X"
开头的字符串,例如"0x1A"
,"0XFF"
. - 八进制(octal): 以
"0"
开头的字符串,例如"012"
(解释为八进制,等于十进制的10
)。 - 负数: 负数字符串也被支持,例如
"-0x1F"
(解释为十六进制的负数)或"-077"
(八进制负数)。
getInteger(String nm, Integer val)
方法的主要作用是从系统属性中获取指定名称的属性值,并将其解析为一个 Integer
对象。如果指定的系统属性不存在或无法解析为整数,则返回一个默认值 val
。
方法的作用场景:
- 读取系统属性:
- 系统属性(System Properties)通常是在Java程序启动时通过命令行参数或者运行时环境变量设置的。通过
System.getProperty(String)
方法,开发者可以获取这些属性,getInteger()
扩展了这个功能,将这些属性值解析为整数。
- 系统属性(System Properties)通常是在Java程序启动时通过命令行参数或者运行时环境变量设置的。通过
- 处理可能缺失或格式不正确的系统属性:
- 该方法提供了一个健壮的机制:如果指定的系统属性不存在、属性值为空、格式不正确(如不能被解析为数字),则返回用户指定的默认值。这在开发时非常有用,因为系统属性可能因不同的运行环境或启动配置而有所不同。
适用的场景举例:
-
配置和调优:
- 在企业级应用中,许多配置(如线程池大小、连接超时、缓存大小等)会通过系统属性设置。开发者可以使用
getInteger()
来读取这些配置,并为每个属性提供一个合理的默认值,以确保在没有明确配置的情况下程序依然能运行。
java 复制代码 // 例如,从系统属性获取线程池大小,默认值为10 int threadPoolSize = getInteger("thread.pool.size", 10);
- 在企业级应用中,许多配置(如线程池大小、连接超时、缓存大小等)会通过系统属性设置。开发者可以使用
-
命令行参数传递:
- 一些Java应用程序可能在启动时通过命令行参数(如
Dproperty=value
)传递系统属性。getInteger()
可以从这些命令行参数中获取并解析整数值。
bash 复制代码 java -Dmax.connections=100 MyApplication
在代码中可以使用:
java 复制代码 int maxConnections = getInteger("max.connections", 50); // 如果没有设置,默认为50
- 一些Java应用程序可能在启动时通过命令行参数(如
-
跨平台或环境配置:
- 在不同环境(如开发、测试、生产)中,程序可能需要根据运行环境来调整行为。可以通过系统属性配置不同的参数,而不需要硬编码这些值。
java 复制代码 // 根据系统属性决定是否启用调试模式 int debugLevel = getInteger("debug.level", 0); // 默认不启用调试模式
-
系统配置检查:
- 这个方法可以用来检查Java环境或系统的配置(如最大内存、线程数等),并确保值在可接受的范围内。例如,在启动时可以通过系统属性传递硬件限制参数。
具体行为说明:
- 参数
nm
是要读取的系统属性的名称。 - 参数
val
是默认值,当没有找到该系统属性或值不能正确解析为整数时,返回此默认值。 System.getProperty(nm)
用于获取名为nm
的系统属性。如果没有找到该属性,返回null
。Integer.decode(v)
尝试将字符串v
解析为整数。如果字符串是以0x
、0X
或#
开头的,则解析为十六进制整数;如果以0
开头,则解析为八进制;否则按十进制解析。
错误处理:
- 如果
nm
为空、系统属性名无效,或属性值格式错误(不能被解析为整数),会抛出IllegalArgumentException
、NullPointerException
或NumberFormatException
。这些异常在方法内部被捕获,确保调用该方法时程序不会崩溃,且可以返回指定的默认值。
总结:
getInteger(String nm, Integer val)
是一个从系统属性中读取整数值的工具方法,它处理了可能出现的异常情况,并提供了默认值机制。这个方法适用于需要从系统属性中读取配置值,且保证系统属性缺失或不正确时不会影响程序正常运行的场景。
- 进制转化
toBinaryString
:转为二进制字符串
toOctalString
:转为八进制字符串
toHexString
:转为16进制字符串
2. numberOfLeadingZeros(int i)
:计算前导零的个数
`numberOfTrailingZeros(int i)`:计算尾随零的个数
reverse(int i)
方法的作用是将一个整数i
的 二进制位顺序反转,即将其二进制表示的位从左到右完全反转。最终返回的结果是原始整数的位顺序被颠倒后的新整数。