java集合筆記

集合和數(shù)組的區(qū)別

  • 區(qū)別1:
    • 數(shù)組即可以存儲(chǔ)基本數(shù)據(jù)類型,又可以存儲(chǔ)引用數(shù)據(jù)類型,
      基本數(shù)據(jù)類型存儲(chǔ)的是值,引用數(shù)據(jù)存儲(chǔ)的是地址值
    • 集合只能存儲(chǔ)引用數(shù)據(jù)類型(也可存儲(chǔ)基本數(shù)據(jù)類型坯钦,但是會(huì)裝箱變成對(duì)象)
  • 區(qū)別2:
    • 數(shù)組長(zhǎng)度是固定的预皇,不能自動(dòng)增長(zhǎng)
    • 集合的長(zhǎng)度是可變的,可以根據(jù)元素的增加而增長(zhǎng)
  • 注:數(shù)組轉(zhuǎn)集合Arrays.asList(arr);
    集合轉(zhuǎn)數(shù)組:list.toArray(new String[10]);需要制定長(zhǎng)度

單列集合根接口Collection

* 兩個(gè)實(shí)現(xiàn)類:
List(有序):存和取得順序一致,有索引可以存儲(chǔ)重復(fù)
Set(無(wú)序):存和取得順序不一致婉刀,無(wú)索引吟温,不可以存儲(chǔ)重復(fù)

List集合

* ArrayList(常用):
由于底層是數(shù)組實(shí)現(xiàn)的,也具備了數(shù)組的的屬性——元素的查詢快,增刪慢突颊,
線程不安全鲁豪,效率高。
* Vector(不常用):
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快律秃,增刪滿爬橡,線程安全,效率低
* LinkedList:
雙層鏈表,查詢慢,增刪快,線程不安全棒动,效率高

Set集合

* HashSet,LinkedHashSet(子類,有序)去重,TreeSet——排序
HashSet集合
(1)HashSet:底層是哈希表,線程不同步,無(wú)序糙申,高效
保證元素唯一性:在添加元素的時(shí)候用hashCode()和equals()方法進(jìn)行比較來(lái)保證唯一性
先用hashcode比較,提高效率
(2)存儲(chǔ)對(duì)象的時(shí)候,確保對(duì)象重寫equals方法和hashcode()方法,這樣才能比較對(duì)象的
值是否相等船惨。
why:
重寫hashCode()方法就是為了使hash值出現(xiàn)相同的情況下(哈希沖突柜裸,無(wú)法避免),然后讓兩個(gè)元素比較屬性值掷漱,
去除重復(fù)元素粘室。不重寫hashCode()方法,默認(rèn)比較的是地址值卜范,則無(wú)論兩個(gè)元素內(nèi)的
屬性值是否相同衔统,地址值永遠(yuǎn)不會(huì)相同,則集合無(wú)論是否重復(fù)海雪,都會(huì)添加锦爵。】

(3)hashSet的實(shí)現(xiàn)原理
 * HashSet實(shí)現(xiàn)Set接口奥裸,由哈希表(實(shí)際上是一個(gè)HashMap實(shí)例)支持险掀。
  它不保證set的迭代順序;特別是它不保證該順序恒久不變湾宙。此類允許使用null元素樟氢。HashSet中不允許有重復(fù)元素
  冈绊,這是因?yàn)镠ashSet是基于HashMap實(shí)現(xiàn)的,HashSet中的元素都存放在HashMap的key上面埠啃,
  而value中的值都是統(tǒng)一的一個(gè)private static final Object PRESENT = new 
  Object();HashSet跟HashMap一樣死宣,都是一個(gè)存放鏈表的數(shù)組。
 * HashSet中add方法調(diào)用的是底層HashMap中的put()方法碴开,而如果是在HashMap中調(diào)用put毅该,首先會(huì)判斷key是否存在,
   如果key存在則修改value值潦牛,如果key不存在這插入這個(gè)key-value眶掌。而在set中,因?yàn)関alue值沒有用巴碗,
  也就不存在修改value值的說(shuō)法朴爬,因此往HashSet中添加元素,首先判斷元素(也就是key)是否存在良价,
  如果不存在這插入寝殴,如果存在著不插入,這樣HashSet中就不存在重復(fù)值明垢。

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Person)){
            return false;
        }
        Person person=(Person)obj;
        if(this==obj)
        return true;//用戶可能直接添加了同一個(gè)對(duì)象蚣常。
        return this.getName().equals(person.getName())&&this.getAge()==person.getAge();
    }
    
    @Override
    public int hashCode() {//返回唯一的hash值
        // TODO Auto-generated method stub
        return this.getName().hashCode()+this.getAge();
    }
}

(2)LinkedHashSet:HashSet的子類(有序的),根據(jù)元素的放入順序排序
TreeSet集合
TreeSet也是用Map接口的另一個(gè)實(shí)現(xiàn)類TreeMap實(shí)現(xiàn);TreeMap是一個(gè)有序的二叉樹.

* compareTo()返回值(二叉樹實(shí)現(xiàn)元素唯一和排序原理):
0:相等就不存【保證元素的唯一性】
負(fù)數(shù):小的存在左邊【保證排序】
正數(shù):大的存在右邊


* TreeSet能對(duì)Integer和String類型的數(shù)據(jù)進(jìn)行排序
因?yàn)镮nteger和String都實(shí)現(xiàn)Comparable接口并實(shí)現(xiàn)了compareTo()方法

* 自定義的對(duì)象
(1)實(shí)現(xiàn)Comparable接口并自定義compareTo()方法來(lái)實(shí)現(xiàn)自定義的規(guī)則排序
class Person implements Comparable<Person> {
    public int compareTo(Person p) {
        int num = this.age - p.age;
        return num == 0 ? this.name.compareTo(p.name) : num;
    }
}
    TreeSet<Person> ts = new TreeSet<Person>();
    ts.add(new Person("zhangsan", 23));
    ts.add(new Person("lisi", 24));
}
(2)在TreeSet構(gòu)造方法中傳入一個(gè)Comparator比較器
TreeSet<Person> ts = new TreeSet<Person>(new Comparator<Person>(){
    public int compare(Person p1, Person p2) {
        int num = p1.getAge() - p2.getAge();
        return num == 0 ? p1.getName().compareTo(p2.getName()) : num;
    }
});
    ts.add(new Person("zhangsan", 23));
    ts.add(new Person("lisi", 24));

Map集合(雙列集合)

put(K key,V value);//存儲(chǔ)的是鍵值對(duì)
entrySet();//獲取所有鍵值對(duì)
keySet();//獲取所有鍵
HashMap和HashTable(數(shù)據(jù)是哈希表,通過(guò)hashCode()和equals()來(lái)保證數(shù)據(jù)唯一)
*線程安全問題
線程安全:多線程并發(fā)訪問修改某個(gè)類,不需要額外的代碼表現(xiàn)出正確的行為
線程不安全:多線程并發(fā)訪問修改某個(gè)類,表現(xiàn)出不正確的行為
原因:多線程交替執(zhí)行任務(wù)痊银,產(chǎn)生了競(jìng)態(tài)條件
解決機(jī)制:
1.加鎖(原子性)
2.不公享狀態(tài)
3.用final修飾成不可變對(duì)象

*區(qū)別:
HashMap線程不安全抵蚊,效率高;HashTable是線程安全,效率低
HashTable可以存儲(chǔ)null key值和null value值,而HashTable都不可以
TreeMap
底層數(shù)據(jù)結(jié)構(gòu)時(shí)二叉樹溯革,不同步贞绳,可排序;與Set很像,Set底層就是使用了Map集合

* compareTo()返回值(二叉樹實(shí)現(xiàn)元素唯一和排序原理):
0:相等就不存【保證元素的唯一性】
負(fù)數(shù):小的存在左邊【保證排序】
正數(shù):大的存在右邊

* 自然排序(元素具備比較性):
實(shí)現(xiàn)Comparable接口
* 比較器排序(集合具備比較性)                
實(shí)現(xiàn)Comparator接口    \

集合工具類

Collections:操作集合(一般是list集合)的工具類致稀。方法全為靜態(tài)的
sort(List list);對(duì)list集合進(jìn)行排序; sort(List list, Comparator c) 
按指定比較器排序
fill(List list, T obj);將集合元素替換為指定對(duì)象冈闭;
swap(List list, int I, int j)交換集合指定位置的元素
shuffle(List list); 隨機(jī)對(duì)集合元素排序
reverseOrder() :返回比較器,強(qiáng)行逆轉(zhuǎn)實(shí)現(xiàn)Comparable接口的對(duì)象自然順序
reverseOrder(Comparator c):返回比較器抖单,強(qiáng)行逆轉(zhuǎn)指定比較器的順序

數(shù)組對(duì)象工具類

asList():將數(shù)組轉(zhuǎn)為list集合
* 好處:可通過(guò)list集合的方法操作數(shù)組中的元素:
isEmpty()萎攒、contains()、indexOf()矛绘、set()
* 弊端:數(shù)組長(zhǎng)度固定耍休,不可使用集合的增刪操作。
如果數(shù)組中存儲(chǔ)的是基本數(shù)據(jù)類型货矮,asList會(huì)將數(shù)組整體作為一個(gè)元素存入集合
集合轉(zhuǎn)為數(shù)組:Collection.toArray()羊精;

好處:限定了對(duì)集合中的元素進(jìn)行增刪操作,只需獲取元素
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囚玫,一起剝皮案震驚了整個(gè)濱河市喧锦,隨后出現(xiàn)的幾起案子读规,更是在濱河造成了極大的恐慌,老刑警劉巖燃少,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掖桦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡供汛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門涌穆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怔昨,“玉大人,你說(shuō)我怎么就攤上這事宿稀〕靡ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵祝沸,是天一觀的道長(zhǎng)矮烹。 經(jīng)常有香客問我,道長(zhǎng)罩锐,這世上最難降的妖魔是什么奉狈? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮涩惑,結(jié)果婚禮上仁期,老公的妹妹穿的比我還像新娘。我一直安慰自己竭恬,他們只是感情好跛蛋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痊硕,像睡著了一般赊级。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岔绸,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天理逊,我揣著相機(jī)與錄音,去河邊找鬼亭螟。 笑死挡鞍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的预烙。 我是一名探鬼主播墨微,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扁掸!你這毒婦竟也來(lái)了翘县?” 一聲冷哼從身側(cè)響起最域,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锈麸,沒想到半個(gè)月后镀脂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忘伞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年薄翅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氓奈。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翘魄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舀奶,到底是詐尸還是另有隱情暑竟,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布育勺,位于F島的核電站但荤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涧至。R本人自食惡果不足惜腹躁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望南蓬。 院中可真熱鬧潜慎,春花似錦、人聲如沸蓖康。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒜焊。三九已至倒信,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泳梆,已是汗流浹背鳖悠。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留优妙,地道東北人乘综。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像套硼,于是被迫代替她去往敵國(guó)和親卡辰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355