這篇文章主要介紹“Java數(shù)據(jù)結(jié)構(gòu)中的常見(jiàn)問(wèn)題總結(jié)”,在日常操作中,相信很多人在Java數(shù)據(jù)結(jié)構(gòu)中的常見(jiàn)問(wèn)題總結(jié)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java數(shù)據(jù)結(jié)構(gòu)中的常見(jiàn)問(wèn)題總結(jié)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
1、常用數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素間的關(guān)系組成。常用的數(shù)據(jù)有:數(shù)組、棧、隊(duì)列、鏈表、樹(shù)、圖、堆、散列表。
1)數(shù)組:在內(nèi)存中連續(xù)存儲(chǔ)多個(gè)元素的結(jié)構(gòu)。數(shù)組元素通過(guò)下標(biāo)訪問(wèn),下標(biāo)從0開(kāi)始。優(yōu)點(diǎn):訪問(wèn)速度快;缺點(diǎn):數(shù)組大小固定后無(wú)法擴(kuò)容,只能存儲(chǔ)一種類(lèi)型的數(shù)據(jù),添加刪除操作慢。適用場(chǎng)景:適用于需頻繁查找,對(duì)存儲(chǔ)空間要求不高,很少添加刪除。
2)棧:一種特殊的線性表,只可以在棧頂操作,先進(jìn)后出,從棧頂放入元素叫入棧,從棧頂取出元素叫出棧。應(yīng)用場(chǎng)景:用于實(shí)現(xiàn)遞歸功能,如斐波那契數(shù)列。
3)隊(duì)列:一種線性表,在列表一端添加元素,另一端取出,先進(jìn)先出。使用場(chǎng)景:多線程阻塞隊(duì)列管理中。
4)鏈表:物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表的指針地址實(shí)現(xiàn),每個(gè)元素包含兩個(gè)結(jié)點(diǎn),一個(gè)是存儲(chǔ)元素的數(shù)據(jù)域,一個(gè)是指向下一個(gè)結(jié)點(diǎn)地址的指針域。有單鏈表、雙向鏈表、循環(huán)鏈表。優(yōu)點(diǎn):可以任意加減元素,不需要初始化容量,添加刪除元素只需改變前后兩個(gè)元素結(jié)點(diǎn)的指針域即可。缺點(diǎn):因?yàn)楹写罅恐羔樣?,固占用空間大,查找耗時(shí)。適用場(chǎng)景:數(shù)據(jù)量小,需頻繁增加刪除操作。
5)樹(shù):由n個(gè)有限節(jié)點(diǎn)組成一種具有層次關(guān)系的集合。二叉樹(shù)(每個(gè)結(jié)點(diǎn)最多有兩個(gè)子樹(shù),結(jié)點(diǎn)的度較大為2,左子樹(shù)和右子樹(shù)有順序)、紅黑樹(shù)(HashMap底層源碼)、B+樹(shù)(mysql的數(shù)據(jù)庫(kù)索引結(jié)構(gòu))
6)散列表(哈希表):根據(jù)鍵值對(duì)來(lái)存儲(chǔ)訪問(wèn)。
7)堆:堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值,堆總是一棵完全二叉樹(shù)。
8)圖:由結(jié)點(diǎn)的有窮集合V和邊的集合E組成。
2、并發(fā)集合了解哪些?
1)并發(fā)List,包括Vector和CopyOnWriteArrayList是兩個(gè)線程安全的List,Vector讀寫(xiě)操作都用了同步,CopyOnWriteArrayList在寫(xiě)的時(shí)候會(huì)復(fù)制一個(gè)副本,對(duì)副本寫(xiě),寫(xiě)完用副本替換原值,讀時(shí)不需要同步。
2)并發(fā)Set,CopyOnWriteArraySet基于CopyOnWriteArrayList來(lái)實(shí)現(xiàn)的,不允許存在重復(fù)的對(duì)象。
3)并發(fā)Map,ConcurrentHashMap,內(nèi)部實(shí)現(xiàn)了鎖分離,get操作是無(wú)鎖的。
4)并發(fā)Queue,ConcurrentLinkedQueue適用于高并發(fā)場(chǎng)景下的隊(duì)列,通過(guò)無(wú)鎖方式實(shí)現(xiàn)。 BlockingQueue阻塞隊(duì)列,應(yīng)用場(chǎng)景,生產(chǎn)者-消費(fèi)者模式,若生產(chǎn)快于消費(fèi),生產(chǎn)隊(duì)列裝滿時(shí)會(huì)阻塞,等待消費(fèi)。
5)并發(fā)Deque, LinkedBlockingDueue沒(méi)有進(jìn)行讀寫(xiě)鎖分離,同一時(shí)間只能有一個(gè)線程對(duì)其操作。
6)并發(fā)鎖重入鎖ReentrantLock,互斥鎖,一次最多只能一個(gè)線程拿到鎖。
7)讀寫(xiě)鎖ReadWriteLock,有讀取和寫(xiě)入鎖兩種,讀取允許多個(gè)讀取線程同時(shí)持有,而寫(xiě)入只能有一個(gè)線程持有。
3、列舉java的集合以及集合之間的繼承關(guān)系
1.單列表
2.雙列表
4、容器類(lèi)介紹以及之間的區(qū)別
1)Collection接口:集合框架的根接口,它是集合類(lèi)框架中最具一般性的頂層接口。
2)Map接口:提供了鍵值對(duì)的映射關(guān)系的集合,關(guān)鍵字不能有重復(fù)值,每個(gè)關(guān)鍵字至多可映射一個(gè)值。HashMap(通過(guò)散列機(jī)制,用于快速訪問(wèn)),TreeMap(保持key處于排序狀態(tài),訪問(wèn)速度不如hashmap), LinkedHashMap(保持元素的插入順序)
3)Set接口:不能包含重復(fù)的元素,LinkedHashSet TreeSet(用紅黑樹(shù)來(lái)存儲(chǔ)元素) HashSet
4)List接口:可通過(guò)索引對(duì)元素進(jìn)行精準(zhǔn)的插入和查找,實(shí)現(xiàn)類(lèi)有ArrayList LinkedList
5)Queue接口:繼承自Collection接口,LinkedList實(shí)現(xiàn)了Queue接口,提供了支持隊(duì)列的行為。
6)Iterator接口:為了迭代集合
7)Comparable接口:用于比較
5、List,Set,Map的區(qū)別
Set是一個(gè)無(wú)序的集合,不能包含重復(fù)的元素;
list是一個(gè)有序的集合可以包含重復(fù)的元素,提供了按索引訪問(wèn)的方式;
map包含了key-value對(duì),map中key必須,value可以重復(fù)。
6、HashMap的實(shí)現(xiàn)原理
1)數(shù)據(jù)結(jié)構(gòu)
jdk1.7及以前,HashMap由數(shù)組+鏈表組成,數(shù)組Entry是HashMap的主體,Entry是HashMap中的一個(gè)靜態(tài)內(nèi)部類(lèi),每一個(gè)Entry包含一個(gè)key-value鍵值對(duì),鏈表是為解決哈希沖突而存在。
從jdk1.8起,HashMap是由數(shù)組+鏈表/紅黑樹(shù)組成,當(dāng)某個(gè)bucket位置的鏈表長(zhǎng)度達(dá)到閥值8時(shí),這個(gè)鏈表就轉(zhuǎn)變成紅黑樹(shù)。
2)HashMap是線程不安全的,存儲(chǔ)比較快,能接受null值,HashMap通過(guò)put(key, value)來(lái)儲(chǔ)存元素,通過(guò)get(key)來(lái)得到value值,通過(guò)hash算法來(lái)計(jì)算hashcode值,用hashcode標(biāo)識(shí)Entry在bucket中存儲(chǔ)的位置。
3)HashMap中為什么要使用加載因子,為什么要進(jìn)行擴(kuò)容
加載因子是指當(dāng)HashMap中存儲(chǔ)的元素/較大空間值的閥值,如果超過(guò)這個(gè)值,就會(huì)進(jìn)行擴(kuò)容。加載因子是為了讓空間得到充分利用,如果加載因子太大,雖對(duì)空間利用更充分,但查找效率會(huì)降低;如果加載因子太小,表中的數(shù)據(jù)過(guò)于稀疏,很多空間還沒(méi)用就開(kāi)始擴(kuò)容,就會(huì)對(duì)空間造成浪費(fèi)。
至于為什么要擴(kuò)容,如果不擴(kuò)容,HashMap中數(shù)組處的鏈表會(huì)越來(lái)越長(zhǎng),這樣查找效率就會(huì)大大降低。
6.1 HashMap如何put數(shù)據(jù)(從HashMap源碼角度講解)?
當(dāng)我們使用put(key, value)存儲(chǔ)對(duì)象到HashMap中時(shí),具體實(shí)現(xiàn)步驟如下:
1)先判斷table數(shù)組是否為空,為空以默認(rèn)大小構(gòu)建table,table默認(rèn)空間大小為16
2)計(jì)算key的hash值,并計(jì)算hash&(n-1)值得到在數(shù)組中的位置index,如果該位置沒(méi)值即table[index]為空,則直接將該鍵值對(duì)存放在table[index]處。
3)如果table[index]處不為空,說(shuō)明發(fā)生了hash沖突,判斷table[index]處結(jié)點(diǎn)是否是TreeNode(紅黑樹(shù)結(jié)點(diǎn))類(lèi)型數(shù)據(jù),如果是則執(zhí)行putTreeVal方法,按紅黑樹(shù)規(guī)則將鍵值對(duì)存入;
4)如果table[index]是鏈表形式,遍歷該鏈表上的數(shù)據(jù),將該鍵值對(duì)放在table[index]處,并將其指向原index處的鏈表。判斷鏈表上的結(jié)點(diǎn)數(shù)是否大于鏈表較大結(jié)點(diǎn)限制(默認(rèn)為8),如果超過(guò)了需執(zhí)行treeifyBin()操作,則要將該鏈表轉(zhuǎn)換成紅黑樹(shù)結(jié)構(gòu)。
5)判斷HashMap中數(shù)據(jù)個(gè)數(shù)是否超過(guò)了(較大容量*裝載因子),如果超過(guò)了,還需要對(duì)其進(jìn)行擴(kuò)容操作。
6.2 HashMap如何get數(shù)據(jù)?
get(key)方法獲取key的hash值,計(jì)算hash&(n-1)得到在鏈表數(shù)組中的位置first=table[hash&(n-1)],先判斷first(即數(shù)組中的那個(gè))的key是否與參數(shù)key相等,不等的話,判斷結(jié)點(diǎn)是否是TreeNode類(lèi)型,是則調(diào)用getTreeNode(hash, key)從二叉樹(shù)中查找結(jié)點(diǎn),不是TreeNode類(lèi)型說(shuō)明還是鏈表型,就遍歷鏈表找到相同的key值返回對(duì)應(yīng)的value值即可。
6.3 當(dāng)兩個(gè)對(duì)象的hashcode相同,即發(fā)生碰撞時(shí),HashMap如何處理
當(dāng)兩個(gè)對(duì)象的hashcode相同,它們的bucket位置相同,hashMap會(huì)用鏈表或是紅黑樹(shù)來(lái)存儲(chǔ)對(duì)象。Entry類(lèi)里有一個(gè)next屬性,作用是指向下一個(gè)Entry。第一個(gè)鍵值對(duì)A進(jìn)來(lái),通過(guò)計(jì)算其key的hash得到index,記做Entry[index]=A。一會(huì)又進(jìn)來(lái)一個(gè)鍵值對(duì)B,通過(guò)計(jì)算其key的hash也是index,HashMap會(huì)將B.next=A, Entry[index]=B.如果又進(jìn)來(lái)C,其key的hash也是index,會(huì)將C.next=B, Entry[index]=C.這樣bucket為index的地方存放了A\B\C三個(gè)鍵值對(duì),它們能過(guò)next屬性鏈在一起。數(shù)組中存儲(chǔ)的是最后插入的元素,其他元素都在后面的鏈表里。
6.4 如果兩個(gè)鍵的hashcode相同,如何獲取值對(duì)象?
當(dāng)調(diào)用get方法時(shí),hashmap會(huì)使用鍵對(duì)象的hashcode找到bucket位置,找到bucket位置后,會(huì)調(diào)用key.equals()方法去找到鏈表中正確的節(jié)點(diǎn),最終找到值對(duì)象。
6.5 hashMap如何擴(kuò)容
HashMap默認(rèn)負(fù)載因?yàn)槭?.75,當(dāng)一個(gè)map填滿了75%的bucket時(shí),和其他集合類(lèi)一樣,將會(huì)創(chuàng)建原來(lái)HashMap大小兩倍的bucket數(shù)組,來(lái)重新調(diào)整HashMap的大小,并將原來(lái)的對(duì)象放入新的bucket數(shù)組中。
在jdk1.7及以前,多線程擴(kuò)容可能出現(xiàn)死循環(huán)。因?yàn)樵谡{(diào)整大小過(guò)程中,存儲(chǔ)在某個(gè)bucket位置中的鏈表元素次序會(huì)反過(guò)來(lái),而多線程情況下可能某個(gè)線程翻轉(zhuǎn)完鏈表,另外一個(gè)線程又開(kāi)始翻轉(zhuǎn),條件競(jìng)爭(zhēng)發(fā)生了,那么就死循環(huán)了。
而在jdk1.8中,會(huì)將原來(lái)鏈表結(jié)構(gòu)保存至節(jié)點(diǎn)e中,將原來(lái)數(shù)組中的位置設(shè)為null,然后依次遍歷e,根據(jù)hash&n是否為0分成兩條支鏈,保存在新數(shù)組中。如果多線程情況可能會(huì)取到null值造成數(shù)據(jù)丟失。
7、ConcurrentHashMap的實(shí)現(xiàn)原理
1)jdk1.7及以前:一個(gè)ConcurrentHashMap由一個(gè)segment數(shù)組和多個(gè)HashEntry組成,每一個(gè)segment都包含一個(gè)HashEntry數(shù)組, Segment繼承ReentrantLock用來(lái)充當(dāng)鎖角色,每一個(gè)segment包含了對(duì)自己的HashEntry的操作,如get\put\replace操作,這些操作發(fā)生時(shí),對(duì)自己的HashEntry進(jìn)行鎖定。由于每一個(gè)segment寫(xiě)操作只鎖定自己的HashEntry,可以存在多個(gè)線程同時(shí)寫(xiě)的情況。
jdk1.8以后:ConcurrentHashMap取消了segments字段,采用transient volatile HashEntry table保存數(shù)據(jù),采用table數(shù)組元素作為鎖,實(shí)現(xiàn)對(duì)每一個(gè)數(shù)組數(shù)據(jù)進(jìn)行加鎖,進(jìn)一小減少并發(fā)沖突概率。ConcurrentHashMap是用Node數(shù)組+鏈表+紅黑樹(shù)數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,并發(fā)制定用synchronized和CAS操作。
2)Segment實(shí)現(xiàn)了ReentrantLock重入鎖,當(dāng)執(zhí)行put操作,會(huì)進(jìn)行第一次key的hash來(lái)定位Segment的位置,若該Segment還沒(méi)有初始化,會(huì)通過(guò)CAS操作進(jìn)行賦值,再進(jìn)行第二次hash操作,找到相應(yīng)的HashEntry位置。
8、ArrayMap和HashMap的對(duì)比
1)存儲(chǔ)方式不一樣,HashMap內(nèi)部有一個(gè)Node[]對(duì)象,每個(gè)鍵值對(duì)都會(huì)存儲(chǔ)到這個(gè)對(duì)象里,當(dāng)用put方法添加鍵值對(duì)時(shí),會(huì)new一個(gè)Node對(duì)象,tab[i] = newNode(hash, key, value, next);
ArrayMap存儲(chǔ)則是由兩個(gè)數(shù)組來(lái)維護(hù),int[] mHashes; Object[] mArray; mHashes數(shù)組中保存的是每一項(xiàng)的HashCode值,mArray存的是鍵值對(duì),每?jī)蓚€(gè)元素代表一個(gè)鍵值對(duì),前面保存key,后面保存value。mHashes[index]=hash; mArray[index<<1]=key; mArray[(index<<1)+1]=value; ArrayMap相對(duì)于HashMap,無(wú)需為每個(gè)鍵值對(duì)創(chuàng)建Node對(duì)象,且在數(shù)組中連續(xù)存放,更省空間。 2)添加數(shù)據(jù)時(shí)擴(kuò)容處理不一樣,進(jìn)行了new操作,重新創(chuàng)建對(duì)象,開(kāi)銷(xiāo)很大;而ArrayMap用的是copy數(shù)據(jù),所有效率相對(duì)高些; 3)ArrayMap提供了數(shù)組收縮功能,在clear或remove后,會(huì)重新收縮數(shù)組,釋放空間; 4)ArrayMap采用二分法查找,mHashes中的hash值是按照從小到大的順序連續(xù)存放的,通過(guò)二分查找來(lái)獲取對(duì)應(yīng)hash下標(biāo)index,去mArray中查找鍵值對(duì)。mHashes中的index2是mArray中的key下標(biāo),index2+1為value的下標(biāo),由于存在hash碰撞情況,二分查找到的下標(biāo)可能是多個(gè)連續(xù)相同的hash值中的任意一個(gè),此時(shí)需要用equals比對(duì)命中的key對(duì)象是否相等,不相等,應(yīng)當(dāng)從當(dāng)前index先向后再向前遍歷所有相同hash值。 5)sparseArray比ArrayMap進(jìn)一步優(yōu)化空間,SparseArray專門(mén)對(duì)基本類(lèi)型做了優(yōu)化,Key只能是可排序的基本類(lèi)型,如int\long,對(duì)value,除了泛型Value,還對(duì)每種基本類(lèi)型有單獨(dú)實(shí)現(xiàn),如SparseBooleanArray\SparseLongArray等。無(wú)需包裝,直接使用基本類(lèi)型值,無(wú)需hash,直接使用基本類(lèi)型值索引和判斷相等,無(wú)碰撞,無(wú)需調(diào)用hashCode方法,無(wú)需equals比較。SparseArray延遲刪除。 9、HashTable實(shí)現(xiàn)原理
Hashtable中的無(wú)參構(gòu)造方法Hashtable()中調(diào)用了this(11, 0.75f),說(shuō)明它默認(rèn)容量是11,加載因子是0.75,在構(gòu)造方法上會(huì)new HashtableEntry[initialCapacity]; 會(huì)新建一個(gè)容量是初始容量的HashtableEntry數(shù)組。HashtableEntry數(shù)組中包含hash\Key\Value\next變量,鏈表形式,重寫(xiě)了hashCode和equals方法。Hashtable所有public方法都在方法體上加上了synchronized鎖操作,說(shuō)明它是線程安全的。它還實(shí)現(xiàn)了Serializable接口中的writeObject和readObject方法,分別實(shí)現(xiàn)了逐行讀取和寫(xiě)入的功能,并且加了synchronized鎖操作。
(1) put(Key, Value)方法
1)先判斷value是否為空,為空拋出空指針異常;
2)根據(jù)key的hashCode()值,計(jì)算table表中的位置索引(hash&0x7FFFFFFF)%tab.length值index,如果該索引處有值,再判斷該索引處鏈表中是否包含相同的key,如果key值相同則替換舊值。
3)如果沒(méi)有相同的key值,調(diào)用addEntry方法,在addEntry中判斷count大小是否超過(guò)了較大容量限制,如果超過(guò)了需要重新rehash(),容量變成原來(lái)容量*2+1,將原表中的值都重新計(jì)算hash值放入新表中。再構(gòu)造一個(gè)HashtableEntry對(duì)象放入相應(yīng)的table表頭,如果原索引處有值,則將table[index].next指向原索引處的鏈表。
(2)get方法
根所key.hashCode(),計(jì)算它在table表中的位置,(hash&0x7FFFFFFF)%tab.length,遍歷該索引處表的位置中是否有值,是否存在鏈表,再判斷是key值和hash值是否相等,相等則返回對(duì)應(yīng)的value值。
10、HashMap和HashTable的區(qū)別
1)Hashtable是個(gè)線程安全的類(lèi),在對(duì)外方法都添加了synchronized方法,序列化方法上也添加了synchronized同步鎖方法,而HashMap非線程安全。這也導(dǎo)致Hashtable的讀寫(xiě)等操作比HashMap慢。
2)Hashtable不允許值和鍵為空,若為空會(huì)拋出空指針。而HashMap允許鍵和值為空;
3)Hashtable根據(jù)key值的hashCode計(jì)算索引,(hash&0x7FFFFFFF)%tab.length,保證hash值始終為正數(shù)且不超過(guò)表的長(zhǎng)度。而HashMap中計(jì)算索引值是通過(guò)hash(key)&(tab.length-1),是通過(guò)與操作,計(jì)算出在表中的位置會(huì)比Hashtable快。
4)Hashtable容量能為任意大于等于1的正數(shù),而HashMap的容量必須為2^n,Hashtable默認(rèn)容量為11,HashMap初始容量為16
5)Hashtable每次擴(kuò)容,新容量為舊容量的2倍+1,而HashMap為舊容量的2倍。
11、HashMap與HashSet的區(qū)別
HashSet底層實(shí)現(xiàn)是HashMap,內(nèi)部包含一個(gè)HashMap map變量
private transient HashMap map;
一個(gè)Object PRESENT變量(當(dāng)成插入map中的value值)
private static final Object PRESENT = new Object();
HashSet中元素都存到HashMap鍵值對(duì)的Key上面。具體可以查看HashSet的add方法,直接調(diào)用了HashMap的put方法,將值作為HashMap的鍵,值用一個(gè)固定的PRESENT值。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashSet沒(méi)有單獨(dú)的get方法,用的是HashMap的。HashSet實(shí)現(xiàn)了Set接口,不允許集合中出現(xiàn)重復(fù)元素,將對(duì)象存儲(chǔ)進(jìn)HashSet前,要先確保對(duì)象重寫(xiě)了hashCode()和equals方法,以保證放入set對(duì)象是的。
12、HashSet與HashMap怎么判斷集合元素重復(fù)?
HashMap在放入key-value鍵值對(duì)是,先通過(guò)key計(jì)算其hashCode()值,再與tab.length-1做與操作,確定下標(biāo)index處是否有值,如果有值,再調(diào)用key對(duì)象的equals方法,對(duì)象不同則插入到表頭,相同則覆蓋;
HashSet是將數(shù)據(jù)存放到HashMap的key中,HashMap是key-value形式的數(shù)據(jù)結(jié)構(gòu),它的key是的,HashSet利用此原理保證放入的對(duì)象性。
13、集合Set實(shí)現(xiàn)Hash怎么防止碰撞
HashSet底層實(shí)現(xiàn)是HashMap,HashMap如果兩個(gè)不同Key對(duì)象的hashCode()值相等,會(huì)用鏈表存儲(chǔ),HashSet也一樣。
14、ArrayList和LinkedList的區(qū)別,以及應(yīng)用場(chǎng)景
ArrayList底層是用數(shù)組實(shí)現(xiàn)的,隨著元素添加,其大小是動(dòng)態(tài)增大的;在內(nèi)存中是連續(xù)存放的;如果在集合末尾添加或刪除元素,所用時(shí)間是一致的,如果在列表中間添加或刪除元素,所用時(shí)間會(huì)大大增加。通過(guò)索引查找元素速度很快。適合場(chǎng)合:查詢比較多的場(chǎng)景
LinkedList底層是通過(guò)雙向鏈表實(shí)現(xiàn)的,LinkedList和ArrayList相比,增刪速度快,但查詢和修改值速度慢。在內(nèi)存中不是連續(xù)內(nèi)存。場(chǎng)景:增刪操作比較多的場(chǎng)景。
到此,關(guān)于“Java數(shù)據(jù)結(jié)構(gòu)中的常見(jiàn)問(wèn)題總結(jié)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
網(wǎng)站名稱:Java數(shù)據(jù)結(jié)構(gòu)中的常見(jiàn)問(wèn)題總結(jié)-創(chuàng)新互聯(lián)
本文鏈接:http://www.rwnh.cn/article36/cojhsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站收錄、虛擬主機(jī)、企業(yè)建站、網(wǎng)站導(dǎo)航、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容