是否存在布尔池?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
相关产品推荐
相关产品推荐

