慕課視頻(java入門(mén)資料):https://www.imooc.com/learn/110各聘、菜鳥(niǎo)教程
一. java數(shù)據(jù)結(jié)構(gòu):
? ??????枚舉(Enumeration)、位集合(BitSet)、向量(Vector)、棧(Stack)、字典(Dictionary)挎扰、哈希表(Hashtable)、屬性(Properties)
? ??????Java Enumeration接口:
? ? ? ? ? ? ? ? 1.Enumeration接口中定義了一些方法巢音,通過(guò)這些方法可以枚舉(一次獲得一個(gè))對(duì)象集合中的元素遵倦。
? ? ? ? ? ? ? ? 2.正漸漸被迭代器取代。
? ??????????????boolean hasMoreElements( )? ? ? ? ??測(cè)試此枚舉是否包含更多的元素官撼。
? ??????????????Object nextElement( )? ? ? ? ? ??如果此枚舉對(duì)象至少還有一個(gè)可提供的元素梧躺,則返回此枚舉的下一個(gè)元素。
????????Java Bitset類(lèi)?:
? ? ? ? ? ? ? ? 1.位集合類(lèi)實(shí)現(xiàn)了一組可以單獨(dú)設(shè)置和清除的位或標(biāo)志歧寺。一個(gè)Bitset類(lèi)創(chuàng)建一種特殊類(lèi)型的數(shù)組來(lái)保存位值燥狰。
? ? ? ? ? ? ? ? 2.BitSet中數(shù)組大小會(huì)隨需要增加棘脐。這和位向量(vector of bits)比較類(lèi)似斜筐。? ? ? ?
? ? ? ? ? ? ? ? 3.BitSet定義了兩個(gè)構(gòu)造方法:第一個(gè)構(gòu)造方法創(chuàng)建一個(gè)默認(rèn)的對(duì)象:BitSet()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第二個(gè)方法允許用戶(hù)指定初始大小。所有位初始化為0蛀缝。BitSet(int size)
????????Java Vector 類(lèi)
? ? ? ? ? ? ? ? 1.向量(Vector)類(lèi)和傳統(tǒng)數(shù)組非常相似顷链,但是Vector的大小能根據(jù)需要?jiǎng)討B(tài)的變化。和 ArrayList 很相似屈梁,但是兩者是不同的:Vector 是同步訪(fǎng)問(wèn)的嗤练。Vector 包含了許多傳統(tǒng)的方法榛了,這些方法不屬于集合框架。
? ? ? ? ? ? ? ? 2.和數(shù)組一樣煞抬,Vector對(duì)象的元素也能通過(guò)索引訪(fǎng)問(wèn)霜大。
? ? ? ? ? ? ? ? 3.使用Vector類(lèi)最主要的好處就是在創(chuàng)建對(duì)象的時(shí)候不必給對(duì)象指定大小,它的大小會(huì)根據(jù)需要?jiǎng)討B(tài)的變化革答。
? ? ? ? ? ? ? ? 4.Vector 類(lèi)支持 4 種構(gòu)造方法战坤。
? ? ? ? ? ? ? ? ? ? 第一種構(gòu)造方法創(chuàng)建一個(gè)默認(rèn)的向量,默認(rèn)大小為 10:? ? ? ?Vector()
? ? ? ? ? ? ? ? ? ? 第二種構(gòu)造方法創(chuàng)建指定大小的向量残拐。? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Vector(int size)
? ? ? ? ? ? ? ? ? ? 第三種構(gòu)造方法創(chuàng)建指定大小的向量途茫,并且增量用 incr 指定。增量表示向量每次增加的元素?cái)?shù)目溪食。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Vector(int size,int incr)
? ? ? ? ? ? ? ? ? ? 第四種構(gòu)造方法創(chuàng)建一個(gè)包含集合 c 元素的向量:? ? ? ? Vector(Collection c)
? ??????Java Stack 類(lèi):
? ? ? ? ? ? ? ? 1.棧(Stack)實(shí)現(xiàn)了一個(gè)后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu)囊卜。棧是Vector的一個(gè)子類(lèi)
? ??????Java Dictionary 類(lèi):
? ? ? ? ? ? ? ? 1.字典(Dictionary) 類(lèi)是一個(gè)抽象類(lèi),它定義了鍵映射到值的數(shù)據(jù)結(jié)構(gòu)错沃。作用和Map類(lèi)相似栅组。
? ??????Java Hashtable 類(lèi):
? ? ? ? ? ? ? ? 1.Hashtable類(lèi)提供了一種在用戶(hù)定義鍵結(jié)構(gòu)的基礎(chǔ)上來(lái)組織數(shù)據(jù)的手段。
? ? ? ? ? ? ? ? 2.Hashtable是原始的java.util的一部分枢析, 是一個(gè)Dictionary具體的實(shí)現(xiàn) 笑窜。
? ? ? ? ? ? ? ? 3.Hashtable現(xiàn)在集成到了集合框架中。它和HashMap類(lèi)很相似登疗,但是它支持同步排截。
? ? ? ? ? ? ? ? 4.Hashtable定義了四個(gè)構(gòu)造方法。
? ? ? ? ? ? ? ? ????????第一個(gè)是默認(rèn)構(gòu)造方法:? ? ? ? ? ? ? ? Hashtable()
????????????????????????第二個(gè)構(gòu)造函數(shù)創(chuàng)建指定大小的哈希表:? ? ? ? ? ? ?Hashtable(int size)
????????????????????????第三個(gè)構(gòu)造方法創(chuàng)建了一個(gè)指定大小的哈希表辐益,并且通過(guò)fillRatio指定填充比例断傲。填充比例必須介于0.0和1.0之間,它決定了哈希表在重新調(diào)整大小之前的充滿(mǎn)程度:? ? ? ? ? ? Hashtable(int size,float fillRatio)
????????????????????????第四個(gè)構(gòu)造方法創(chuàng)建了一個(gè)以M中元素為初始化元素的哈希表智政。哈希表的容量被設(shè)置為M的兩倍认罩。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Hashtable(Map m)
? ??????Java Properties 類(lèi):
? ? ? ? ? ? ? ? 1.Properties 繼承于 Hashtable.Properties 類(lèi)表示了一個(gè)持久的屬性集.屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串。
? ? ? ? ? ? ? ? 2.Properties 類(lèi)被許多Java類(lèi)使用续捂。例如垦垂,在獲取環(huán)境變量時(shí)它就作為System.getProperties()方法的返回值。
? ? ? ? ? ? ? ? 3.Properties 定義如下實(shí)例變量.這個(gè)變量持有一個(gè)Properties對(duì)象相關(guān)的默認(rèn)屬性列表牙瓢。 Properties defaults;
? ? ? ? ? ? ? ? 4.Properties類(lèi)定義了兩個(gè)構(gòu)造方法. 第一個(gè)構(gòu)造方法沒(méi)有默認(rèn)值劫拗。? ? ? ? ? ? ?Properties()
? ? ? ? ? ? ? ? 5.第二個(gè)構(gòu)造方法使用propDefault 作為默認(rèn)值。兩種情況下矾克,屬性列表都為空:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Properties(Properties propDefault)
二. java集合框架:
? ? ? ? Java 集合框架主要包括兩種類(lèi)型的容器页慷,一種是集合(Collection),存儲(chǔ)一個(gè)元素集合,另一種是圖(Map)酒繁,存儲(chǔ)鍵/值對(duì)映射滓彰。Collection 接口又有 3 種子類(lèi)型,List州袒、Set 和 Queue揭绑,再下面是一些抽象類(lèi),最后是具體實(shí)現(xiàn)類(lèi)郎哭,常用的有 ArrayList洗做、LinkedList、HashSet彰居、LinkedHashSet诚纸、HashMap、LinkedHashMap 等等陈惰。
? ??????接口:是代表集合的抽象數(shù)據(jù)類(lèi)型畦徘。例如 Collection、List抬闯、Set井辆、Map 等。之所以定義多個(gè)接口溶握,是為了以不同的方式操作集合對(duì)象
? ??????實(shí)現(xiàn)(類(lèi)):是集合接口的具體實(shí)現(xiàn)杯缺。從本質(zhì)上講,它們是可重復(fù)使用的數(shù)據(jù)結(jié)構(gòu)睡榆,例如:ArrayList萍肆、LinkedList、HashSet胀屿、HashMap塘揣。
? ??????算法:是實(shí)現(xiàn)集合接口的對(duì)象里的方法執(zhí)行的一些有用的計(jì)算,例如:搜索和排序宿崭。這些算法被稱(chēng)為多態(tài)亲铡,那是因?yàn)橄嗤姆椒梢栽谙嗨频慕涌谏嫌兄煌膶?shí)現(xiàn)。
集合接口:
? ? ? ? 1. Collection 接口:Collection 是最基本的集合接口葡兑,一個(gè) Collection 代表一組 Object奖蔓,即 Collection 的元素, Java不提供直接繼承自Collection的類(lèi),只提供繼承于的子接口(如List和set)讹堤。Collection 接口存儲(chǔ)一組不唯一吆鹤,無(wú)序的對(duì)象。
? ? ? ? 2. List 接口:List接口是一個(gè)有序的 Collection蜕劝,使用此接口能夠精確的控制每個(gè)元素插入的位置檀头,能夠通過(guò)索引(元素在List中位置,類(lèi)似于數(shù)組的下標(biāo))來(lái)訪(fǎng)問(wèn)List中的元素岖沛,第一個(gè)元素的索引為 0暑始,而且允許有相同的元素。List 接口存儲(chǔ)一組不唯一婴削,有序(插入順序)的對(duì)象廊镜。
? ? ? ? 3. Set:Set 具有與 Collection 完全一樣的接口,只是行為上不同唉俗,Set 不保存重復(fù)的元素嗤朴。Set 接口存儲(chǔ)一組唯一,無(wú)序的對(duì)象虫溜。
? ? ? ? 4. SortedSet :繼承于Set保存有序的集合。
? ? ? ? 5. Map: 接口存儲(chǔ)一組鍵值對(duì)象,提供key(鍵)到value(值)的映射幢炸。
? ? ? ? 6. Map.Entry :描述在一個(gè)Map中的一個(gè)元素(鍵/值對(duì))盹憎。是一個(gè)Map的內(nèi)部類(lèi)。
? ? ? ? 7. SortedMap:繼承于 Map瘾境,使 Key 保持在升序排列歧杏。
? ? ? ? 8. Enumeration:這是一個(gè)傳統(tǒng)的接口和定義的方法,通過(guò)它可以枚舉(一次獲得一個(gè))對(duì)象集合中的元素迷守。這個(gè)傳統(tǒng)接口已被迭代器取代犬绒。
集合實(shí)現(xiàn)類(lèi)(集合類(lèi)):
? ? ? ? 1.AbstractCollection :實(shí)現(xiàn)了大部分的集合接口。
? ? ? ? 2.?AbstractList? :繼承于A(yíng)bstractCollection 并且實(shí)現(xiàn)了大部分List接口兑凿。
? ? ? ? 3.?AbstractSequentialList :繼承于 AbstractList 凯力,提供了對(duì)數(shù)據(jù)元素的鏈?zhǔn)皆L(fǎng)問(wèn)而不是隨機(jī)訪(fǎng)問(wèn)。
? ? ? ? 4. LinkedList:該類(lèi)實(shí)現(xiàn)了List接口礼华,允許有null(空)元素沮协。主要用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu),該類(lèi)沒(méi)有同步方法卓嫂,如果多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)一個(gè)List慷暂,則必須自己實(shí)現(xiàn)訪(fǎng)問(wèn)同步,解決方法就是在創(chuàng)建List時(shí)候構(gòu)造一個(gè)同步的List晨雳。例如:Listlist = Collections.synchronizedList(newLinkedList(...));? ? ? ?LinkedList 查找效率低行瑞。
? ? ? ? 5.?ArrayList:該類(lèi)也是實(shí)現(xiàn)了List的接口,實(shí)現(xiàn)了可變大小的數(shù)組餐禁,隨機(jī)訪(fǎng)問(wèn)和遍歷元素時(shí)血久,提供更好的性能。該類(lèi)也是非同步的,在多線(xiàn)程的情況下不要使用帮非。ArrayList 增長(zhǎng)當(dāng)前長(zhǎng)度的50%氧吐,插入刪除效率低讹蘑。
? ? ? ? 6.AbstractSet :繼承于A(yíng)bstractCollection 并且實(shí)現(xiàn)了大部分Set接口。
? ? ? ? 7.?HashSet:該類(lèi)實(shí)現(xiàn)了Set接口筑舅,不允許出現(xiàn)重復(fù)元素座慰,不保證集合中元素的順序,允許包含值為null的元素翠拣,但最多只能一個(gè)版仔。
? ? ? ? 8.?LinkedHashSet:具有可預(yù)知迭代順序的?Set?接口的哈希表和鏈接列表實(shí)現(xiàn)。
? ? ? ? 9. TreeSet:該類(lèi)實(shí)現(xiàn)了Set接口误墓,可以實(shí)現(xiàn)排序等功能蛮粮。
? ? ? ? 10.?AbstractMap :?實(shí)現(xiàn)了大部分的Map接口。
? ? ? ? 11.?HashMap :HashMap 是一個(gè)散列表谜慌,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射然想。該類(lèi)實(shí)現(xiàn)了Map接口,根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù)欣范,具有很快的訪(fǎng)問(wèn)速度又沾,最多允許一條記錄的鍵為null,不支持線(xiàn)程同步熙卡。
? ??????12. TreeMap : 繼承了AbstractMap杖刷,并且使用一顆樹(shù)。
? ? ? ? 13.?WeakHashMap :繼承AbstractMap類(lèi)驳癌,使用弱密鑰的哈希表滑燃。
? ? ? ? 14.?LinkedHashMap? :繼承于HashMap,使用元素的自然順序?qū)υ剡M(jìn)行排序.
? ? ? ? 15.?IdentityHashMap :繼承AbstractMap類(lèi)颓鲜,比較文檔時(shí)使用引用相等表窘。
通過(guò)java.util包中定義的類(lèi):
? ? ? ? 1.?Vector? :? ?該類(lèi)和ArrayList非常相似,但是該類(lèi)是同步的甜滨,可以用在多線(xiàn)程的情況乐严,該類(lèi)允許設(shè)置默認(rèn)的增長(zhǎng)長(zhǎng)度,默認(rèn)擴(kuò)容方式為原來(lái)的2倍衣摩。
? ? ? ? 2. Stack : 棧是Vector的一個(gè)子類(lèi)昂验,它實(shí)現(xiàn)了一個(gè)標(biāo)準(zhǔn)的后進(jìn)先出的棧。
? ? ? ? 3.?Dictionary : Dictionary 類(lèi)是一個(gè)抽象類(lèi)艾扮,用來(lái)存儲(chǔ)鍵/值對(duì)既琴,作用和Map類(lèi)相似。
? ? ? ? 4.?Hashtable : Hashtable 是 Dictionary(字典) 類(lèi)的子類(lèi)泡嘴,位于 java.util 包中甫恩。
? ? ? ? 5.?Properties :Properties 繼承于 Hashtable,表示一個(gè)持久的屬性集酌予,屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串磺箕。
? ? ? ? 6.?BitSet : 一個(gè)Bitset類(lèi)創(chuàng)建一種特殊類(lèi)型的數(shù)組來(lái)保存位值奖慌。BitSet中數(shù)組大小會(huì)隨需要增加。
三 . 區(qū)別:
1 .ArrayList 和 Vector 的區(qū)別, HashMap 和 Hashtable 的區(qū)別
????????就ArrayList與Vector主要從二方面來(lái)說(shuō).
????????一.同步性:Vector是線(xiàn)程安全的松靡,也就是說(shuō)是同步的简僧,而ArrayList是線(xiàn)程序不安全的,不是同步的
????????二.數(shù)據(jù)增長(zhǎng):當(dāng)需要增長(zhǎng)時(shí),Vector默認(rèn)增長(zhǎng)為原來(lái)一倍击困,而ArrayList卻是原來(lái)的一半
2. HashMap與HashTable主要從三方面來(lái)說(shuō)涎劈。
????????一.歷史原因:Hashtable是基于陳舊的Dictionary類(lèi)的广凸,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)
????????二.同步性:Hashtable是線(xiàn)程安全的阅茶,也就是說(shuō)是同步的,而HashMap是線(xiàn)程序不安全的谅海,不是同步的
????????三.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value
3. Set和List的區(qū)別
? ? ? ? 一. Set 接口實(shí)例存儲(chǔ)的是無(wú)序的脸哀,不重復(fù)的數(shù)據(jù)。List 接口實(shí)例存儲(chǔ)的是有序的扭吁,可以重復(fù)的元素撞蜂。
? ? ? ? 二. Set檢索效率低下,刪除和插入效率高侥袜,插入和刪除不會(huì)引起元素位置改變?<實(shí)現(xiàn)類(lèi)有HashSet,TreeSet>蝌诡。
? ? ? ? 三. List和數(shù)組類(lèi)似,可以動(dòng)態(tài)增長(zhǎng)枫吧,根據(jù)實(shí)際存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度自動(dòng)增長(zhǎng)List的長(zhǎng)度浦旱。查找元素效率高,插入刪除效率低九杂,因?yàn)闀?huì)引起其他元素位置改變?<實(shí)現(xiàn)類(lèi)有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) {? ? ? ? ? ? //也可以改寫(xiě)for(int i=0;i<list.size();i++)這種形式? ? ? ?
?????????????System.out.println(str);
? ? }
? ? //第二種遍歷,把鏈表變?yōu)閿?shù)組相關(guān)的內(nèi)容進(jìn)行遍歷? ??
? ? String[] strArray=new String[list.size()];
? ? list.toArray(strArray);
? ? for(int i=0;i<strArray.length;i++) //這里也可以改寫(xiě)為? foreach(String str:strArray)這種形式? ? {? ? ? ? ????????????System.out.println(strArray[i]);
? ? }? ?
? ? //第三種遍歷 使用迭代器進(jìn)行相關(guān)遍歷? ?
? ? Iterator<String> ite=list.iterator();
? ? while(ite.hasNext())//判斷下一個(gè)元素之后有值? ? {? ? ? ??
?????????????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("通過(guò)Map.keySet遍歷key和value:");
? ? ? ? ? ? ? ? for (String key : map.keySet()) {? ? ??
? ? ? ? ? ? ? ? ????????? System.out.println("key= "+ key + " and value= " + map.get(key));
? ? ? ? ? ? ? ? }? ? ?
? ? ? ? ? ? ? //第二種? ? ??
????????????????System.out.println("通過(guò)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());
? ? ? ? ? ? ? ? ? }? ? ?
? ? ? ? ? ? ? //第三種:推薦甥捺,尤其是容量大時(shí)? ? ??
? ? ? ? ? ? ? ? ? System.out.println("通過(guò)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("通過(guò)Map.values()遍歷所有的value,但不能遍歷key");
? ? ? ? ? ? ? ? for (String v : map.values()) {? ? ??
?????????????????????????System.out.println("value= " + v);
? ? ? ? ? ? ? ? ? }? ? }}