【Java基礎】01 集合

Java基礎 —— 01 集合#

1 集合的類型與各自的特性##

1.1 Collection:單列集合

  • List: 有存儲順序, 可重複數組

    • ArrayList: 數組實現, 查找快, 增刪慢因爲是數組實現, 在增和刪的時候會牽扯到數組 增容, 以及拷貝元素. 因此慢。數組是能夠直接按索引查找, 因此查找時較快。
    • LinkedList: 鏈表實現, 增刪快, 查找慢因爲鏈表實現, 增長時只要讓前一個元素記住本身就能夠, 刪除時讓前一個元素記住後一個元素, 後一個元素記住前一個元素. 這樣的增刪效率較高但查詢時須要一個一個的遍歷, 因此效率較低。
    • Vector: 和ArrayList原理相同, 但線程安全, 效率略低。 和ArrayList實現方式相同, 但考慮了線程安全問題, 因此效率略低。
  • Set: 無存儲順序, 不可重複安全

    • HashSet: 線程不安全,存取速度快。底層是以哈希表實現的。數據結構

      • 往hashSet添加元素的時候,首先會調用元素的hashCode方法獲得元素的哈希碼值,而後把哈希碼值通過運算算出該元素存在哈希表中的位置。
      • 狀況1:若是算出的位置目前尚未存在任何的元素,那麼該元素能夠直接添加到哈希表中。
      • 狀況2: 若是算出的位置目前已經存在其餘的元素,那麼還會調用元素 的equals方法再與這個位置上 的元素比較一次。 若是equals方法返回的是true,那麼該元素被視爲重複元素,不容許添加。若是equals方法返回 的是false,那麼該元素也能夠被添加。
    • TreeSet: 紅-黑樹的數據結構,默認對元素進行天然排序(String)。若是在比較的時候兩個對象返回值爲0,那麼元素重複。ide

        1. 往TreeSet添加元素 的時候,若是元素具有天然順序的特色,那麼TreeSet會根據元素 的天然順序特性進行排序 存儲。
        1. 往TreeSet添加元素 的時候,若是元素不具有天然順序的特色,那麼元素所屬的類就必需要實現Comparable接口,把比較的規則定義在CompareTo方法上。
        1. 往TreeSet添加元素 的時候,若是元素不具有天然順序的特色,那麼元素所屬的類就也沒有實現Comparable接口,那麼在建立TreeSet對象的時候必需要傳入比較器對象。
      • 比較器 的定義格式:this

        class 類名 implements Comparator{ }線程

1.2 Map:雙列集合

  • HashMap: 線程不安全,存取速度快。底層是以哈希表實現的。
  • TreeMap: 紅-黑樹的數據結構,默認對元素進行天然排序(String)。若是在比較的時候兩個對象返回值爲0,那麼元素重複。
  • HashTable: 底層也是使用了哈希表維護的,存取的讀取快,存儲元素是無序的。

1.3 HashSet實例

class Person{
	
	int id;	
	
	String name;

	public Person(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
		
	@Override
	public int hashCode() {
		return this.id;
	}
	
	@Override
	public boolean equals(Object obj) {
		Person p = (Person)obj;
		return this.id == p.id;
	}
	
	@Override
	public String toString() {
		return "編號:"+ this.id +" 姓名: "+ this.name;
	}
}

public class Demo1 {
	
	public static void main(String[] args) {
		HashSet<Person> set = new HashSet<Person>();
		set.add(new Person(110,"狗娃"));
		set.add(new Person(110,"狗娃"));
		System.out.println("集合的元素:"+ set);		
	}
	
}

2 遍歷集合##

2.1 遍歷集合的幾種方式

  1. 使用迭代器Iterator的方式。
  2. 使用加強for循環的方式。
  3. 若是有下標,則可使用下標的方式。

2.2 遍歷數組

public static void main(String[] args) {
	// 遍歷數組:
	String[] arr = new String[] { "xx", "yy", "zz" };

	// 1,加強的for循環
	for (String elt : arr) {
		System.out.println(elt);
	}

	// 2,下標的方式
	for (int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);
	}
}

2.3 遍歷List

public static void main(String[] args) {
	// 遍歷List:
	List<String> list = new ArrayList<String>();
	list.add("aa");
	list.add("bb");
	list.add("cc");

	// 1,加強的for循環
	for (String elt : list) {
		System.out.println(elt);
	}

	// 2,下標
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}

	// 3,迭代器
	for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
		String elt = iter.next();
		System.out.println(elt);
	}
}

2.4 遍歷Set

public static void main(String[] args) {
	// 遍歷Set:
	Set<String> set = new HashSet<String>();
	set.add("dd");
	set.add("ee");
	set.add("ff");

	// 1,加強的for循環
	for (String elt : set) {
		System.out.println(elt);
	}
	
	// 2,迭代器
	for(Iterator<String> iter = set.iterator(); iter.hasNext() ; ){
		String elt = iter.next();
		System.out.println(elt);
	}
}

2.5 遍歷Map

public static void main(String[] args) {
	// 遍歷Map:
	Map<String, String> map = new HashMap<String, String>();
	map.put("aa", "xx");
	map.put("bb", "yy");
	map.put("cc", "zz");

	// 1,加強的for循環(Entry集合)
	for (Entry<String, String> entry : map.entrySet()) {
		System.out.println(entry);
	}
	
	// 2,加強的for循環(Key集合)
	for(String key : map.keySet()){
		System.out.println(key + " = " + map.get(key));
	}
	
	// 3,遍歷值的集合
	for(String value : map.values()){
		System.out.println(value);
	}
}
相關文章
相關標籤/搜索