一、Collection接口
Collection接口屬於java.lang包,是集合類框架的主要接口,List接口、set接口、Queue接口繼承了Collection接口,分別是列表、集合和隊列。
1、List接口
java.lang.List接口主要定義了一些添加、獲取、刪除的元素的方法,主要是存儲引用。注意:基本數據類型在進行操作時,會自動進行拆裝箱。元素是有序的,並且可以重複,每個元素都有自己的索引
void add(Object obj); //順序的將一個引用放入列表中,增加元素
void add(int index,Object obj); //在指定位置增加元素
Object get(int index); //獲取某個位置的引用
Object remove(int index); //刪除指定位置元素
void set(int index,Object obj); //更改某一位置的元素
int size(); //得到當前列表的大小
ArrayList類:List接口的實現類
- 底層結構是動態數組
- 不支持線程同步,建議在單線程時使用
- 由於底層是數組,因此查找快,增刪較慢,需要移動元素
LinkedList類:List接口的實現類
- 底層使用鏈表數據結構
- 不支持線程同步
- 查找需要遍歷鏈表,因此慢,增刪必須要移動元素,快
Vector類:List接口的實現類
- 底層是動態數組
- 支持線程同步,是線程安全的
- 查找快,增刪慢
2、Set接口
Set是接口是集合,需要滿足數學上集合特性,無序性、互異性,不支持線程同步
HashSet類:
- 底層是哈希表數據結構,根據hashcode()和equals()方法確定元素的唯一性
- 集合中的元素不重複且是無序的
TreeSet類:
- 底層數據結構是二叉樹
- 可以對Set集合中的元素進行排序,自然順序。也可以自己寫個類實現Comparable接口或者Comparator接口,定義自己的比較器。
先準備一個類吧,要求對年齡從小到大進行排序
public class People{
int age;
String name;
public People(int age,String name){
this.age = age;
this.name = name;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
方式一:實現Comparator接口,不需要在類中實現該接口
public static void main(String[] args) {
// TODO 自動生成的方法存根
ArrayList<People> list = new ArrayList<>();
list.add(new People(15,"張三"));
list.add(new People(14,"李四"));
list.add(new People(20,"王五"));
list.add(new People(17,"趙六"));
Collections.sort(list,new Comparator<People>() {
@Override
public int compare(People o1, People o2) {
if(o1.age > o2.age)
return -1;
if(o1.age < o2.age)
return 1;
return 0;
}
});
for(int i = 0; i < list.size();i++) {
System.out.println(list.get(i).name + ":" + list.get(i).age);
}
}
//輸出
王五:20
趙六:17
張三:15
李四:14
方法二:在People類中實現Comparable接口
public class People implements Comparable<People>{
int age;
String name;
People(int age,String name){
this.age = age;
this.name = name;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(People o) {
// TODO 自動生成的方法存根
if(this.age > o.age)
return 1;
if(this.age < o.age)
return -1;
return 0;
}
}
public static void main(String[] args) {
Set<People> set = new TreeSet<>();
set.add(new People(15,"張三"));
set.add(new People(14,"李四"));
set.add(new People(20,"王五"));
set.add(new People(17,"趙六"));
for(People p : set)
System.out.println(p.name + ":" + p.age);
}
//輸出
李四:14
張三:15
趙六:17
王五:20
二、Map接口
該集合是存儲鍵值對的,確保鍵的唯一性。綜合考慮了數組查找快和鏈表增刪快的優點。
put(Object key,Object value);//向map中放入一個值
Object get(Object key);//根據鍵找值
boolean containsKey(Object key);//判斷Map中是否有值爲key的鍵
remove(Object key);//刪除鍵值爲key的鍵值對
int size();//得到鍵值對的個數
1、HashMap類
- 底層是哈希表數據結構
- 可以存入null鍵和null值,但最多允許一個鍵爲null,多個值爲null
- 線程不同步,但是效率高
- 如果想要線程同步,可以考慮使用ConcurrentHashMap
2、 HashTable類
- 底層是哈希表數據結構
- 不允許鍵或者值爲null
- 支持線程同步,效率沒有HashTable高
3、 TreeMap
- 底層二叉樹數據結構
- 線程不同步
- 可以對map集合進行排序,可以自己指定比較器,與TreeSet相似
三、Java中Collection集合常見的面試題
1、ArrayList與LinkedList的區別
2、ArrayList與Vector的區別
3、HashMap與HashTable的區別
4、HashMap與ConcurrentHashMap以及HashTable的區別
5、HashSet如何檢查元素的重複
7、有關Comparator接口與Comparator接口的區別(在TreeSet與TreeMap中可能會用到)
8、ConcurrentHashMap線程安全的具體實現方式