ArrayList、LinkedList、Vector區(qū)別
- ArrayList 是一個(gè)可改變大小的數(shù)組,其大小將會(huì)動(dòng)態(tài)地增長(zhǎng)。
- LinkedList 是一個(gè)雙鏈表,在添加和刪除元素時(shí)具有比ArrayList更好的性能.但在get與set方面弱于ArrayList,這些對(duì)比都是指數(shù)據(jù)量很大或者操作很頻繁的情況下的對(duì)比,如果數(shù)據(jù)和運(yùn)算量很小,那么對(duì)比將失去意義。
LinkedList 還實(shí)現(xiàn)了 Queue 接口,該接口比List提供了更多的方法,包括 offer(),peek(),poll()等。 - Vector 和ArrayList類似,但屬于強(qiáng)同步類,開(kāi)銷(xiāo)會(huì)比較大。Vector和ArrayList在更多元素添加進(jìn)來(lái)時(shí)會(huì)請(qǐng)求更大的空間。Vector每次請(qǐng)求其大小的雙倍空間,而ArrayList每次對(duì)size增長(zhǎng)50%.
Queue隊(duì)列
其接口定義為:
public interface Queue<E> extends Collection<E> {
//獲取但不移除隊(duì)列頭,
E element();
//添加元素到隊(duì)尾
boolean offer(E o);
//獲取但不移除隊(duì)列頭的元素
E peek();
//移除對(duì)頭元素
E poll();
//移除對(duì)頭元素
E remove();
}
- Queue主要特征在于FIFO,的實(shí)現(xiàn)一般并不容許插入null,只有LinkedList是一個(gè)例外,它容許插入null。
- 當(dāng)Queue的元素已經(jīng)到達(dá)限制數(shù)目時(shí),add會(huì)拋出 IllegalStateException異常,offer會(huì)返回false。
- 當(dāng)Queue為空時(shí),remove拋出NoSuchElementException異常,而poll返回null。
- element和peek返回但不刪除Queue中的頭元素,它們的區(qū)別類似remove與poll。
BlockingQueue與CountDownLatch
- BlockingQueue接口定義了一種阻塞的FIFO queue,每一個(gè)BlockingQueue都有一個(gè)容量:
當(dāng)容量滿時(shí),往BlockingQueue中添加數(shù)據(jù)時(shí)會(huì)造成阻塞。
當(dāng)容量為空時(shí),取元素操作會(huì)阻塞。
其兩個(gè)常用子類是ArrayBlockingQueue和LinkedBlockingQueue。
- CountDownLatch是一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。主要方法:
public CountDownLatch(count);
public void countDown();
public void await() ;
構(gòu)造方法指定了計(jì)數(shù)的次數(shù)。countDown方法,當(dāng)前線程調(diào)用此方法則計(jì)數(shù)減一。await方法,調(diào)用該方法會(huì)一直阻塞當(dāng)前線程,直到計(jì)時(shí)器的值為0。
Map
常用的Map
- Hashtable:底層是哈希表數(shù)據(jù)結(jié)構(gòu),不可以存入null健null值,該集合是線程同步的 。
- TreeMap: 底層是二叉樹(shù)數(shù)據(jù)結(jié)構(gòu),可以用于給map集合中的健進(jìn)行排序 該集合線程不同步。
- HashMap底層是哈希表數(shù)據(jù)結(jié)構(gòu),允許使用null健null值,該集合是不同步.當(dāng)添加元素,如果出現(xiàn)添加相同的健時(shí),后添加的值會(huì)覆蓋原有健對(duì)應(yīng)的值。
ConcurrentHashMap
- 是線程安全并且高效的HashMap,在并發(fā)編程中經(jīng)??梢?jiàn)它的使用.
- Hashtable線程安全,但是效率低下
Map的遍歷方法之一
HashMap<String,String> source = new HashMap<>();
for (Map.Entry<String,String> entry: source.entrySet()){
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
Map的遍歷方法之二
Collection<String> values =source.values();
for (Iterator<String> it = values.iterator(); it.hasNext();) {
String s = it.next();
System.out.println(s);
}
Map的遍歷方法之三
//需要Java8以上的版本
source.forEach((k,v)->System.out.println( k + " : " + v));
Collections、Collection與Arrays
- Collection是一個(gè)集合接口,是List、Set、Queue接口。
- Collections包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法,此類不能實(shí)例化,就像一個(gè)工具類。如Collections的排序方法sort。
ArrayList<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(5);
list.add(3);
list.add(2);
//默認(rèn)升序,輸出1 2 2 3 5
Collections.sort(list);
//降序,輸出5 3 2 2 1
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
- Arrays類能方便地操作數(shù)組,它提供的所有方法都是靜態(tài)的,主要方法:
給數(shù)組賦值:通過(guò)fill方法。
對(duì)數(shù)組排序:通過(guò)sort方法,按升序,有些重載方法可以傳入Comparator接口。
比較數(shù)組:通過(guò)equals方法比較數(shù)組中元素值是否相等。
查找數(shù)組元素:通過(guò)binarySearch方法能對(duì)排序好的數(shù)組進(jìn)行二分查找法操作。
int[] ints=new int[5];
//數(shù)組全部賦值為6
Arrays.fill(ints,6);
//數(shù)組第2個(gè)和第4個(gè)賦值為7,未賦值的未0
Arrays.fill(ints,1,4,7);
//升序
Arrays.sort(ints);
//對(duì)第1個(gè)到第4個(gè)進(jìn)行升序
Arrays.sort(ints,1,4);
int[] ints1=ints.clone();
Arrays.equals(ints,ints1); //true
int[] ints2=new int[5];
Arrays.fill(ints2,8);
Arrays.equals(ints,ints2);//true
//使用二分搜索算法查找指定元素所在的下標(biāo)(必須是排序好的,否則結(jié)果不正確)
Arrays.sort(ints);
//會(huì)返回第一個(gè)找到的下標(biāo)
System.out.println(Arrays.binarySearch(ints,6));