一、set.contains介紹
set.contains()函數(shù)是Java中Set接口中的一個(gè)方法,該方法判斷Set中是否包含某個(gè)元素,若包含則返回true,否則返回false。
其用法為:
Set set = new HashSet<>();
set.add(element);
boolean result = set.contains(element);
其中,element為Set中的元素,result為boolean類型的變量,用于記錄Set中是否包含該元素。
二、set.contains的時(shí)間復(fù)雜度
set.contains的時(shí)間復(fù)雜度與使用的Set實(shí)現(xiàn)有關(guān)。對(duì)于基于哈希表的實(shí)現(xiàn),如HashSet和LinkedHashSet,其平均時(shí)間復(fù)雜度為O(1);對(duì)于基于紅黑樹的實(shí)現(xiàn),如TreeSet,其平均時(shí)間復(fù)雜度為O(log n)。
在實(shí)際應(yīng)用中,選用適當(dāng)?shù)腟et實(shí)現(xiàn)能夠達(dá)到更好的性能。
三、set.contains與equals的關(guān)系
set.contains的判斷依賴于元素的hashCode以及equals函數(shù)的返回值。如果兩個(gè)元素的hashCode相同,但equals函數(shù)返回值不同,則判斷這兩個(gè)元素相等的結(jié)果是錯(cuò)誤的。
為了避免此類問題,程序員需要確保重寫了元素類的equals函數(shù),保證元素相等的判斷符合自己的需求。
例如,對(duì)于一個(gè)Person類:
class Person {
private String name;
private int age;
//...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
在使用Set時(shí),如果只重寫了hashCode函數(shù)而沒有重寫equals函數(shù),則set.contains()很可能會(huì)判斷出兩個(gè)元素不相等,即使它們?cè)跇I(yè)務(wù)上應(yīng)該是相等的。
四、set.contains的使用場(chǎng)景
set.contains的常見使用場(chǎng)景包括:
判斷集合中是否包含指定元素 對(duì)于刪除、修改等操作,先使用set.contains判斷操作元素是否存在 對(duì)于數(shù)據(jù)量比較大的List,可以先將List中的元素加入set中,再使用set.contains實(shí)現(xiàn)快速查找五、set.contains的應(yīng)用舉例
以下代碼展示了如何使用set.contains實(shí)現(xiàn)兩個(gè)字符串的交集:
public Set intersection(String s1, String s2) {
Set set1 = new HashSet<>();
Set set2 = new HashSet<>();
for (char c : s1.toCharArray()) {
set1.add(c);
}
for (char c : s2.toCharArray()) {
set2.add(c);
}
Set result = new HashSet<>();
for (char c : set1) {
if (set2.contains(c)) {
result.add(c);
}
}
return result;
}
其中,set1和set2分別表示兩個(gè)字符串中各個(gè)字符集合,用set.contains計(jì)算它們的交集,最終返回一個(gè)Set類型的結(jié)果。