JAVA常量池,LongCache(-128~127)

博客介绍了比较两个值一样的Long对象是否相等的知识点。Long存在默认常量池(-128~127),自动装箱时此范围值从常量池取,用equals比较相等。除Character外,Byte、Short、Integer、Long常量池范围是(-128~127),Character是(0 - 127),用new创建则不相等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个知识点,比较两个值一样Long对象是否相等。比如:

Long l3 = 127L;
Long l4 = 127L;
System.out.println(l3+":"+l4+"="+(l3 == l4));
输出:
127:127=true

此时两个对象相等,就是因为Long存在一个默认的常量池,大小是(-128~127),自动装箱(valueOf)时此范围的值都是从常量池中取的。所以:

Long l1 = 128L;
Long l2 = 128L;
System.out.println(l1+":"+l2+"="+(l1 == l2));
输出:
128:128=false

如果用equals比较,都是相等的,Long的equals比较的是value。

除Long之外,还有Byte,Short,Integer,Long,Character都实现了常量池,除Character外,范围都是(-128~127);Character的范围是(0-127)。

另外,上边的方式不等同与new:
如果用new的方式创建,结果是不相等的。

Long l5 = new Long(127L);
Long l6 = new Long(127L);
System.out.println(l5+":"+l6+"="+(l5 == l6));
输出:
127:127=false

常量池的源码:

   private static class LongCache {
            private LongCache(){}
            static final Long cache[] = new Long[-(-128) + 127 + 1];
            static {
                for(int i = 0; i < cache.length; i++)
                    cache[i] = new Long(i - 128);
            }
        }
<think>好的,我现在要详细回答用户关于Javalong数据类型的问题。首先,我需要回忆和整理自己了解的关于Java long类型的知识,并参考提供的引用资料,确保信息准确无误。 首先,longJava的8种基本数据类型之一,属于整数类型,占用8个字节(64位),范围从-2^63到2^63-1。这比int类型更大的范围,适用于需要处理大整数的情况。用户提到想了解long的详细信息,所以我需要覆盖声明、初始化、默认值、使用场景,以及注意事项,比如字面量后缀L的使用。 接下来,查看提供的引用。引用[2]中提到static Long getLong等方法,这可能涉及Long包装类的方法,但用户主要关注基本类型,可能需要简要提到包装类及其与基本类型的自动装箱拆箱。引用[3]中的缓存机制虽然主要针对Integer,但可能Long也有类似的缓存机制,比如LongCache,通常在-128127之间,但用户可以修改JVM参数来调整,不过这可能超出基本类型范围,属于包装类的部分,需要区分清楚。 然后,需要结构清晰,分点讲解。例如,声明和初始化部分,给出代码示例;范围部分用数学公式表示;注意事项强调L的大小写;应用场景列举如时间戳、大文件处理等。同时,对比int和long的区别,帮助用户理解何时选择long。 还要注意用户不可见的系统指令,比如行内数学表达式用$...$,独立公式用$$...$$,但当前回答可能较少涉及复杂公式,可能只需在范围部分使用。例如,范围可以写成$-2^{63}$到$2^{63}-1$,用行内公式格式。 另外,需要生成相关问题,可能涉及long与包装类Long的区别、溢出问题、性能影响、字面量后缀的必要性等。这些问题应自然延伸,帮助用户深入学习。 最后,检查LaTeX语法是否正确,确保所有数学表达式正确使用$符号,没有语法错误。同时,引用标注要正确,比如在提到缓存时引用[3],提到包装类方法时引用[2],但需要注意引用内容是否相关。例如,引用[2]中的getLong方法属于Long包装类,可能在讲解包装类时提及,但用户问题主要关于基本类型,可能需要简要带过。 可能存在的疑问:是否需要详细讲解自动装箱拆箱?用户的问题是关于long基本类型,但了解其与包装类的关系也很重要,所以可以简单提及,并引导相关问题。此外,缓存机制在Long中是否存在,是否需要说明?根据Java规范,Long的缓存范围是固定的,不像Integer可以调整,所以引用[3]中的例子可能不适用,但需要确认准确性。可能这里需要谨慎,避免错误信息。 总结回答结构: 1. 基本介绍:定义、内存占用、范围(用数学公式) 2. 声明与初始化:代码示例,注意L后缀 3. 默认值:0L 4. 应用场景:大整数需求的情况 5. 注意事项:L的使用,与int的区别 6. 相关类:Long包装类,自动装箱拆箱,缓存机制(简要) 7. 生成相关问题 确保每个部分简明扼要,符合用户需求。现在开始组织语言,使用中文,遵循格式要求,检查LaTeX是否正确,引用适当。</think>### Java long 数据类型详解 #### 1. 基本特性 - **定义**:`long` 是 Java 的**基本数据类型**之一,用于表示**64位有符号整数**,范围为: $$-2^{63} \text{ 到 } 2^{63}-1$$ 即 $-9,223,372,036,854,775,808$ 至 $9,223,372,036,854,775,807$。 - **内存占用**:固定占用 **8 字节**,与操作系统无关。 - **默认值**:若未显式初始化,默认值为 `0L`。 #### 2. 声明与初始化 ```java long a = 100L; // 显式添加 L 后缀 long b = -200; // 编译器自动推断为 long(值在 int 范围内时) long c = 3_000_000_000L; // 超出 int 范围时必须加 L ``` #### 3. 注意事项 - **字面量后缀**:若数值超出 `int` 范围($2^{31}-1$),必须添加 `L` 或 `l` 后缀,推荐大写 `L` 避免与数字 `1` 混淆。 - **与 `int` 的区别**:`int` 为 32 位,范围更小($-2^{31}$ 到 $2^{31}-1$),而 `long` 可存储更大整数。 #### 4. 应用场景 1. **时间戳处理**:存储毫秒级时间戳(如 `System.currentTimeMillis()`)。 2. **大文件操作**:处理文件大小(字节数)时避免溢出。 3. **科学计算**:涉及天文数字或高精度计算的场景。 #### 5. 相关工具类:`Long` - **自动装箱/拆箱**:`long` 与包装类 `Long` 可自动转换: ```java Long boxed = 1000L; // 自动装箱 long unboxed = boxed; // 自动拆箱 ``` - **缓存优化**:`Long` 类默认缓存 `-128` 到 `127` 的值(类似 `Integer`[^3]),超出范围的实例会新建对象。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值