數(shù)組,是最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),是一種用來存儲(chǔ)多個(gè)數(shù)據(jù)的容器.
數(shù)據(jù)結(jié)構(gòu):
把多個(gè)數(shù)據(jù)按照一定的存儲(chǔ)方式,存儲(chǔ)起來,稱存儲(chǔ)方式之為數(shù)據(jù)結(jié)構(gòu).
數(shù)據(jù)的存儲(chǔ)方式有很多,數(shù)組,隊(duì)列,鏈表,棧,哈希表等等.
不同的數(shù)據(jù)結(jié)構(gòu),性能是不一樣的,比如有的插入比較快,查詢比較快,但是刪除比較慢.
有的刪除比較快,插入比較快,但是查詢比較慢.
根據(jù)實(shí)際操作,合理選擇即可
集合
- 集合和數(shù)組的區(qū)別
數(shù)組和集合類都是容器
數(shù)組長(zhǎng)度是固定的啊央,集合長(zhǎng)度是可變的。數(shù)組中可以存儲(chǔ)基本數(shù)據(jù)類型,集合只能存儲(chǔ)對(duì)象, 數(shù)組中存儲(chǔ)數(shù)據(jù)類型是單一的,數(shù)組一旦初始化罪佳,長(zhǎng)度固定叛赚,且操作復(fù)雜GURD,集合中可以存儲(chǔ)任意類型的對(duì)象豹爹。
集合類的特點(diǎn)
用于存儲(chǔ)對(duì)象,長(zhǎng)度是可變的矛纹,可以存儲(chǔ)不同類型的對(duì)象臂聋。
數(shù)組的特點(diǎn):
1. 只能存儲(chǔ)同一種數(shù)據(jù)類型的數(shù)據(jù)。
2. 一旦初始化或南,長(zhǎng)度固定孩等。
3. 數(shù)組中的元素與元素之間的內(nèi)存地址是連續(xù)的
4.Object類型的數(shù)組可以存儲(chǔ)任意類型的數(shù)據(jù)
注意: 集合和數(shù)組中存儲(chǔ)都是對(duì)象的引用,而不是對(duì)象本身
- 集合的分類
- Collection: 單列集合
- 1.List:
如果是實(shí)現(xiàn)了List接口的集合類采够,具備的特點(diǎn): 有序瞎访,可重復(fù);只有List接口下面的集合類才具備索引值。其他接口下面的集合類都沒有索引值
- 1.1.ArrayList:
底層是維護(hù)了一個(gè)Object數(shù)組實(shí)現(xiàn) 的吁恍, 特點(diǎn): 查詢速度快扒秸,增刪慢。
什么時(shí)候使用ArrayList: 如果目前的數(shù)據(jù)是查詢比較多冀瓦,增刪比較少的時(shí)候伴奥,那么就使用ArrayList存儲(chǔ)這批數(shù)據(jù)。
注意: 當(dāng)使用無參構(gòu)造函數(shù)時(shí)翼闽,Object數(shù)組默認(rèn)的容量是10拾徙,當(dāng)長(zhǎng)度不夠時(shí),自動(dòng)增長(zhǎng)0.5倍感局。
- 1.2.LinkedList:
底層是使用了鏈表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的尼啡, 特點(diǎn): 查詢速度慢,增刪快
由于鏈表實(shí)現(xiàn), 增加時(shí)只要讓前一個(gè)元素記住自己就可以, 刪除時(shí)讓前一個(gè)元素記住后一個(gè)元素, 后一個(gè)元素記住前一個(gè)元素. 這樣的增刪效率較高但查詢時(shí)需要一個(gè)一個(gè)的遍歷, 所以效率較低
- 1.3.Vector:
和ArrayList原理相同,底層也是維護(hù)了一個(gè)Object的數(shù)組實(shí)現(xiàn)的, 但Vector是線程安全的, 效率略低, , 考慮了線程安全問題, 所以效率略低
- 2.Set:
如果是實(shí)現(xiàn)了Set接口的集合類询微,具備特點(diǎn): 無序崖瞭,不可重復(fù)。
- 2.1HashSet
底層是使用了哈希表來支持的撑毛,特點(diǎn): 存取速度快.
hashSet的實(shí)現(xiàn)原理:
往Haset添加元素的時(shí)候书聚,HashSet會(huì)先調(diào)用元素的hashCode方法得到元素的哈希值 ,然后通過元素 的哈希值經(jīng)過移位等運(yùn)算,就可以算出該元素在哈希表中 的存儲(chǔ)位置雌续。
情況1: 如果算出元素存儲(chǔ)的位置目前沒有任何元素存儲(chǔ)斩个,那么該元素可以直接存儲(chǔ)到該位置上。
情況2: 如果算出該元素的存儲(chǔ)位置目前已經(jīng)存在有其他的元素了驯杜,那么會(huì)調(diào)用該元素的equals方法與該位置的元素再比較一次受啥,如果equals返回的是true,那么該元素與這個(gè)位置上的元素就視為重復(fù)元素鸽心,不允許添加滚局,如果equals方法返回的是false,那么該元素運(yùn)行 添加再悼。
- 2.2TreeSet
TreeSet低城是使用紅黑樹(二叉樹)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,存儲(chǔ)規(guī)則:左小到右膝但,
TreeSet要注意的事項(xiàng):
(1). 往TreeSet添加元素的時(shí)候冲九,如果元素本身具備了自然順序的特性,那么就按照元素自然順序的特性進(jìn)行排序存儲(chǔ)跟束。
(2). 往TreeSet添加元素的時(shí)候莺奸,如果元素本身不具備自然順序的特性,那么該元素所屬的類必須要實(shí)現(xiàn)Comparable接口冀宴,把元素的比較規(guī)則定義在compareTo(T o)方法上灭贷。
(3). 如果比較元素的時(shí)候,compareTo方法返回 的是0略贮,那么該元素就被視為重復(fù)元素甚疟,不允許添加.(注意:TreeSet與HashCode、equals方法是沒有任何關(guān)系逃延。)
(4). 往TreeSet添加元素的時(shí)候, 如果元素本身沒有具備自然順序 的特性览妖,而元素所屬的類也沒有實(shí)現(xiàn)Comparable接口,那么必須要在創(chuàng)建TreeSet的時(shí)候傳入一個(gè)比較器揽祥。
(5). 往TreeSet添加元素的時(shí)候讽膏,如果元素本身不具備自然順序的特性,而元素所屬的類已經(jīng)實(shí)現(xiàn)了Comparable接口拄丰, 在創(chuàng)建TreeSet對(duì)象的時(shí)候也傳入了比較器那么是以比較器的比較規(guī)則優(yōu)先使用府树。
自定義定義比較器: 自定義一個(gè)類實(shí)現(xiàn)Comparator接口即可,把元素與元素之間的比較規(guī)則定義在compare方法內(nèi)即可料按。
自定義比較器的格式 :
} ```
注意:TreeSet可對(duì)String排序(有默認(rèn)順序),
字符串的比較規(guī)則:
情況一: 對(duì)應(yīng)位置有不同的字符出現(xiàn)奄侠, 就比較的就是對(duì)應(yīng)位置不同的字符。
情況 二:對(duì)應(yīng)位置上 的字符都一樣载矿,比較的就是字符串的長(zhǎng)度遭铺。
推薦使用:使用比較器(Comparator)。
- 2.3LinkedHashSet
- Map: 鍵值對(duì)
- HashMap
- TreeMap
- HashTable
- LinkedHashMap
- Collection接口
>Collection是單例集合的跟接口,一個(gè)Collection代表一組Object魂挂,即Collection的元素(Elements)甫题。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set涂召。
- Map接口
- Iterator迭代器
>主要用于遍歷集合對(duì)象坠非,Jdk1.5之后添加的新接口, Collection的父接口. 實(shí)現(xiàn)了Iterable接口的類就是可迭代的.并且支持增強(qiáng)for循環(huán)。該接口只有一個(gè)方法即獲取迭代器的方法iterator()可以獲取每個(gè)容器自身的迭代器Iterator果正。(Collection)集合容器都需要獲取迭代器(Iterator)于是在5.0后又進(jìn)行了抽取將獲取容器迭代器的iterator()方法放入到了Iterable接口中炎码。Collection接口進(jìn)程了Iterable,所以Collection體系都具備獲取自身迭代器的方法秋泳,只不過每個(gè)子類集合都進(jìn)行了重寫(因?yàn)閿?shù)據(jù)結(jié)構(gòu)不同)
- Iterator接口定義的方法
>Itreator 該接口是集合的迭代器接口類
定義了常見的迭代方法
1:boolean hasNext()
判斷集合中是否有元素潦闲,如果有元素可以迭代,就返回true迫皱。
2: E next()
返回迭代的下一個(gè)元素歉闰,注意:如果沒有下一個(gè)元素時(shí),調(diào)用
next元素會(huì)拋出NoSuchElementException
3: voidremove()
從迭代器指向的集合中移除迭代器返回的最后一個(gè)元素(可選操
作)卓起。
- List特有的迭代器ListIterator
>Iterator在迭代時(shí)和敬,只能對(duì)元素進(jìn)行獲取(next())和刪除(remove())的操作。
對(duì)于Iterator 的子接口ListIterator在迭代list集合時(shí)戏阅,還可以對(duì)元素進(jìn)行添加(add(obj))昼弟,修改set(obj)的操作。
定義一下特有方法
1. add(E e)
將指定的元素插入列表(可選操作)奕筐。該元素直接插入到返回的下一個(gè)元素的前面(如果有)
2.void set(E o)
用指定元素替換 next或 previous返回的最后一個(gè)元素
3.hasPrevious()
逆向遍歷列表舱痘,列表迭代器有多個(gè)元素,則返回true离赫。
4.previous()
返回列表中的前一個(gè)元素衰粹。
- 泛型