You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在布尔池?Java布尔变量与值传递的技术疑问

Java布尔池与按值传递的疑问解答

嘿,我来帮你把这两个Java相关的疑问掰扯清楚~

一、有没有布尔池?1000个true的boolean变量会共享引用吗?

首先明确:Java里没有专门的“布尔池”,不过针对布尔的包装类型Boolean,JVM做了一个小优化——当你用自动装箱的方式创建Boolean对象(比如Boolean b = true;),JVM会缓存Boolean.TRUE和Boolean.FALSE这两个实例。也就是说,所有通过自动装箱得到的true的Boolean对象,都会引用同一个缓存实例,false也是同理。

但要注意!如果你声明的是基本类型boolean(比如boolean b = true;),情况就不一样了——基本类型变量直接存储的是原始值(true/false),不存在“引用”这回事,所以1000个这样的变量各自存储自己的true值,没有共享引用的说法。只有包装类型的自动装箱实例才会享用到这个缓存优化。

二、关于按值传递的代码分析

先看你贴的这段代码:

public class Test {
    public static boolean global;
    public static void main(String[] args) {
        foo(false);
        System.out.println(global);
    }
    public static void foo(boolean bar) {
        global = bar;
    }
}

Java确实是严格的按值传递,这里的bar是方法foo的参数,它是传入的false的一个副本——也就是说,bar是一个全新的基本类型变量,里面存的是和传入值一模一样的false。然后你把静态变量global赋值为bar,本质就是把这个副本的值赋给了global,所以最终程序会输出false,这完全符合按值传递的规则。

这里容易搞混的点是:如果是引用类型参数,修改引用指向的对象内容会影响原对象,但基本类型参数传递的是值的副本,修改参数本身不会影响原变量,但这里你是把参数的值赋给了全局变量,所以全局变量拿到的是副本的值,和按值传递不冲突。


内容的提问来源于stack exchange,提问作者Artem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:46:47