- 常用數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介
數(shù)據(jù)元素相互之間的關(guān)系稱為結(jié)構(gòu)。
有四類(lèi)基本結(jié)構(gòu):集合、線性結(jié)構(gòu)、樹(shù)形結(jié)構(gòu)、圖狀結(jié)構(gòu)。
1,集合結(jié)構(gòu):除了同屬于一種類(lèi)型外,別無(wú)其它關(guān)系。
2,線性結(jié)構(gòu):元素之間存在一對(duì)一關(guān)系常見(jiàn)類(lèi)型有:?數(shù)組,鏈表,隊(duì)列,棧,它們之間在操作上有所區(qū)別。
例如:鏈表可在任意位置插入或刪除元素,而隊(duì)列在隊(duì)尾插入元素,隊(duì)頭刪除元素, 棧只能在棧頂進(jìn)行插入,刪除操作.
3,樹(shù)形結(jié)構(gòu):元素之間存在一對(duì)多關(guān)系,常見(jiàn)類(lèi)型有:樹(shù)(有許多特例:二叉樹(shù)、平衡二叉樹(shù)、查找樹(shù)等)。
4,圖形結(jié)構(gòu):元素之間存在多對(duì)多關(guān)系,圖形結(jié)構(gòu)中每個(gè)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)數(shù)和后續(xù)結(jié)點(diǎn)多個(gè)數(shù)可以任意。 - 并發(fā)集合了解哪些?
竟一個(gè)都沒(méi)用過(guò)
并發(fā)集合類(lèi) - 列舉java的集合以及集合之間的繼承關(guān)系
繼承關(guān)系
java集合繼承關(guān)系及特點(diǎn) -
集合類(lèi)以及集合框架
完整集合框架 - 容器類(lèi)介紹以及之間的區(qū)別(
容器類(lèi)估計(jì)很多人沒(méi)聽(tīng)這個(gè)詞,Java容器主要可以劃分為4個(gè)部分:List列表、Set集合、Map映射、工具類(lèi)(Iterator迭代器、Enumeration枚舉類(lèi)、Arrays和Collections),具體的可以看看這篇博文 Java容器類(lèi)) - List,Set,Map的區(qū)別
詳見(jiàn)上邊各帖 - List和Map的實(shí)現(xiàn)方式以及存儲(chǔ)方式
詳見(jiàn)上邊各貼 - HashMap的實(shí)現(xiàn)原理
HashMap的實(shí)現(xiàn)原理
HashMap實(shí)現(xiàn)原理及源碼分析 - HashMap數(shù)據(jù)結(jié)構(gòu)?
見(jiàn)上 - HashMap源碼理解
見(jiàn)上 - HashMap如何put數(shù)據(jù)(從HashMap源碼角度講解)?
//存儲(chǔ)
public V put(K key, V value) {
// HashMap允許存放null鍵和null值。
// 當(dāng)key為null時(shí),調(diào)用putForNullKey方法,將value放置在數(shù)組第一個(gè)位置。
if (key == null)
return putForNullKey(value);
// 根據(jù)key的keyCode重新計(jì)算hash值。
int hash = hash(key.hashCode());
// 搜索指定hash值在對(duì)應(yīng)table中的索引。
int i = indexFor(hash, table.length);
// 如果 i 索引處的 Entry 不為 null,通過(guò)循環(huán)不斷遍歷 e 元素的下一個(gè)元素。
for (Entry<K,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;
}
}
// 如果i索引處的Entry為null,表明此處還沒(méi)有Entry。
modCount++;
// 將key、value添加到i索引處。
addEntry(hash, key, value, i);
return null;
}
void addEntry(int hash, K key, V value, int bucketIndex) {
// 獲取指定 bucketIndex 索引處的 Entry
Entry<K,V> e = table[bucketIndex];
// 將新創(chuàng)建的 Entry 放入 bucketIndex 索引處,并讓新的 Entry 指向原來(lái)的 Entry
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
// 如果 Map 中的 key-value 對(duì)的數(shù)量超過(guò)了極限
if (size++ >= threshold)
// 把 table 對(duì)象的長(zhǎng)度擴(kuò)充到原來(lái)的2倍。
resize(2 * table.length);
}
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length-1);
}
//獲取
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
簡(jiǎn)單來(lái)說(shuō)就是將Entry根據(jù)hash算法放入數(shù)組的鏈表中的一個(gè)過(guò)程
詳見(jiàn)上
- HashMap怎么手寫(xiě)實(shí)現(xiàn)?
見(jiàn)上 - ConcurrentHashMap的實(shí)現(xiàn)原理
Java并發(fā)包中提供的一個(gè)線程安全且高效的HashMap實(shí)現(xiàn),策略就是分段鎖機(jī)制。
ConcurrentHashMap實(shí)現(xiàn)原理及源碼分析 - ArrayMap和HashMap的對(duì)比
ArrayMap和HashMap區(qū)別 - HashTable實(shí)現(xiàn)原理
HashTable的使用和原理 - TreeMap具體實(shí)現(xiàn)
TreeMap - HashMap和HashTable的區(qū)別
(1)基類(lèi)不同:HashTable基于Dictionary類(lèi),而HashMap是基于AbstractMap。Dictionary是什么?它是任何可將鍵映射到相應(yīng)值的類(lèi)的抽象父類(lèi),而AbstractMap是基于Map接口的骨干實(shí)現(xiàn),它以最大限度地減少實(shí)現(xiàn)此接口所需的工作。
(2)null不同:HashMap可以允許存在一個(gè)為null的key和任意個(gè)為null的value,但是HashTable中的key和value都不允許為null。
(3)線程安全:HashMap時(shí)單線程安全的,Hashtable是多線程安全的。
(4)遍歷不同:HashMap僅支持Iterator的遍歷方式,Hashtable支持Iterator和Enumeration兩種遍歷方式 - HashMap與HashSet的區(qū)別
兩者區(qū)別
HashMap和HashSet的區(qū)別 - 集合Set實(shí)現(xiàn)Hash怎么防止碰撞
Java集合---HashSet的源碼分析 - ArrayList和LinkedList的區(qū)別,以及應(yīng)用場(chǎng)景
1,如果應(yīng)用程序?qū)Ω鱾€(gè)索引位置的元素進(jìn)行大量的存取或刪除操作,ArrayList對(duì)象要遠(yuǎn)優(yōu)于LinkedList對(duì)象;
2,如果應(yīng)用程序主要是對(duì)列表進(jìn)行循環(huán),并且循環(huán)時(shí)候進(jìn)行插入或者刪除操作,LinkedList對(duì)象要遠(yuǎn)優(yōu)于ArrayList對(duì)象;
ArrayList和LinkedList區(qū)別及使用場(chǎng)景 - 數(shù)組和鏈表的區(qū)別
數(shù)組 分配內(nèi)存連續(xù),長(zhǎng)度固定,插入,刪除操作效率低
鏈表 分配內(nèi)存不連續(xù),長(zhǎng)度不固定,插入,刪除操作效率高 - 二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷的具體實(shí)現(xiàn)
public void depthFirst() {
Stack<Map<String, Object>> nodeStack = new Stack<Map<String, Object>>();
Map<String, Object> node = new HashMap<String, Object>();
nodeStack.add(node);
while (!nodeStack.isEmpty()) {
node = nodeStack.pop();
System.out.println(node);
//獲得節(jié)點(diǎn)的子節(jié)點(diǎn),對(duì)于二叉樹(shù)就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)
List<Map<String, Object>> children = getChildren(node);
if (children != null && !children.isEmpty()) {
for (Map child : children) {
nodeStack.push(child);
}
}
}
}
?//節(jié)點(diǎn)使用Map存放
public void breadthFirst() {
Deque<Map<String, Object>> nodeDeque = new ArrayDeque<Map<String, Object>>();
Map<String, Object> node = new HashMap<String, Object>();
nodeDeque.add(node);
while (!nodeDeque.isEmpty()) {
node = nodeDeque.peekFirst();
System.out.println(node);
//獲得節(jié)點(diǎn)的子節(jié)點(diǎn),對(duì)于二叉樹(shù)就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)
List<Map<String, Object>> children = getChildren(node);
if (children != null && !children.isEmpty()) {
for (Map child : children) {
nodeDeque.add(child);
}
}
}
}
//這里使用的是雙端隊(duì)列,和使用queue是一樣的
Java遍歷樹(shù)(深度優(yōu)先+廣度優(yōu)先)
堆的結(jié)構(gòu)
特殊的一種樹(shù)
基本數(shù)據(jù)結(jié)構(gòu)――堆的基本概念及其操作
徹底弄懂最大堆的四種操作(圖解+程序)(JAVA)堆和樹(shù)的區(qū)別
二叉排序樹(shù)與堆的區(qū)別堆和棧在內(nèi)存中的區(qū)別是什么(解答提示:可以從數(shù)據(jù)結(jié)構(gòu)方面以及實(shí)際實(shí)現(xiàn)方面兩個(gè)方面去回答)?
堆和棧的區(qū)別(內(nèi)存和數(shù)據(jù)結(jié)構(gòu))什么是深拷貝和淺拷貝
直接賦值:兩變量指向同一對(duì)象,對(duì)任一變量操作發(fā)生變化,兩變量均改變。
淺拷貝:創(chuàng)建一個(gè)新對(duì)象,然后將當(dāng)前對(duì)象的非靜態(tài)字段復(fù)制到該新對(duì)象,如果字段是值類(lèi)型的,那么對(duì)該字段執(zhí)行復(fù)制;如果該字段是引用類(lèi)型的話,則復(fù)制引用但不復(fù)制引用的對(duì)象。因此,原始對(duì)象及其副本引用同一個(gè)對(duì)象。(String是引用類(lèi)型,但是有值類(lèi)型特性)
深拷貝:創(chuàng)建一個(gè)新對(duì)象,然后將當(dāng)前對(duì)象的非靜態(tài)字段復(fù)制到該新對(duì)象,無(wú)論該字段是值類(lèi)型的還是引用類(lèi)型,都進(jìn)行復(fù)制。(在淺拷貝的基礎(chǔ)上,每次拷貝將引用類(lèi)型創(chuàng)建新對(duì)象)
一看就懂的,java深拷貝淺拷貝手寫(xiě)鏈表逆序代碼
單鏈表反轉(zhuǎn)java代碼講一下對(duì)樹(shù),B+樹(shù)的理解
講一下對(duì)樹(shù),B+樹(shù)的理解講一下對(duì)圖的理解
淺析數(shù)據(jù)結(jié)構(gòu)-圖的基本概念判斷單鏈表成環(huán)與否?
判斷單鏈表成環(huán)與否合并多個(gè)單有序鏈表(假設(shè)都是遞增的)
合并k個(gè)有序的鏈表
問(wèn)題來(lái)自:AWeiLoveAndroid的博客


