本文目錄一覽:
- 1、java中equals使用方法
- 2、關於Java中equals()方法的使用。為什麼比較內容相同的對象依然只是false?
- 3、java 中 equals() 相等的兩個對象,hashcode() 一定相等
java中equals使用方法
java中equals使用方法:
equals 方法是String類從它的超類Object中繼承的, 被用來檢測兩個對象是否相等,即兩個對象的內容是否相等,區分大小寫。
對於字符串變量來說,使用“==”和“equals()”方法比較字符串時,其比較方法不同。“==”比較兩個變量本身的值,即兩個對象在內存中的首地址。“equals()”比較字符串中所包含的內容是否相同。 例如:
s1 = new String(“abc”);
s2 = new String(“abc”);
s1.equals(s2) 是 true
3.對於非字符串變量來說,”==”和”equals”方法的作用是相同的都是用來比較其對象在堆內存的首地址,即用來比較兩個引用變量是否指向同一個對象。
class A
{
A obj1 = new A();
A obj2 = new A();
}
obj1.equals(obj2)是false
關於Java中equals()方法的使用。為什麼比較內容相同的對象依然只是false?
java中,
(1)對於字符串變量來說,equal比較的兩邊對象的內容,所以內容相同返回的是true。
至於你沒問到的“==”,比較的是內存中的首地址,所以如果不是同一個對象,“==”不會返回true 而是false。
舉個簡單的例子,
String s1=”abc”, s2=”abc”;
String s3 =new String(“abc”);
String s4=new String(“abc”);
s1==s2 //true,
s1.equals(s2) //true,
s3.equals(s3) //true,equal比較的是內容
s3==s4//false,==比較的是首地址,所以是false
(2)對於非字符串變量,equals比較的內存的首地址,這時候和==是一樣的,即比較兩邊指向的是不是同一個對象,
即
Sample sa1 = new Sample();
Sample sa2 = new Sample();
sa1.equals(sa2) //false,因為不是同一對象
注意,如果加上
sa1=sa2;
那麼
sa1.equals(sa2) //true
針對你問的,如果你說的兩個對象是非字符串的,那麼參考第2條;否則請參考第一條
java 中 equals() 相等的兩個對象,hashcode() 一定相等
在java中,equals和hashcode是有設計要求的,equals相等,則hashcode一定相等,反之則不然。
為何會有這樣的要求?
在集合中,比如HashSet中,要求放入的對象不能重複,怎麼判定呢?
首先會調用hashcode,如果hashcode相等,則繼續調用equals,也相等,則認為重複。
如果重寫equals後,如果不重寫hashcode,則hashcode就是繼承自Object的,返回內存編碼,這時候可能出現equals相等,而hashcode不等,你的對象使用集合時,就會等不到正確的結果
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (EntryK,V e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/199837.html