-
equals和==的区别
对于基本数据类型 ==
和equals
比较的内容相同 (equals
底层是通过==
实现的) 比较的是数据的值
比较引用数据类型时 二者都是去比较地址值
equals
不能作用于基本数据类型的变量
比较引用数据类型时 比较两个对象的地址值 字符串的equals
经过重写 比较两个对象的值
-
String的创建过程
String
类使用一个char
类型的数组来保存字符串中的每个字符,同时还有一个int
类型的变量count来表示字符串的长度。由于String
类是不可变的,因此一旦创建了一个String
对象,就不能修改其中的字符序列。
使用字符串字面量创建一个新的字符串时,会首先在常量池中查找是否存在相同的字符串,如果存在,则返回常量池中的字符串对象的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回其引用。例如,以下代码会在常量池中创建一个新的字符串对象,并将其引用赋值给b
变量
String a = "abc"; String b = "abc";//创建b时在常量池中查找 存在相同的字符串a返回a的引用 因此a b指向相同地址值
当使用String
类的构造方法创建一个新的字符串时,会在堆内存中创建一个新的对象,该对象包含一个指向字符数组的引用,字符数组中保存了字符串中的每个字符。例如,以下代码会在堆内存中创建一个新的String
对象,并将其赋值给c
变量:
String c = new String("abc");//出现new 在堆内存出现新的地址值
-
总结
结合上述两点,下列代码就能够明白原因了
String a = "abc"; String b = "abc";//b和a指向相同地址值 String c = new String("abc");//出现new 在堆内存开辟新的地址 System.out.println((a == b));//true System.out.println(a.equals(b));//true System.out.println(a == c);//false System.out.println(a.equals(c));//true