当前位置: 首页 > news >正文

Integer 源码记录

Integer

公共方法结构

在这里插入图片描述

注意:

  1. 通过构造函数创建一个Integer对象,每次都会返回一个新的对象,如果使用 == 进行对象的比较,那么结果是false。
public Integer(int value) {this.value = value;}
  1. 与之对应的是,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);}
  1. 在平时的开发过程中,对于 Integer 等包装类进行 相等比较 时,使用 equals 方法
  2. public static int parseInt(String s, int radix)方法 radix 参数,将x进制 转为 10进制
  3. compareUnsigned 方法的作用是比较两个整数 xy,将它们作为无符号整数进行比较。虽然Java中没有直接的无符号整数类型,但可以通过位操作或加上一个固定偏移量的方式,间接实现无符号整数的比较。

代码解释:

java
复制代码
public static int compareUnsigned(int x, int y) {return compare(x + MIN_VALUE, y + MIN_VALUE);
}

1. 无符号整数比较的背景:

在Java中,int类型是32位有符号整数,数值范围是从 -2^312^31 - 1(即从 -21474836482147483647)。当我们使用compare(int x, int y)方法时,它会进行有符号整数比较,正数总是比负数大。但有时候我们需要像无符号整数一样对两个整数进行比较,也就是不区分正负号。

2. MIN_VALUE的作用:

Integer.MIN_VALUE-2147483648。在无符号比较中,通过对每个数加上 MIN_VALUE,我们可以把原本范围为 -2^312^31 - 1 的有符号整数映射到 02^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 返回正数。

通过将 xy 都加上 MIN_VALUE,我们把它们从有符号数空间映射到无符号数空间,然后使用现有的 compare() 方法来比较它们。加上 MIN_VALUE 的这一步确保了两个数都按照无符号整数的逻辑进行比较。

工作示例:

  • 输入: x = -1y = 1 (在有符号表示中,-1 比 1 小)

    转换: x + MIN_VALUE = -1 + (-2147483648) = 2147483647y + 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

方法的作用场景:

  1. 读取系统属性:
    • 系统属性(System Properties)通常是在Java程序启动时通过命令行参数或者运行时环境变量设置的。通过System.getProperty(String)方法,开发者可以获取这些属性,getInteger() 扩展了这个功能,将这些属性值解析为整数。
  2. 处理可能缺失或格式不正确的系统属性:
    • 该方法提供了一个健壮的机制:如果指定的系统属性不存在、属性值为空、格式不正确(如不能被解析为数字),则返回用户指定的默认值。这在开发时非常有用,因为系统属性可能因不同的运行环境或启动配置而有所不同。

适用的场景举例:

  1. 配置和调优:

    • 在企业级应用中,许多配置(如线程池大小、连接超时、缓存大小等)会通过系统属性设置。开发者可以使用 getInteger() 来读取这些配置,并为每个属性提供一个合理的默认值,以确保在没有明确配置的情况下程序依然能运行。
    java
    复制代码
    // 例如,从系统属性获取线程池大小,默认值为10
    int threadPoolSize = getInteger("thread.pool.size", 10);
  2. 命令行参数传递:

    • 一些Java应用程序可能在启动时通过命令行参数(如 Dproperty=value)传递系统属性。getInteger() 可以从这些命令行参数中获取并解析整数值。
    bash
    复制代码
    java -Dmax.connections=100 MyApplication

    在代码中可以使用:

    java
    复制代码
    int maxConnections = getInteger("max.connections", 50);  // 如果没有设置,默认为50
  3. 跨平台或环境配置:

    • 在不同环境(如开发、测试、生产)中,程序可能需要根据运行环境来调整行为。可以通过系统属性配置不同的参数,而不需要硬编码这些值。
    java
    复制代码
    // 根据系统属性决定是否启用调试模式
    int debugLevel = getInteger("debug.level", 0); // 默认不启用调试模式
  4. 系统配置检查:

    • 这个方法可以用来检查Java环境或系统的配置(如最大内存、线程数等),并确保值在可接受的范围内。例如,在启动时可以通过系统属性传递硬件限制参数。

具体行为说明:

  • 参数 nm 是要读取的系统属性的名称。
  • 参数 val 是默认值,当没有找到该系统属性或值不能正确解析为整数时,返回此默认值。
  • System.getProperty(nm) 用于获取名为 nm 的系统属性。如果没有找到该属性,返回 null
  • Integer.decode(v) 尝试将字符串 v 解析为整数。如果字符串是以 0x0X# 开头的,则解析为十六进制整数;如果以 0 开头,则解析为八进制;否则按十进制解析。

错误处理:

  • 如果 nm 为空、系统属性名无效,或属性值格式错误(不能被解析为整数),会抛出 IllegalArgumentExceptionNullPointerExceptionNumberFormatException。这些异常在方法内部被捕获,确保调用该方法时程序不会崩溃,且可以返回指定的默认值。

总结:

getInteger(String nm, Integer val) 是一个从系统属性中读取整数值的工具方法,它处理了可能出现的异常情况,并提供了默认值机制。这个方法适用于需要从系统属性中读取配置值,且保证系统属性缺失或不正确时不会影响程序正常运行的场景。

  1. 进制转化

toBinaryString:转为二进制字符串

toOctalString:转为八进制字符串

toHexString:转为16进制字符串
2. numberOfLeadingZeros(int i):计算前导零的个数

`numberOfTrailingZeros(int i)`:计算尾随零的个数
  1. reverse(int i) 方法的作用是将一个整数 i二进制位顺序反转,即将其二进制表示的位从左到右完全反转。最终返回的结果是原始整数的位顺序被颠倒后的新整数。

http://www.mrgr.cn/news/33721.html

相关文章:

  • Web Components之继承
  • K8s容器运行时,移除Dockershim后存在哪些疑惑?
  • 局部凸空间及其在算子空间中的应用之四——归纳极限空间2
  • MATLAB中多张fig图合并为一个图
  • 如何使用数字人直播?
  • 深度学习03-神经网络01-什么是神经网络?
  • 算法之逻辑斯蒂回归(Logistic regression)
  • Maven-一、分模块开发
  • Excel常见操作命令~你值得拥有!
  • 没错,我给androidx修了一个bug!
  • 认识结构体
  • 鸿蒙开发(NEXT/API 12)【跨设备互通NDK开发】协同服务
  • 【机器学习】13-决策树2——决策树生成、剪枝
  • SystemExit: 系统退出异常的完美解决方法⚙️
  • 从示例的角度介绍async copy,剖析一个 cuda sample case Samples/3/tf32TensorCoreGemm
  • 智能工作伙伴:AI助理与企业知识库的深度融合
  • 【多维动态规划】64. 最小路径和(面试真题+面试官调整后的题目)
  • 重生之我们在ES顶端相遇第16 章 - Lucene 写入流程
  • 【AI创作组】Matlab简介
  • re题(38)BUUCTF-[FlareOn6]Overlong