集合(5)
容器選擇
取的元素很多,頻繁的增刪元素:linkedlist
涉及到增刪,不頻繁:linkedlist,arraylist
涉及到了增刪,同時(shí)涉及到了查詢:建議使用arraylist【一般情況增刪不多,查詢多】
?
Set:沒(méi)有順序,元素不可以重復(fù)
Set集合的功能和collection的功能是一致的。
?
Set兩大子類(lèi)
Hashset:底層數(shù)據(jù)結(jié)構(gòu)是哈西表【hashset 中的順序是按照哈希值的順序存放的,與存的順序無(wú)關(guān)】
Treeset
?
哈希值在比較的時(shí)候;如果哈希值相同會(huì)再判斷元素對(duì)象是否相同(equals)。
?
一般自定義的類(lèi)通常要復(fù)寫(xiě)hashcode(),equals()【尤其是要加入到hashset里面的】
?
HashSet刪除和判斷的依據(jù):
對(duì)于判斷元素是否存在以及刪除等操作,依賴(lài)的方法是元素的hashCode() 的equals();
Arraylist判斷元素是否存在以及刪除,只依賴(lài)equals()【取決于數(shù)據(jù)結(jié)構(gòu)】
?
Hashset練習(xí):姓名年齡相同為同一人
class Person{String name;int age;Person(String name,int age){this.name=name;this.age=age;}public int hashCode(){return name.hashCode()+age;}public boolean equals(Object obj){Person p=(Person)obj;if(p.name==this.name&& p.age==this.age){return true;}else{return false;}} } public class test{public static void main(String[] args){HashSet hs = new HashSet();Person s1= new Person("zhangsan",12);Person s2= new Person("lisi",13);Person s3= new Person("zhangsan",12);hs.add(s1);hs.add(s2);Iterator it = hs.iterator();while(it.hasNext()){Person p=(Person) it.next();System.out.println(p.name+"***"+p.age);}}}
原理:hashTable在比較時(shí)先比較哈希碼,如果哈希碼相同就在調(diào)用equals方法,如果不相同就不會(huì)調(diào)用equals方法
?
hashCode()中返回的hash值:
name.hashCode()+age
易出現(xiàn)兩值不相同,但和相同的情況
為了避免這種情況,通常age*39【乘的數(shù)任意】來(lái)保證哈希值的唯一性;
轉(zhuǎn)載于:https://www.cnblogs.com/excellencesy/p/8511154.html
總結(jié)
- 上一篇: bzoj 4813: [Cqoi2017
- 下一篇: 【BZOJ1015】【JSOI2008】