java面試題(容器)

在這裏插入圖片描述
1、ArrayList 和 LinkedList 的區別是什麼?
ArrayList是一段內存空間連續的地址,內部實現是通過數組實現的,LinkedList是通過鏈表的形式將每個元素的關係連接起來的,地址不是連續的,所以對於ArrayList來說,隨機訪問的效率肯定比ArrayList高,但是一般情況下插入元素和刪除元素效率就比LinkedList低很多,因爲要做頻繁的元素移動操作
2、List,Set,Map之間的區別:
List集合中可以有相同的元素,而且輸出的順序就是我們添加進去的順序
Set集合中不可以有相同的元素,而且輸入順序和輸出順序沒有直接聯繫
Map集合和上面兩者完全不同,繼承的接口都不一樣,Map是一鍵值對的形式存放數據。
3、如何實現數組和List之間的轉換?

int[] a=new int[]{1,2,5,4,8};
        //將數組轉爲List集合
        List<int[]> list = Arrays.asList(a);

        //定義一個ArrayList集合
        List<Integer> list1=new ArrayList();
        //向集合中添加元素
        list1.add(1);
        list1.add(2);
        list1.add(4);
        //將ArrayList集合轉爲數組
        //這裏有幾個注意點:下面註釋的幾種都是錯誤的
        //int[] array=(int[])list1.toArray();
        //int[] array=list1.toArray(new int[0]);
        //int[] array=list1.toArray(new Integer[0]);
        //下面的這種方式纔是正確的轉換形式
        Integer[] array=list1.toArray(new Integer[0]);
        for(int i=0;i<array.length;i++){
            System.out.print(array[i]+" ");
        }

將數組轉換爲集合沒有多大的問題,但是將集合轉爲數組,卻有一些小問題,最簡單的方法就是將每一個元素取出來然後賦值給一個新的數組,但是這樣的效率不高,代碼也不優雅。int[] array=(int[])list1.toArray();爲什麼這種方式不可以呢?對於強制類型轉換是針對一個對象的,而集合中是一組對象,所以不能直接這樣轉換。後面的兩者情況不可以,我們需要使用的是包裝類來實現轉換。
那麼Integer[] array=list1.toArray(new Integer[0]);怎麼理解呢,其實就是指定返回的類型是一個整型的數組類型,如果不這樣寫,返回的是一個Object[]類型的數組,其實new Integer[0]中的零是隨意的,只是創建一個對象而已。
4、ArrayList 和 Vector 的區別是什麼?
1、ArrayList是線程不安全的,但是效率很高,Vector是線程安全的,但是效率很低。
2、ArrayList是jdk1.2以後出來的,Vevtor在jdk1,0就出來了,現在通常用的是ArrayList,幾乎很少使用到Vector
5、Collection和Collections的區別:
Collection是一個集合的頂級接口,封裝了很多集合的操作方法,集合List和集合Set都是直接繼承了Collection接口
Collections是集合框架中的一個工具類,在它裏面封裝了對集合的一些操作,比如sort排序函數
5、在 Queue 中 poll()和 remove()有什麼區別?

 //實現Queue的一種方法,它是一個接口,所以要用它的子類來實例化
        Queue<Integer> queue=new LinkedList();
        //往隊列中添加元素
        queue.add(1);
        queue.add(2);
        //符合隊列的性質,先進先出
        System.out.println(queue.poll());  //1
        System.out.println(queue.poll());  //2
        System.out.println(queue.poll());  //null
        System.out.println(queue.remove());//java.util.NoSuchElementException

對於poll(),如果隊列爲空,返回值爲null
對於remove(),如果隊列爲空,那麼直接報錯
6、那些集合類是線程安全的?
Vector:比ArrayList多了一個線程安全,但是效率很低,基本不適用
Statck:棧,先進後出
HashTable:比HashMap多了一個線程安全
7、Iterator是什麼,怎麼使用?
先通過一段代碼來看看怎麼使用

 ArrayList<String> list = new ArrayList<>();
        list.add("魯班");
        list.add("凱");
        list.add("典韋");
        list.add("白起");
        //獲取一個Iterator迭代器
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

簡單的說,迭代器就是爲了集合框架中遍歷元素。通過集合對象獲取一個迭代器對象
hasNext():是否還有下一個元素
next();下一個元素
remove();雖然有這個刪除的函數,但是迭代器就是爲了變量元素而產生的,所以最好不要使用這個方法。
8、Iterator 和 ListIterator 有什麼區別?
1、Iterator是對Set集合和List集合都存在的,而ListIterator是隻有List集合內纔有的
2、Iterator只能單向的往後遍歷,ListIterator有往前遍歷的能力,可以雙向的遍歷
3、ListIterator功能更加強大,裏面包含了跟多的方法,比如添加元素,返回下標位置等等。
9、簡單的敘述一下hashmap的實現原理?
HashMap是Map接口的一個實現類,以鍵值對的形式存在,允許null值和null鍵。HashMap底層是通過數據和鏈表兩者數據結構組合實現的。首先根據key值計算hash值,根據hash值獲取數組下標值,如果這個下標不存在,那麼直接將這個key值對於的value值添加到數組中去,如果存在,那麼對應數組位置將以鏈表的形式存在,新添加的元素在鏈表頭,jdk1.8以後,如果鏈表的長度大於8,就會以紅黑樹的形式進一步優化實現,時間複雜度O(n)降到O(logn)
(本人能力有限,無法自己實現代碼,只是初步的瞭解實現的原理,在學習中)
10、haspMap和TreeMap的區別:
通過上面的原理理解,我們知道HashMap中可以根據hashCode值獲取數組下標值,而且裏面的實現有鏈表,所以對於定位元素,刪除,插入元素使用HashMap更加高效,TreeMap裏面的元素會進行一定的排序,所以如果對於結果需要一個指定的順序,那麼使用TreeMap高效一些。
11、HashTable和HashMap的區別:
HashMap:是非同步的,所以線程不安全,但是效率更高
HashTable:是同步的,線程安全,但是效率比HashMap低
其它兩者都一樣使用
總結:對於這一章是難點也是重點,只是掌握初步的使用階段,但是內部實現原理如果要我們自己手寫是很難的(能力有限)數據結構是編程的核心,是以後進步的心法,所以有必要在今後的學習中再一次深入學習
(共勉)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章