==
判断两个对象是不是内存中同一个对象。但如果有基本数据类型参与比较,无论是基本数据类型相互比较,还是基本数据和他们的封装类比较,都比较的是值,引用数据类型之间 ==比较的是内存地址。
equals()
equals():作用也是判断两个对象是否相等。但它一般有两种使用情况,一种这个类没有重写equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
另一种就是类重写了 equals() 方法,重写了之后就按照重写的逻辑来进行判断。
一般,我们都覆盖 equals() 方法来比较两个对象的内容相等; 若它们的内容相等,就认为两个对象是相等的
public class Test {
public static void main(String[] args) {
//使用双引号声明的字符串对象会直接保存在字符串常量池中。
String s1 = "hello";//首先看字符串常量池中有没有该字符串,没有就在字符串常量池中创建一个,并返回代表该字符串的引用地址(堆区)
String s2 = "hello";//字符串常量池中已经有该字符串了,直接返回代表该字符串的引用地址
System.out.println("字符串常量池中的字符串引用是否相等(s1 == s2):"+(s1 == s2));//true:比较这两个字符串的引用地址是否相等
String s3 = new String("hello");//先判断字符串常量池中有没有该字符串,如果没有则先在字符串常量池中创建该字符串,如果字符串常量池中已经有了该字符串则不再创建,然后再在堆中创建该字符串对象
System.out.println("堆中字符串与字符串常量池中的字符串引用是否相等(s2 == s3):"+(s2 == s3));//false:比较两个字符串的引用地址是否相同
System.out.println("==============equals()比较==================");
System.out.println("堆中字符串与字符串常量池中的字符串是否相等(s3.equals(s2)):"+s3.equals(s2));//true:比较这两个字符串的内容是否相同
/**
* Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
* 将此字符串与指定的对象进行比较。当且仅当参数不为空并且是表示与此对象相同字符内容的字符串对象时
* 结果为true。
*
* 1、
* 没有复写 Object 类的 equals 方法,使用 == 和 equals 比较是一样效果的,
* 都是比较的是它们在内存中的存放地址。
* public boolean equals(Object obj) {
* return (this == obj);
* }
* 2、
* String 类复写了 equals 方法,当使用 == 比较内存的存放地址不相等时,接下来会比较
* 字符串的内容是否相等,所以 String 类中的 equals 方法会比较两者的字符串内容是否一样。
* public boolean equals(Object anObject) {
* if (this == anObject) {
* return true;
* }
* if (anObject instanceof String) {
* String anotherString = (String)anObject;
* int n = value.length;
* if (n == anotherString.value.length) {
* char v1[] = value;
* char v2[] = anotherString.value;
* int i = 0;
* while (n-- != 0) {
* if (v1[i] != v2[i])
* return false;
* i++;
* }
* return true;
* }
* }
* return false;
* }
*
* 总结:
* 1、== 直接比较两个对象的引用地址是否相同
* 2、equals 先比较引用地址再比较对象内容
*
*/
}
}