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的 二进制位顺序反转,即将其二进制表示的位从左到右完全反转。最终返回的结果是原始整数的位顺序被颠倒后的新整数。
