天天看點

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap

文章目錄

  • 集合概述(容器類)
  • List與ArrayList
    • 特點
    • list具體方法
      • 添加元素list.add方法
      • 索引
      • list.addAll(index,value)
      • 查找資料list.indexOf(),list.lastindexOf()
      • 移除資料list.remove(index)
      • 改值list.set(index,value)
      • 切片list.subList(a,b)
      • 清單長度list.size()
      • 結論:
  • Set,HashSet
    • 周遊集合元素的方法
  • Map
    • 特點
    • Map接口與HashMap類
    • TreeMap

集合概述(容器類)

Java集合類存放于 java.util 包中

Java 集合可分為 Set、List 和 Map 三種大體系

Set:無序、不可重複的集合

List:有序,可重複的集合

Map:具有映射關系的集合

接口:Set,List,Map不是直接使用的,而是通過他們的實作類!

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap
Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap

個人感覺:

對應python裡面的集合,清單,字典

List與ArrayList

ArrayList是可執行個體化的

特點

清單(和python裡清單一樣,但是這裡把清單屬于集合!)

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap

List 代表一個元素有序、且可重複的集合,集合中的每個元素都有其對應的順序索引

List 允許使用重複元素,可以通過索引來通路指定位置的集合元素。

List 預設按元素的添加順序設定元素的索引。

List 集合裡添加了一些根據索引來操作集合元素的方法

list具體方法

添加元素list.add方法

看代碼學習!

import java.util.List;
import java.util.ArrayList;

public class Test5 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("v");
		list.add("v2");
		list.add("v");//清單可重複
		list.add("b");
		list.add("a");
		System.out.println(list);
	
	}

}
           

備注:

很方法,會自動提示import

import java.awt.List;(不是這個,why?先留着這個問題)

import java.util.List;

import java.util.ArrayList;

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap

索引

list.get(index)

list.add(index,“value”);

public class Test5 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("v");
		list.add("v2");
		list.add("v");//清單可重複
		list.add("b");
		list.add("a");
		System.out.println(list);
		System.out.println(list.get(3));//索引第四個元素,因為從0開始,下标
		
		list.add(0,"a");
		System.out.println(list);//結果為[a, v, v2, v, b, a]

	}

}
           

list.addAll(index,value)

List<String> list1 = new ArrayList<String>();
		list1.add("acdf");
		list1.add("9989");
		
		list.addAll(0,list1);
		System.out.println(list);//[acdf, 9989, a, v, v2, v, b, a]
           

查找資料list.indexOf(),list.lastindexOf()

第一個出現元素 的下标和最後一個出現元素的下标。

移除資料list.remove(index)

根據索引remove

改值list.set(index,value)

根據索引set

切片list.subList(a,b)

根據索引a,b 切一段,左開右閉。

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap
List<String> list2 = list.subList(2,5);
		System.out.println(list2);//[a, v, v2]
           

清單長度list.size()

結論:

Vector是一個古老的集合,通常建議使用 ArrayList

ArrayList 是線程不安全的,而 Vector 是線程安全的。

即使為保證 List 集合線程安全,也不推薦使用 Vector

Set,HashSet

我們說的集合,都是HashSet

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap

周遊集合元素的方法

Iterator 接口主要用于周遊 Collection 集合中的元素,Iterator 對象也被稱為疊代器

Java 5 提供了 foreach 循環疊代通路 Collection

方法在代碼裡。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class Test3 {
	public static void main(String[] args) {
//		Set set = new HashSet();
		//<Object>就是任何類型的都行
		Set<Object> set = new HashSet<Object>();//與上面的等價
		set.add(1);//添加元素
		set.add("a");
//		
		System.out.println(set);
//		
//		set.remove(1);//移除元素
//		
//		System.out.println(set);
//		
//		System.out.println(set.contains(1));//判斷是否包含元素
//		
//		set.clear();//清空集合
//		
//		System.out.println(set);
		
		set.add("a");
		set.add("b");
		set.add("c");
		set.add("d");
		
//		set.add("d");//set集合是存的值是不重複
		set.add(1);
		set.add(true);
		set.add(null);
		
		System.out.println(set);
		//使用疊代器周遊集合
		Iterator it = set.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
		
		//for each疊代集合,推薦使用這種
		for(Object obj : set){
			//這個的意思是把set的每一個值取出來,指派給obj,直到循環set的所有值
			System.out.println(obj);
		}
		
		System.out.println(set.size());//擷取集合的元素個數
		
		//如果想要讓集合隻能存同樣類型的對象,怎麼做
		//使用泛型<type>
		Set<String> set1 = new HashSet<String>();//比如指定String為集合的泛型,那麼這個集合不能存String類型之外的資料
		
		set1.add("sbc");
//		set1.add(1);//不行了,隻能字元串類型了
	}
}
           

集合是無序的!!!

為了有序咋辦?

TreeSet是自然排序,從小到大。預設情況下,TreeSet 采用自然排序。

import java.util.Set;
import java.util.TreeSet;//為了有序集合
public class Test4 {
	public static void main(String[] args) {
		Set<Integer> set = new TreeSet<Integer>();		
		set.add(3);
		set.add(5);
		set.add(7);
		set.add(9);
		System.out.println(set);
		
	}

}

           

周遊集合set,強制for循環

//周遊集合set
		for(Integer i : set) {
			System.out.println(i);
		}
           

如果不是數字怎麼排序?

如果需要實作定制排序,則需要在建立 TreeSet 集合對象時,提供一個 Comparator 接口的實作類對象。由該 Comparator 對象負責集合元素的排序邏輯

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap
import java.util.Comparator;//為了定制排序
import java.util.Set;
import java.util.TreeSet;//為了有序集合
public class Test4 {
	//step4
	public static void main(String[] args) {
		Person p1 = new Person(18,"Tom");//因為有參構造,這裡可以直接寫參數。
		Person p2 = new Person(18,"Tom1");
		Person p3 = new Person(14,"Tom3");
		Person p4 = new Person(16,"Tom4");
		Person p5 = new Person(10,"Tom5");
		
		//step5
		//然後建立set,去排序
		Set <Person> set = new TreeSet<Person>(new Person());//指明泛型為Person
		set.add(p1);
		set.add(p2);
		set.add(p3);
		set.add(p4);
		set.add(p5);
		
		//step6
		//**強制for循環**
		for(Person p:set) {
			System.out.println(p.name +  ""+ p.age);
		}
		
	}
	
}

/**
 * 定制排序
 * @author jkjkjk
 *
 */
class Person implements Comparator<Person>{
	
	//step3
	public Person() {
		
	}
	
	//有參構造
	public Person(int age, String name) {
		this.age = age;
		this.name = name;
	}//然後再去new Person類
	
	//step1
	int age;
	String name;
	//step2
	@Override
	public int compare(Person o1, Person o2) {
		// TODO Auto-generated method stub
		if(o1.age > o2.age) {
			return 1;
			
		}else if(o1.age < o2.age){
			return -1;
		}else {
			return 0;
		}
		//再去寫構造
		
	}
	
	
}
           

Map

特點

Map 用于儲存具有映射關系的資料,是以 Map 集合裡儲存着兩組值,一組值用于儲存 Map 裡的 Key,另外一組用于儲存 Map 裡的 Value

Map 中的 key 和 value 都可以是任何引用類型的資料

Map 中的 Key 不允許重複,即同一個 Map 對象的任何兩個 Key 通過 equals 方法比較中傳回 false

**Key 和 Value 之間存在單向一對一關系,即通過指定的 Key 總能找到唯一的,**确定的 Value。

Map接口與HashMap類

Java學習筆記16(集合!HashSet, ArrayList, HashMap)集合概述(容器類)List與ArrayListSet,HashSetMap

看代碼學習!

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;


public class Test6 {
	public static void main(String[] args) {
		//new HashMap這個類,指派給map,指明泛型,是一對的
		Map<String, Integer> map = new HashMap<String, Integer>();
		
		map.put("b", 1);//添加資料
		map.put("c", 2);
		map.put("e", 2);
		System.out.println(map);//{b=1, c=2, e=2}
		
		System.out.println(map.get("b"));//根據key取值
		
		map.remove("c");//根據key移除鍵值對
		System.out.println(map);//{b=1, e=2}
		
		System.out.println(map.containsKey("a"));//判斷目前的map集合是否包含指定的key
//		
		System.out.println(map.containsValue(10));//判斷目前的map集合是否包含指定的value
//		
	map.clear();//清空集合
           

周遊map,注意!

第一種方法,周遊key,

Set<String> keys = map.keySet();//import java.util.Set;
		
		for(String key:keys) {
			System.out.println(map.get(key));
		}
           

這種方法效率低

第一種方法,map.entrySet()

//通過map.entrySet();周遊map集合
		Set<Entry<String, Integer>> entrys = map.entrySet();//import java.util.Map.Entry;
		for(Entry<String, Integer> en : entrys){
			System.out.println("key: " + en.getKey() + ", value: " + en.getValue());
		}
		//key: b, value: 1
		//key: e, value: 2
           

TreeMap

TreeMap 存儲 Key-Value 對時,需要根據 Key 對 key-value 對進行排序。TreeMap 可以保證所有的 Key-Value 對處于有序狀态。

TreeMap 的 Key 的排序:

自然排序:TreeMap 的所有的 Key 必須實作 Comparable 接口,而且所有的 Key 應該是同一個類的對象,否則将會抛出 ClasssCastException

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;


public class Test6 {
	public static void main(String[] args) {
		//new HashMap這個類,指派給map1,指明泛型,是一對的
		Map<Integer,String> map1 = new HashMap<Integer,String>();
		
		map1.put(6, "xx33");//添加資料
		map1.put(2, "xx34");//添加資料
		map1.put(3, "xxx1");//添加資料
		map1.put(1, "xxx");//添加資料
		
		System.out.println(map1);//{1=xxx, 2=xx34, 3=xxx1, 6=xx33}
		
		Map<Integer,String> map2 = new TreeMap<Integer,String>();
		
		map2.put(6, "xx33");//添加資料
		map2.put(2, "xx34");//添加資料
		map2.put(3, "xxx1");//添加資料
		map2.put(1, "xxx");//添加資料
		
		System.out.println(map2);//{1=xxx, 2=xx34, 3=xxx1, 6=xx33}
		
		
	}

}
           

定制排序(了解):建立 TreeMap 時,傳入一個 Comparator 對象,該對象負責對 TreeMap 中的所有 key 進行排序。此時不需要 Map 的 Key 實作 Comparable 接口

天天學一點點,開心一點點,頭發還剩億點點!