Java-基础-数据类型-常量池

整数类型常量池范围:[-128, 127],Byte Short Integer Long Character 都是这个范围,当使用
Integer a = 127;
Integer b = 127;
时 a == b 返回 true
每个整数类型的封装类型中都有一个 封装类型简单名称 + Cache 私有静态内部类用于保存其常量数字。当上述五种基本类型的封装类型用字面值来进行赋值时,如果其值大小在常量池的范围之中则直接使用常量池的引用,否则 new 一个出来。

字符串的常量池通常来源于class文件的字符串常量,并且必须在编译期就能确定的字符串,并且有动态添加的特性,例如使用String#intern()方法。和整数常量一样,字符串的常量之间的 + 运算仍然是一个常量(整数类型+运算后不超出范围的前提下),并且整数类型的四则运算结果只要不超出范围都是引用常量池的变量,同时即便是采用下面的方式仍然是相等的 。

Integer a = 127;
Integer b = 126 + new Integer(1);
a == b; // true

Integer a = new Integer(126) + new Integer(1);
Integer b = 128 - 1;
a == b; // true
public class A {
  private static final String A = "Hello";
  private static final String B = "World";
  public static void main(String...args) {
    System.out.println("HelloWorld" == (A + B)); // true 编译时 A 和 B的值已经确定了
  }
}

public class B {
  private static final String A;
  private static final String B;
   
  static {
    A = "Hello";
    B = "World";
  }

  public static void main(String...args) {
    System.out.println("HelloWorld" == (A + B)); // false   编译时不确定A和B的值
  }
}

public class C {
  private static final String A = new String("Hello");
  private static final String B = new String("World");
  public static void main(String...args) {
    System.out.println("HelloWorld" == (A + B)); // false 编译时 A 和 B的值不能确定
  }
}

其实根本还是 基本类型比较值 引用类型比较地址

你可能感兴趣的:(Java-基础-数据类型-常量池)