public class test {
public static void main(String[] args) {
String a="123";
String b="123";
System.out.println(a==b);
}
}
这里a和b的比较结果为什么是true?双等号==在比较时,如果是对象之间进行比较那么就是比较两个对象的地址是不是一样的,String不是基本数据类型,而是类,那么这里的a和b不就是一个对象引用吗?在比较a和b时为什么不是比较a和b所指向的地址呢?
String是比较特殊的数据类型,一些比较常用的数,会存放到常量池里面,赋值时直接拿常量池里面的数值
从常量池的同一个位置取出来,因此比较的结果就是true啦
你可以了解一下Class常量池的感念。我这里还是解释一下吧,Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)。
1、其中该代码中的“123”就是常量池中的一个字面常量
2、 String a="123"; 在编译器会将变量a的引用指向常量池里的“123”
3、同样 String b="123" 变量b的引用也指向了同样的常量“123”
4、所有a==b是true
a和b都指向了常量池中的“123”,所以地址是相同的,比较出来是true