公司文化墻圖片大全關鍵詞優(yōu)化排名軟件案例
目錄
1.Java容器概述
2.集合框架
3.Collection接口中的方法使用
4.iterator()
5.List接口
2.ArrayList、LinkedList、Vector相同點
3.不同點
1.ArrayList
2.LinkedList
3.Vector
4.Vector源碼分析
5.ArrayList源碼分析
6.LinkedList源碼分析
6.List中的常用方法
7.區(qū)分remove刪除的是元素還是索引
8.Set接口存在三個主要的實現類
1.HashSet
2.LinkedHashSet
3.TreeSet
4.如何理解Set的無序、不可重復特性(以HashSet為例)
5.set中添加元素的過程(以HashSet為例)
6.HashSet底層
7.要求
9.LinkedHashSet的使用
10.TreeSet()的使用
11.Map接口
1.HashMap
2.LinkedHashMap
3.TreeMap
4.Hashtable
5.Properties
12.Map的鍵與值
13.HashMap的底層實現原理
1.以jdk7說明
2.jdk8和jdk7的不同
3.HashMap的默認值
14.Map接口中常用的方法
15.遍歷Map的方法
16.TreeMap
17.Collections工具類
19.Collection和Collections的區(qū)別
1.Java容器概述
1.集合、數組都是對多個數據進行存儲的結構,簡稱java容器。
????????此時的存儲:主要是內存層面的存儲,不涉及到持久化(硬盤方面)的存儲
2.數組在存儲多個數據方面的特點:
????????一旦初始化后,長度就確定了,元素的類型也確定了;
3.數組存儲多個數據方面的缺點:
? ? ? 1.初始化后,其長度無法修改;
? ? ? 2.數組中提供的方法極其有限,對于增刪改查操作不方便,效率不高;
? ? ? 3.獲取數組中實際元素個數的需求,沒有現成的方法可用;
? ? ? ?4.數組存儲數據的特點:有序、可重復;對于無序、不可重復的需求,不能滿足。
2.集合框架
1.Collection接口:單列集合,存儲一個一個的對象;分為兩大類
????????List接口:存儲有序的、可重復的數據;主要實現類:ArrayList,LinkedList,Vector
????????Set接口:存儲無序的、不可重復的數據;主要實現類:HashSet,LinkedHashSet,TreeSet
2.Map接口:雙列集合,存儲一對(key-value)的數據
????????主要實現類:HashMap,LinkedHashMap,TreeMap,Hashtable,Properties
3.Collection接口中的方法使用
????????1.使用多態(tài)造實現類對象賦給Collection集合對象;
????????2.add(E e):將元素添加到集合中
????????3.size():獲取添加元素的個數
????????4.addAll(Collection coll):添加一個集合;
????????5.isEmpty():判斷當前集合是否為空
????????6.clear():清空集合元素
????????7.contains(O o):判斷當前集合中是否包含o
????????8.containsAll(Collection coll):判斷形參coll中所有元素是否都存在于當前集合中
????????9.remove(Object o):刪除obj數據
????????10.removeAll(Collection c):刪除c中包含的所有元素;獲取與c集合之間的差集
????????11.retainAll(Collection c):獲取與c集合之間的交集
????????12.equals(Object o):判斷兩個集合所有的元素是否相同,是返回true
????????13.hashCode():調用集合的哈希值
????????14.toArray():集合轉化為數組
????????15.將數組轉換為集合:Arrays.asList(String[])
????????注意:包裝類數組與基本數據類型數組的區(qū)別
????????若寫為一個基本數據類型的數組則為一個元素,而不是識別為數組;寫成包裝類就會識別為數組中的多個元素。
Iterator iterator = c.iterator();//hasNext():判斷是否還有下一個元素while (iterator.hasNext()) {//next():兩個作用:指針下移;返回下移以后的集合位置上的元素System.out.println(iterator.next());}
重要:add和contains方法調用的是obj對象所在類的equals()方法;若未重寫即為false;因此向Collection的接口實現類的對象中添加數據obj時,要求obj所在類要重寫equals()方法。
4.iterator()
返回Iterator接口的實例,用于遍歷集合元素;
????????1.使用hasNext()+next()方法。使用next()時指針下移,并將下移后對應的集合元素返回。
????????2.集合對象每次調用hasNext()都會得到一個全新的迭代器對象,默認游標都在集合第一個元素之上。
Iterator iterator = c.iterator();//hasNext():判斷是否還有下一個元素while (iterator.hasNext()) {//next():兩個作用:指針下移;返回下移以后的集合位置上的元素System.out.println(iterator.next());}
????????3.內部定義了remove()方法;刪除遍歷后集合中的元素,此方法不同于集合中調用的remove;
????????4.jdk5.0后使用foreach,用于遍歷集合、數組;也叫做增強for循環(huán)
ArrayList a = new ArrayList();
//增強for循環(huán)
for(Object obj : a){System.out.println(obj);
}//for遍歷
for (int i = 0; i < a.size(); i++) {System.out.println(a.get(i));
}//iterator迭代器
Iterator iterator = a.iterator();
while(iterator.hasNext()){System.out.println(iterator.next());
}
5.List接口
看作是數組的替換,動態(tài)數組
1.存儲有序的、可重復的數據;有三個實現類ArrayList、LinkedList、Vector
2.ArrayList、LinkedList、Vector相同點
?????????三個類都實現了List接口;存儲數據都有序可重復。
3.不同點
1.ArrayList
????????作為List接口的主要實現類;線程不安全,執(zhí)行效率比較高;底層使用object[ ]存儲。適合查找元素,復雜度較低;不適合插入、刪除操作。
2.LinkedList
????????對于頻繁的插入、刪除操作,使用此類效率比ArrayList高,底層使用雙向鏈表存儲;不適合查找元素,復雜度較高。
3.Vector
????????作為List接口中的古老實現類,線程安全,效率比較低;底層使用object[ ]存儲。
4.Vector源碼分析
? ? ? ? jdk7和idk8中都是通過Vector()構造器創(chuàng)建對象,底層都創(chuàng)建了長度為10的數組;
????????在數組容量不夠需要擴容方面,默認擴容為原來的數組長度的2倍。
//源碼public Vector() {this(10);}
5.ArrayList源碼分析
1.jdk 7情況下
ArrayList List = new ArrayList();//源碼
private static final int DEFAULT_CAPACITY = 10;
????????此時:底層創(chuàng)建了長度是10的object[ ]數組elementData
List.add(123);//elementDatale[0] = new Integer(123);
????????此時:elementDatale[0] = new Integer(123);
????????若:List.add()添加到第十一次:
List.add(11);
????????此時:若此次的添加導致底層eLlementData數組容量不夠,則擴容。默認情況下,擴容為原來的容量的1.5倍,同時需要將原有數組中的數據復制到新的數組中
結論:建議開發(fā)中使用帶參的構造器:
ArrayList list = new ArrayList(int capacity)
2.jdk 8中ArrayList的變化:
ArrayList List = new ArrayList();
?
//源碼transient Object[] elementData;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
????????此時:底層創(chuàng)建了bject[ ]數組,而elementData初始化為{},說明此時的elementData并沒有創(chuàng)建
若調用
List.add(123);//elementDatale[0] = new Integer(123);
//源碼public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;}private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}private static final int DEFAULT_CAPACITY = 10;
????????此時:第一次調用add(),add()調用底層ensureCapacityInternal()方法,底層傳入的最小數組容量為:calculateCapacity(elementData, minCapacity),calculateCapacity()方法返回的是DEFAULT_CAPACITY = 10(沒有擴容的情況下);之后將并將數據123添加到elementData
后續(xù)的添加和擴容操作與idk 7 一樣。
2.3小結:
????????jdk7中的ArrayList的對象的創(chuàng)建類似于單例模式中的餓漢式,而idk8中的ArrayList的對象的創(chuàng)建類似于單例的懶漢式,延遲了數組的創(chuàng)建,節(jié)省內存。
6.LinkedList源碼分析
LinkedList list = new LinkedList();
????????此時:內部聲明了Node類型的first和last性,默認值為null
transient Node<E> first;//null
transient Node<E> last;//null
????????向list中封裝數據:?
List.add(123);
????????此時:直到往list中封裝數據后,開始創(chuàng)建Node對象,將123封裝到Node中。
其中,Node定義為:
private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}
LinkedList 對數據的封裝,就是說把數據封裝成Node 對象;當往list封裝數據后,創(chuàng)建Node對象,并根據此時的具體情況創(chuàng)建prev和next屬性;
????????prev屬性表示previous-上一個:若此時的元素不是第一個元素,則指向上一個節(jié)點
? ? ? ? next屬性表示下一個:指向下一個節(jié)點
????????item屬性:保存了當前節(jié)點的值
這幾個屬性體現了LinkedList的雙向鏈表的說法
6.List中的常用方法
加入了調用索引的方法
????????1.add(int index,Object o);在index插入o
????????2.addAll():在index加入一個集合中的所有元素
????????3.get():獲取索引處元素
????????4.indexOf(Object o):返回o在集合中首次出現位置(若找不到就返回-1)
????????5.lastIndexOf(Object o):返回o在集合中末次出現位置(不存在就返回-1)
????????6.remove(int index):刪除指定索引處元素
????????7.set(inded,o):設置指定索引位置元素
????????8.subList(from,toIndex):返回指定位置集合
7.區(qū)分remove刪除的是元素還是索引
????????在List方法中提供了重載的remove刪除該索引處元素;
????????而Collection中刪除的是該元素(若Collection無序就不存在索引)
8.Set接口存在三個主要的實現類
set接口中沒有額外定義新的方法,使用的都是Collection中聲明過的方法。
1.HashSet
????????set接口的主要實現類;是線程不安全的;可以存儲null值;
2.LinkedHashSet
????????作為HashSet的子類,遍歷內部數據時,可以按照添加的順序遍歷
3.TreeSet
????????可以按照添加的對象指定屬性,進行排序。
4.如何理解Set的無序、不可重復特性(以HashSet為例)
?????? 無序性:不等于隨機性;存儲的數據在底層數組中并非按照數組索引的順序添加,而是根據數據的哈希值決定.添加時是無序的
????? 不可重復性:保證添加的元素按照equals()判斷時,不能返回true;即相同的元素只能添加一個。
5.set中添加元素的過程(以HashSet為例)
????????向HashSet中添加元素a,首先調用a所在類的hashCode方法,計算a的哈希值,此哈希值接著通過某種算法計算出a在HashSet底層數組中的存放位置(即索引位置),判斷數組位置上是否已經有元素,如果此位置沒有其他元素,則a添加成功;若此位置有其他元素b(或以鏈表形式存在的多個元素),則比較a與b的hash值,若哈希值不同,則a添加成功,若哈希值相同,則調用a所在類的equals()方法,若equals返回true,則a添加失敗,若返回false,則a添加成功。
6.HashSet底層
????????數組+鏈表形式。
7.要求
????????向Set中添加的數據,其所在的類一定要重寫hashCode()和equals();重寫的hashCode()和equals()盡可能保持一致性:相等的對象必須具有相等的散列碼(即哈希值)
9.LinkedHashSet的使用
????????1.LinkedHashSet的使用作為HashSet的子類,在添加數據的同時,每個數據還維護了兩個引用,記錄此數據前一個數據和后一個數據。
????????2.優(yōu)點:對于頻繁的遍歷操作,效率高于HashSet()
10.TreeSet()的使用
????????1.向TreeSet中添加的數據,要求是相同類的對象,不能添加不同類的對象。
????????2.兩種排序方式:自然排序(實現Comparable接口)、定制排序(comparator)
????????3.自然排序中,比較兩個對象是否相同的標準為compareTo()方法返回0;不再是equals()方法
????????4.定制排序中,比較兩個對象是否相同的標準是compare()返回0,不再是equals()方法
//Comparable 自然排序
public class Person implements Comparable {@Overridepublic int compareTo(Object o) {if (o instanceof Person){Person oo = (Person)o;return this.age - (oo.getAge());}else {throw new RuntimeException("輸入的類型不一致");}}
}//comparator:定制排序Set set3 = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof Person && o2 instanceof Person){Person oo1 = (Person)o1;Person oo2 = (Person)o2;return oo1.getName().compareTo(oo2.getName());}else{throw new RuntimeException("輸入的類型不一致。");}}});
11.Map接口
1.HashMap
????????Map的主要實現類;線程不安全的,效率高;可以存儲null的key和value。
????????底層:jdk7之前:數組+鏈表
? ? ? ? ? ? ? ? ???jdk8:數組+鏈表+紅黑樹
2.LinkedHashMap
????????保證在遍歷map元素時,可以按照添加的順序實現遍歷。
????????原因:在原有的HashMap底層結構基礎上,添加了一對指針,指向前一個和后一個元素。
? ? ? ? ? ? ? ? ? ?對于頻繁的遍歷操作,效率高于HashMap
3.TreeMap
????????可以按照添加的key- value進行排序,實現排序遍歷。此時考慮key的自然排序或定制排序。底層使用紅黑樹。
4.Hashtable
????????作為古老的實現類;線程安全的,效率低;不能存儲null的key和value
5.Properties
????????常用來處理配置文件。key和value都是String類型。
12.Map的鍵與值
????????1.Map當中的key是無序的不可重復的,是使用Set存儲的;values也是無序的,但是可以重復,使用Collection存儲;而實際上使用put(key,value)時向Map中存儲的是一個Entry對象,該對象有兩個屬性,一個是key,另一個是value,且Entry也是使用Set存儲的,無序不可重復。
????????2.以HashMap為例,key所在的類必須重寫equals()和hashCode()方法;values所在的類要重寫equals()方法。
????????3.hashCode方法主要是存的時候效率高一點,在查找值時方便一點。
13.HashMap的底層實現原理
1.以jdk7說明
HashMap被實例化后,底層創(chuàng)建長度為16的一維數組Entry[ ] table。
????????調用put(key1,value1)后,會先調用key1所在類的hashCode()方法計算key1的哈希值,此哈希值經過計算后得到Entry數組在底層的存放位置:
????????????????若此位置為空,則key1-value1添加成功
? ? ? ? ? ? ? ? 若此位置不為空,則比較key1和該位置元素(假設為key2-value2)的哈希值:
? ? ? ? ? ? ? ? ? ? ? ? 若key1的哈希值和該元素key2哈希值都不相同,則key1-value1添加成功
? ? ? ? ? ? ? ? ? ? ? ? 若key1的哈希值和該元素key2哈希值相同,則比較key1所在類的equals(key2)方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 若equals()返回false,則key1-value1添加成功
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 若equals返回true,則value1將value2進行替換
2.jdk8和jdk7的不同
? ? ? ? 1.new HashMap()后不會創(chuàng)建長度為16的數組Entry[ ] table
? ? ? ? 2.jdk8 底層使用Node[ ],而不是Entry[ ]?
? ? ? ? 3.調用put方法時,底層創(chuàng)建長度為16的數組
? ? ? ? 4.jdk7底層結構為數組+鏈表;
? ? ? ? ? ?jdk8中的底層結構為數組+鏈表+紅黑樹;當數組的某一個索引位置元素以鏈表形式存在的數據個數大于8且當前數組長度大于64,則將該索引位置上的所有數據改為使用紅黑樹存儲。
? ? ? ?
3.HashMap的默認值
HashMap的默認容量:16
HashMap的加載因子:0.75
擴容的臨界值:容量*加載因子:16*0.75=12
鏈表形式存在的數據大于8:轉化為紅黑樹
Node被樹化時最小的hash表容量:64
14.Map接口中常用的方法
????????1.put():添加key- value的Node對象
????????2.putAll(Map m):將m中所有Node添加
????????3.remove(key):刪除指定key的鍵值對
????????4.clear():清空當前map
????????5.get(key):獲取key的value
????????6.containsKey(key):是否包含kry
????????7.contains Value()
????????8.size():Node個數
????????9.isEmpty()
????????10.equals():兩個Map是否相同
15.遍歷Map的方法
????????1.遍歷所有的key:keySet()
????????2.遍歷所有的value:values()
????????3.遍歷所有的key-value():entrySet()
代碼示例:
@Testpublic void test(){//1.遍歷keyMap map = new HashMap();map.put("Tom",12);map.put("Jerry",45);map.put("Mary","AA");System.out.println(map);Set set = map.keySet();Iterator iterator = set.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}//2.遍歷valueCollection c = map.values();System.out.println(c);for (Object o : c){System.out.println(o);}System.out.println("-------------------------------");//3.遍歷NodeSet s1 = map.entrySet();Iterator iterator1 = s1.iterator();while(iterator1.hasNext()){Object obj = iterator1.next();Map.Entry entry = (Map.Entry)obj;System.out.println(entry.getKey() + " === " + entry.getValue());}}
16.TreeMap
????????1.向TreeMap中添加key-value,要求key必須由同一個類創(chuàng)建的對象
????????2.因為要按照key進行排序:自然排序、定制排序
17.Collections工具類
操作Collection和Map的工具類
????????1.Collections類中提供了synchronizeXxx():該方法可以使指定集合包裝成線程同步的集合,從而可以解決多線程并發(fā)訪問集合時的線程安全問題。
????????2.reverse(List):反轉list中元素順序
????????3.shuffle():對集合元素隨機排序
????????4.sort():根據自然順序對指定list元素升序
????????5.swap():將制定list中的i元素交換為j元素
????????6.frequency():返回指定集合元素出現次數
????????7.copy(i,j):將j復制到i
19.Collection和Collections的區(qū)別
????????Collection是單列集合的接口,子接口有List和Set;
????????Collections是操作Collection和Map的工具類。