Java面試準(zhǔn)備(Java集合)

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

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

  • Java SE 基礎(chǔ): 封裝、繼承、多態(tài) 封裝: 概念:就是把對(duì)象的屬性和操作(或服務(wù))結(jié)合為一個(gè)獨(dú)立的整體,并盡...
    Jayden_Cao閱讀 2,252評(píng)論 0 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,740評(píng)論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,656評(píng)論 0 3
  • 很開(kāi)心地想寫(xiě)一下今天從日月光一路逛到大悅城的吃后感【其實(shí)沒(méi)有吃很多】人生中第一次用遠(yuǎn)足填補(bǔ)的生日,從此不再慶祝,只...
    淇奧Syrinx閱讀 310評(píng)論 1 2
  • 做女人最可貴的,是“莫欺少年窮”。如果不嫌棄男人年輕時(shí)候的窮苦,愿陪他走過(guò)人生最艱苦的歲月,這樣的女人千萬(wàn)不能錯(cuò)過(guò)...
    聯(lián)盟者工作室閱讀 384評(píng)論 0 0

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