Java集合類框架總結

一、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線程安全的具體實現方式

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