==比较包装类
为了方便看与测试,我提供了图片和代码。
Integer a = 1;
Integer b = 1;
System.out.println(a == b); //true
//原因:JVM默认缓存池(缓存)在-128到127之间,如果引用类型变量引用的数值范围在这之间,
//他们引用的是相同的一个对象,用==比较自然就是true
Integer a1 = 128;
Integer b1 = 128;
System.out.println(a1 == b1);//false
//原因:超出了JVM缓存池的范围,他们相当于引用的两个不同的对象,所以地址不相同
Integer c2 = 1;
Integer d2 = new Integer(1);
System.out.println(c2 == d2); //false
//原因:c2引用的是缓存池中的变量,d2是自己在堆中new的变量,引用的是堆中的地址,所以地址不同
Integer a2 = 128;
int b2 = 128;
Double c8 = 128.0;
System.out.println(a2 == b2); //true
System.out.println(c8 == b2); //true
//原因:引用数据类型在于基本数据类型比较时,会自动拆箱成基本类型进行数值比较
Integer a3 = 128;
Integer b3 = 128;
System.out.println((a3 + b3) == (b3 + a3));//true
//原因:如果遇到算数运算符的情况下会自动拆箱进行比较,算数运算符会自动进行数据转换
//== 和 equals不会自动进行数据转换
Integer a5 = 1;
Long b5 = 1L;
//原因:System.out.println(a5 == b5); //编译报错,不同的包装类型不能使用 == 比较
Integer a6 = 1000;
Integer b6 = 1000;
System.out.println(a6 == b6);
//如果不对缓存池进行调节返回false
//如果设置为 -XX:AutoBoxCacheMax=1100 返回true
//设置完当前缓存池的大小 -128 到 1100 所以他们使用的都是缓存池中的值,地址相同
==比较String
为了方便看与测试,我提供了图片和代码。
String s1 = "a";
String x1 = "a";
System.out.println(s1 == x1); //true
//原因:字符串常量池的概念,一个字符串在常量池中是独一份的,不可被改变的,
//所以两个对象引用的是同一个地址。
String s2 = "b";
String x2 = new String("b");
System.out.println(s2 == x2); //false
//原因:s2字符串在常量池中,x2因为是new的它会在常量池中一份,在堆内存中一份,
//它所指向的地址是堆中的地址,所以两个地址不同
String s3 = new String("c");
String x3 = new String("c");
System.out.println(s3 == x3); //false
//原因:这是两个全新的对象,在堆中占有不同的地址,所以返回false
String s4 = new String("d").intern();
String x4 = new String("d").intern();
System.out.println(s4 == x4); //true
//原因:加上.intern()方法就是标明要使用字符串是常量池中的值,由于字符串常量池中的值是独一份的,
//所以他们指向的是同一个地址。
//用.intern()方法,可以让字符串进行驻留,但在业务代码中滥用 intern,可能会产生性能问题。
//没事别轻易用 .intern(),如果要用一定要注意控制驻留的字符串的数量,并留意常量表的各项指标。
撤了…