java數(shù)據(jù)結(jié)構(gòu)及框架

慕課視頻(java入門資料):https://www.imooc.com/learn/110、菜鳥教程

一. java數(shù)據(jù)結(jié)構(gòu):

? ??????枚舉(Enumeration)、位集合(BitSet)、向量(Vector)、棧(Stack)、字典(Dictionary)、哈希表(Hashtable)、屬性(Properties)

? ??????Java Enumeration接口:

? ? ? ? ? ? ? ? 1.Enumeration接口中定義了一些方法,通過這些方法可以枚舉(一次獲得一個)對象集合中的元素。

? ? ? ? ? ? ? ? 2.正漸漸被迭代器取代。

? ??????????????boolean hasMoreElements( )? ? ? ? ??測試此枚舉是否包含更多的元素。

? ??????????????Object nextElement( )? ? ? ? ? ??如果此枚舉對象至少還有一個可提供的元素,則返回此枚舉的下一個元素。

????????Java Bitset類?:

? ? ? ? ? ? ? ? 1.位集合類實現(xiàn)了一組可以單獨設(shè)置和清除的位或標(biāo)志。一個Bitset類創(chuàng)建一種特殊類型的數(shù)組來保存位值。

? ? ? ? ? ? ? ? 2.BitSet中數(shù)組大小會隨需要增加。這和位向量(vector of bits)比較類似。? ? ? ?

? ? ? ? ? ? ? ? 3.BitSet定義了兩個構(gòu)造方法:第一個構(gòu)造方法創(chuàng)建一個默認(rèn)的對象:BitSet()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第二個方法允許用戶指定初始大小。所有位初始化為0。BitSet(int size)

????????Java Vector 類

? ? ? ? ? ? ? ? 1.向量(Vector)類和傳統(tǒng)數(shù)組非常相似,但是Vector的大小能根據(jù)需要動態(tài)的變化。和 ArrayList 很相似,但是兩者是不同的:Vector 是同步訪問的。Vector 包含了許多傳統(tǒng)的方法,這些方法不屬于集合框架。

? ? ? ? ? ? ? ? 2.和數(shù)組一樣,Vector對象的元素也能通過索引訪問。

? ? ? ? ? ? ? ? 3.使用Vector類最主要的好處就是在創(chuàng)建對象的時候不必給對象指定大小,它的大小會根據(jù)需要動態(tài)的變化。

? ? ? ? ? ? ? ? 4.Vector 類支持 4 種構(gòu)造方法。

? ? ? ? ? ? ? ? ? ? 第一種構(gòu)造方法創(chuàng)建一個默認(rèn)的向量,默認(rèn)大小為 10:? ? ? ?Vector()

? ? ? ? ? ? ? ? ? ? 第二種構(gòu)造方法創(chuàng)建指定大小的向量。? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Vector(int size)

? ? ? ? ? ? ? ? ? ? 第三種構(gòu)造方法創(chuàng)建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素數(shù)目。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Vector(int size,int incr)

? ? ? ? ? ? ? ? ? ? 第四種構(gòu)造方法創(chuàng)建一個包含集合 c 元素的向量:? ? ? ? Vector(Collection c)

? ??????Java Stack 類:

? ? ? ? ? ? ? ? 1.棧(Stack)實現(xiàn)了一個后進先出(LIFO)的數(shù)據(jù)結(jié)構(gòu)。棧是Vector的一個子類

? ??????Java Dictionary 類:

? ? ? ? ? ? ? ? 1.字典(Dictionary) 類是一個抽象類,它定義了鍵映射到值的數(shù)據(jù)結(jié)構(gòu)。作用和Map類相似。

? ??????Java Hashtable 類:

? ? ? ? ? ? ? ? 1.Hashtable類提供了一種在用戶定義鍵結(jié)構(gòu)的基礎(chǔ)上來組織數(shù)據(jù)的手段。

? ? ? ? ? ? ? ? 2.Hashtable是原始的java.util的一部分, 是一個Dictionary具體的實現(xiàn) 。

? ? ? ? ? ? ? ? 3.Hashtable現(xiàn)在集成到了集合框架中。它和HashMap類很相似,但是它支持同步。

? ? ? ? ? ? ? ? 4.Hashtable定義了四個構(gòu)造方法。

? ? ? ? ? ? ? ? ????????第一個是默認(rèn)構(gòu)造方法:? ? ? ? ? ? ? ? Hashtable()

????????????????????????第二個構(gòu)造函數(shù)創(chuàng)建指定大小的哈希表:? ? ? ? ? ? ?Hashtable(int size)

????????????????????????第三個構(gòu)造方法創(chuàng)建了一個指定大小的哈希表,并且通過fillRatio指定填充比例。填充比例必須介于0.0和1.0之間,它決定了哈希表在重新調(diào)整大小之前的充滿程度:? ? ? ? ? ? Hashtable(int size,float fillRatio)

????????????????????????第四個構(gòu)造方法創(chuàng)建了一個以M中元素為初始化元素的哈希表。哈希表的容量被設(shè)置為M的兩倍。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Hashtable(Map m)

? ??????Java Properties 類:

? ? ? ? ? ? ? ? 1.Properties 繼承于 Hashtable.Properties 類表示了一個持久的屬性集.屬性列表中每個鍵及其對應(yīng)值都是一個字符串。

? ? ? ? ? ? ? ? 2.Properties 類被許多Java類使用。例如,在獲取環(huán)境變量時它就作為System.getProperties()方法的返回值。

? ? ? ? ? ? ? ? 3.Properties 定義如下實例變量.這個變量持有一個Properties對象相關(guān)的默認(rèn)屬性列表。 Properties defaults;

? ? ? ? ? ? ? ? 4.Properties類定義了兩個構(gòu)造方法. 第一個構(gòu)造方法沒有默認(rèn)值。? ? ? ? ? ? ?Properties()

? ? ? ? ? ? ? ? 5.第二個構(gòu)造方法使用propDefault 作為默認(rèn)值。兩種情況下,屬性列表都為空:?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Properties(Properties propDefault)

二. java集合框架:

? ? ? ? Java 集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。Collection 接口又有 3 種子類型,List、Set 和 Queue,再下面是一些抽象類,最后是具體實現(xiàn)類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

? ??????接口:是代表集合的抽象數(shù)據(jù)類型。例如 Collection、List、Set、Map 等。之所以定義多個接口,是為了以不同的方式操作集合對象

? ??????實現(xiàn)(類):是集合接口的具體實現(xiàn)。從本質(zhì)上講,它們是可重復(fù)使用的數(shù)據(jù)結(jié)構(gòu),例如:ArrayList、LinkedList、HashSet、HashMap。

? ??????算法:是實現(xiàn)集合接口的對象里的方法執(zhí)行的一些有用的計算,例如:搜索和排序。這些算法被稱為多態(tài),那是因為相同的方法可以在相似的接口上有著不同的實現(xiàn)。

集合接口:

? ? ? ? 1. Collection 接口:Collection 是最基本的集合接口,一個 Collection 代表一組 Object,即 Collection 的元素, Java不提供直接繼承自Collection的類,只提供繼承于的子接口(如List和set)。Collection 接口存儲一組不唯一,無序的對象。

? ? ? ? 2. List 接口:List接口是一個有序的 Collection,使用此接口能夠精確的控制每個元素插入的位置,能夠通過索引(元素在List中位置,類似于數(shù)組的下標(biāo))來訪問List中的元素,第一個元素的索引為 0,而且允許有相同的元素。List 接口存儲一組不唯一,有序(插入順序)的對象。

? ? ? ? 3. Set:Set 具有與 Collection 完全一樣的接口,只是行為上不同,Set 不保存重復(fù)的元素。Set 接口存儲一組唯一,無序的對象。

? ? ? ? 4. SortedSet :繼承于Set保存有序的集合。

? ? ? ? 5. Map: 接口存儲一組鍵值對象,提供key(鍵)到value(值)的映射。

? ? ? ? 6. Map.Entry :描述在一個Map中的一個元素(鍵/值對)。是一個Map的內(nèi)部類。

? ? ? ? 7. SortedMap:繼承于 Map,使 Key 保持在升序排列。

? ? ? ? 8. Enumeration:這是一個傳統(tǒng)的接口和定義的方法,通過它可以枚舉(一次獲得一個)對象集合中的元素。這個傳統(tǒng)接口已被迭代器取代。

集合實現(xiàn)類(集合類):

? ? ? ? 1.AbstractCollection :實現(xiàn)了大部分的集合接口。

? ? ? ? 2.?AbstractList? :繼承于AbstractCollection 并且實現(xiàn)了大部分List接口。

? ? ? ? 3.?AbstractSequentialList :繼承于 AbstractList ,提供了對數(shù)據(jù)元素的鏈?zhǔn)皆L問而不是隨機訪問。

? ? ? ? 4. LinkedList:該類實現(xiàn)了List接口,允許有null(空)元素。主要用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu),該類沒有同步方法,如果多個線程同時訪問一個List,則必須自己實現(xiàn)訪問同步,解決方法就是在創(chuàng)建List時候構(gòu)造一個同步的List。例如:Listlist = Collections.synchronizedList(newLinkedList(...));? ? ? ?LinkedList 查找效率低。

? ? ? ? 5.?ArrayList:該類也是實現(xiàn)了List的接口,實現(xiàn)了可變大小的數(shù)組,隨機訪問和遍歷元素時,提供更好的性能。該類也是非同步的,在多線程的情況下不要使用。ArrayList 增長當(dāng)前長度的50%,插入刪除效率低。

? ? ? ? 6.AbstractSet :繼承于AbstractCollection 并且實現(xiàn)了大部分Set接口。

? ? ? ? 7.?HashSet:該類實現(xiàn)了Set接口,不允許出現(xiàn)重復(fù)元素,不保證集合中元素的順序,允許包含值為null的元素,但最多只能一個。

? ? ? ? 8.?LinkedHashSet:具有可預(yù)知迭代順序的?Set?接口的哈希表和鏈接列表實現(xiàn)。

? ? ? ? 9. TreeSet:該類實現(xiàn)了Set接口,可以實現(xiàn)排序等功能。

? ? ? ? 10.?AbstractMap :?實現(xiàn)了大部分的Map接口。

? ? ? ? 11.?HashMap :HashMap 是一個散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。該類實現(xiàn)了Map接口,根據(jù)鍵的HashCode值存儲數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為null,不支持線程同步。

? ??????12. TreeMap : 繼承了AbstractMap,并且使用一顆樹。

? ? ? ? 13.?WeakHashMap :繼承AbstractMap類,使用弱密鑰的哈希表。

? ? ? ? 14.?LinkedHashMap? :繼承于HashMap,使用元素的自然順序?qū)υ剡M行排序.

? ? ? ? 15.?IdentityHashMap :繼承AbstractMap類,比較文檔時使用引用相等。

通過java.util包中定義的類:

? ? ? ? 1.?Vector? :? ?該類和ArrayList非常相似,但是該類是同步的,可以用在多線程的情況,該類允許設(shè)置默認(rèn)的增長長度,默認(rèn)擴容方式為原來的2倍。

? ? ? ? 2. Stack : 棧是Vector的一個子類,它實現(xiàn)了一個標(biāo)準(zhǔn)的后進先出的棧。

? ? ? ? 3.?Dictionary : Dictionary 類是一個抽象類,用來存儲鍵/值對,作用和Map類相似。

? ? ? ? 4.?Hashtable : Hashtable 是 Dictionary(字典) 類的子類,位于 java.util 包中。

? ? ? ? 5.?Properties :Properties 繼承于 Hashtable,表示一個持久的屬性集,屬性列表中每個鍵及其對應(yīng)值都是一個字符串。

? ? ? ? 6.?BitSet : 一個Bitset類創(chuàng)建一種特殊類型的數(shù)組來保存位值。BitSet中數(shù)組大小會隨需要增加。

三 . 區(qū)別:

1 .ArrayList 和 Vector 的區(qū)別, HashMap 和 Hashtable 的區(qū)別

????????就ArrayList與Vector主要從二方面來說.

????????一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的

????????二.數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認(rèn)增長為原來一倍,而ArrayList卻是原來的一半

2. HashMap與HashTable主要從三方面來說。

????????一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現(xiàn)

????????二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的

????????三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

3. Set和List的區(qū)別

? ? ? ? 一. Set 接口實例存儲的是無序的,不重復(fù)的數(shù)據(jù)。List 接口實例存儲的是有序的,可以重復(fù)的元素。

? ? ? ? 二. Set檢索效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變?<實現(xiàn)類有HashSet,TreeSet>。

? ? ? ? 三. List和數(shù)組類似,可以動態(tài)增長,根據(jù)實際存儲的數(shù)據(jù)的長度自動增長List的長度。查找元素效率高,插入刪除效率低,因為會引起其他元素位置改變?<實現(xiàn)類有ArrayList,LinkedList,Vector>?。

四 . 遍歷ArrayList:

import java.util.*;

public class Test{ public static void main(String[] args) {? ?

?????List<String> list=new ArrayList<String>();

? ? list.add("Hello");

? ? list.add("World");

? ? list.add("HAHAHAHA");

? ? //第一種遍歷方法使用foreach遍歷List? ?

?????for (String str : list) {? ? ? ? ? ? //也可以改寫for(int i=0;i<list.size();i++)這種形式? ? ? ?

?????????????System.out.println(str);

? ? }

? ? //第二種遍歷,把鏈表變?yōu)閿?shù)組相關(guān)的內(nèi)容進行遍歷? ??

? ? String[] strArray=new String[list.size()];

? ? list.toArray(strArray);

? ? for(int i=0;i<strArray.length;i++) //這里也可以改寫為? foreach(String str:strArray)這種形式? ? {? ? ? ? ????????????System.out.println(strArray[i]);

? ? }? ?

? ? //第三種遍歷 使用迭代器進行相關(guān)遍歷? ?

? ? Iterator<String> ite=list.iterator();

? ? while(ite.hasNext())//判斷下一個元素之后有值? ? {? ? ? ??

?????????????System.out.println(ite.next());

? ? } }}

五. 遍歷Map:

import java.util.*;

public class Test{? ??

?????????public static void main(String[] args) {? ? ??

????????????????Map<String, String> map = new HashMap<String, String>();

? ? ? ? ? ? ? ? map.put("1", "value1");

? ? ? ? ? ? ? ? map.put("2", "value2");

? ? ? ? ? ? ? ? map.put("3", "value3");

? ? ? ? ? ? ?//第一種:普遍使用,二次取值? ? ??

? ? ? ? ? ? ? ? System.out.println("通過Map.keySet遍歷key和value:");

? ? ? ? ? ? ? ? for (String key : map.keySet()) {? ? ??

? ? ? ? ? ? ? ? ????????? System.out.println("key= "+ key + " and value= " + map.get(key));

? ? ? ? ? ? ? ? }? ? ?

? ? ? ? ? ? ? //第二種? ? ??

????????????????System.out.println("通過Map.entrySet使用iterator遍歷key和value:");

? ? ? ? ? ? ? ? Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();

? ? ? ? ? ? ? ? while (it.hasNext()) {? ? ??

? ? ? ? ? ? ? ? ? ? ? ? Map.Entry<String, String> entry = it.next();

? ? ? ? ? ? ? ? ? ? ? ? System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());

? ? ? ? ? ? ? ? ? }? ? ?

? ? ? ? ? ? ? //第三種:推薦,尤其是容量大時? ? ??

? ? ? ? ? ? ? ? ? System.out.println("通過Map.entrySet遍歷key和value");

? ? ? ? ? ? ? ? ? for (Map.Entry<String, String> entry : map.entrySet()) {? ? ??

? ? ? ? ? ? ? ? ????????? System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());

? ? ? ? ? ? ? ? ? ?}? ?

? ? ? ????????//第四種? ? ??

????????????????System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key");

? ? ? ? ? ? ? ? for (String v : map.values()) {? ? ??

?????????????????????????System.out.println("value= " + v);

? ? ? ? ? ? ? ? ? }? ? }}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容