一、介紹Collection框架的結構java
集合是Java中的一個很是重要的一個知識點,主要分爲List、Set、Map、Queue三大數據結構。它們在Java中的結構關係以下:數組
Collection接口是List、Set、Queue的父級接口。安全
Set接口有兩個經常使用的實現類:HashSet和TreeSet。List接口的經常使用接口有ArrayList和Vector接口。數據結構
Map接口有兩個經常使用的實現類:Hashtable和HashMap。多線程
二、Collection框架中實現比較要實現什麼接口框架
要實現比較有兩種方式:第一種,實體類實現Comparable<T>接口,並實現 compareTo(T t) 方法,咱們稱爲內部比較器。第二種,建立一個外部比較器,這個外部比較器要實現Comparator接口的 compare(T t1, T t2)。ide
第一種,實現Comparable接口:大數據
package com.chanshuyi.comparable; import java.util.*; public class Student implements Comparable<Student> { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Student o) { if ( getAge() > o.getAge()) { return 1; } else if ( getAge() < o.getAge()) { return -1; } else { return 0; } } //重寫toString() 用於輸出 public String toString() { return "[" + name + "," + age + "]"; } public static void main(String args[]){ Student s1 = new Student("Tom", 12); Student s2 = new Student("Marry", 9); Student s3 = new Student("Json", 88); List<Student> studentList = new ArrayList<Student>(); studentList.add(s1); studentList.add(s2); studentList.add(s3); Collections.sort(studentList); System.out.printf("Original sort, list:%s\n", studentList); } }
第二種,實現Comparator接口:this
先定義一個Student類,無須實現任何接口。spa
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
定義一個外部比較器類,實現Comparator接口:
public class StudentComparator implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { if (o1.getAge() > o2.getAge()) { return 1; }else if (o1.getAge() == o2.getAge()) { return 0; }else{ return -1; } } public static void main(String args[]) { Student marry = new Student("marry", 12); Student tom = new Student("tom", 3); Student jackson = new Student("jackson", 88); StudentComparator comparator = new StudentComparator(); System.out.println(comparator.compare(marry, tom)); //1 System.out.println(comparator.compare(tom, jackson)); //-1 } }
因而可知,若是你但願該實體類在放入集合的時候能按照你但願的方式排序(若是集合支持),那麼你須要讓實體類實現Comparable接口。若是你只是須要簡單比較兩個實體類的大小,最後返回一個結果,那麼用Comparator接口實現一個外部比較器更合適。
三、ArrayList和Vector的區別(是否有序、是否重複、數據結構、底層實現)
ArrayList和Vector都實現了List接口,他們都是有序集合,而且存放的元素是容許重複的。它們的底層都是經過數組來實現的,所以列表這種數據結構檢索數據速度快,但增刪改速度慢。
而ArrayList和Vector的區別主要在兩個方面:
第一,線程安全。Vector是線程安全的,而ArrayList是線程不安全的。所以在若是集合數據只有單線程訪問,那麼使用ArrayList能夠提升效率。而若是有多線程訪問你的集合數據,那麼就必需要用Vector,由於要保證數據安全。
第二,數據增加。ArrayList和Vector都有一個初始的容量大小,當存儲進它們裏面的元素超過了容量時,就須要增長它們的存儲容量。ArrayList每次增加原來的0.5倍,而Vector增加原來的一倍。ArrayList和Vector均可以設置初始空間的大小,Vector還能夠設置增加的空間大小,而ArrayList沒有提供設置增加空間的方法。
四、HashMap和Hashtable的區別
HashMap和Hashtable都實現了Map接口,而且都是key-value的數據結構。它們的不一樣點主要在三個方面:
第一,Hashtable是Java1.1的一個類,它基於陳舊的Dictionary類。而HashMap是Java1.2引進的Map接口的一個實現。
第二,Hashtable是線程安全的,也就是說是線程同步的,而HashMap是線程不安全的。也就是說在單線程環境下應該用HashMap,這樣效率更高。
第三,HashMap容許將null值做爲key或value,但Hashtable不容許(會拋出NullPointerException)。
五、List 和 Map 區別?(數據結構,存儲特色)
這個要從兩個方面來回答,一方面是List和Map的數據結構,另外一方面是存儲數據的特色。在數據結構方面,List存儲的是單列數據的集合,而Map存儲的是key、value類型的數據集合。在數據存儲方面,List存儲的數據是有序且能夠重複的,而Map中存儲的數據是無序且key值不能重複(value值能夠重複)。
六、List、Map、Set三個接口,存取元素時,各有什麼特色?
List與Set具備類似性,它們都是單列元素的集合,因此,它們有一個功共同的父接口,叫Collection。Set裏面不容許有重複的元素,所謂重複,即不能有兩個相等(注意,不是僅僅是相同)的對象 ,即假設Set集合中有了一個A對象,如今我要向Set集合再存入一個B對象,但B對象與A對象equals相等,則B對象存儲不進去。因此,Set集合的add方法有一個boolean的返回值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則返回true,當集合含有與某個元素equals相等的元素時,此時add方法沒法加入該元素,返回結果爲false。Set取元素時,無法說取第幾個,只能以Iterator接口取得全部的元素,再逐一遍歷各個元素。
List表示有前後順序的集合, 注意,不是那種按年齡、按大小、按價格之類的排序。當咱們屢次調用add(Obj e)方法時,每次加入的對象就像火車站買票有排隊順序同樣,按先來後到的順序排序。有時候,也能夠插隊,即調用add(int index,Obj e)方法,就能夠指定當前對象在集合中的存放位置。一個對象能夠被反覆存儲進List中,每調用一次add方法,這個對象就被插入進集合中一次,其實,並非把這個對象自己存儲進了集合中,而是在集合中用一個索引變量指向這個對象,當這個對象被add屢次時,即至關於集合中有多個索引指向了這個對象,如圖x所示。List除了能夠以Iterator接口取得全部的元素,再逐一遍歷各個元素以外,還能夠調用get(index i)來明確說明取第幾個。
Map與List和Set不一樣,它是雙列的集合,其中有put方法,定義以下:put(obj key,obj value),每次存儲時,要存儲一對key/value,不能存儲重複的key,這個重複的規則也是按equals比較相等。取則能夠根據key得到相應的value,即get(Object key)返回值爲key 所對應的value。另外,也能夠得到全部的key的結合(map.keySet()),還能夠得到全部的value的結合(map.values()),還能夠得到key和value組合成的Map.Entry對象的集合(map.entrySet())。
List 以特定次序來持有元素,可有重複元素。Set 沒法擁有重複元素,內部排序。Map 保存key-value值,value可多值。