1. ==和equals
==
:比较引用类型比较的是地址值是否相同
equals
:比较引用类型默认比较的是地址值是否相同,但是String类重写了equals()方法,比较的是内容是否相同。
2. String、StringBuffer和StringBuilder
String
:字符串对象一旦被初始化就不会改变
StringBuffer
:
- 长度可变
- 可以存储不同类型的数据
- 最终要转换成字符串使用
- 可以对字符串进行修改
- 线程同步,用于多线程
StringBuilder
:
- 线程不同步,用于单线程,用于提高效率
3. 自动装箱和自动拆箱
深入剖析Java中的装箱和拆箱
详解Java的自动装箱与拆箱(Autoboxing and unboxing)
3.1 定义
自动装箱 基本类型->包装类型 Integer num2 = 99;
自动拆箱 包装类型->基本类型 int num3 = num2;
3.2 ==和equals判断
(1)创建对象
public static void main(String[] args) {
// Integer
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);// true 在[-128,127]范围内,使用已有对象
System.out.println(i3==i4);// false,超出范围,每次都new新对象
// Double
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2);// false 无缓存
System.out.println(i3==i4);// false 无缓存
// Boolean
Boolean i1 = false;
Boolean i2 = false;
Boolean i3 = true;
Boolean i4 = true;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//true
// public static final Boolean TRUE = new Boolean(true);
// public static final Boolean FALSE = new Boolean(false);
// public static Boolean valueOf(boolean b) {
// return (b ? TRUE : FALSE);
// }
(2)比较
equals
比较的是内容本身(包括内容和类型),并且我们也可以看到equal的参数是一个Object对象,我们传入的是一个int类型,所以首先会进行装箱,然后比较- 当一个基础数据类型与封装类进行
==、+、-、*、/
运算时,会将封装类进行拆箱,对基础数据类型进行运算。 - 当
“==”
运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。
总结:
equals比对象; "=="比数值,仅在两边都是包装类型时才比较对象;四则运算算基础
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c==d);//true 缓存范围内相同对象
System.out.println(e==f);//false 缓存范围外不同对象
System.out.println(c==(a+b));//true 比数值,触发自动拆箱
System.out.println(c.equals(a+b));//true 比对象,先触发自动拆箱过程,再触发自动装箱,对象相同
System.out.println(g==(a+b));//true 比数值,数值相等
System.out.println(g.equals(a+b));//false 比对象,不同的装箱方法
System.out.println(g.equals(a+h));//true 比对象,相同