Java集合(一)

List
  簡介
  常用方法
  ArrayList VS LinkedList
  遍歷List
  List和Array轉換
    List轉爲Array
    Array轉爲List
  重寫equals方法
  總結
Map
  映射
  遍歷Map
  HashMap
  SortedMap
  equals()和hashCode()方法
  總結
Properties
  讀取配置
  總結

List

簡介

List是一種有序鏈表:

  • List內部按照放入元素的先後順序存放
  • 每個元素都可以通過索引確定自己的位置
  • 類似數組,但大小可變
常用方法
  • void add(E e) 在末尾添加一個元素
  • Void add(int index, E e) 在指定索引處添加一個元素
  • int remove(int index) 刪除指定索引的元素
  • int remove(Object e) 刪除某個元素
  • E get(int index) 獲取指定索引的元素
  • int size() 獲取鏈表大小(包含元素的個數)
  • boolean contains(Object o) 是否包含某個元素
  • int indexOf(Object o) 某個元素的索引位置
ArrayList VS LinkedList

在這裏插入圖片描述

遍歷List
  • 使用get(int index)
List<String> list = ...
for (int i=0; i<list.size(); i++) {
  	String s = list.get(i);
}
  • 使用Iterator
List<String> list = ...
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
  	String s = it.next();
}
  • 使用foreach
List<String> list = ...
for (String s : list) {
  	...
}
List和Array轉換
List轉爲Array
  • Object[] toArray()
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Object[] array = list.toArray();
// {1, 2, 3}
  • T[] toArray(T[] a)
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Integer[] array = list.toArray(new Integer[3]);
// Integer[] {1, 2, 3}
Number[] ns = list.toArray(new Number[3]);
// Number[] {1, 2, 3}

Array轉爲List
  • List Arrays.asList(T…a)
Integer[] array = {1, 2, 3};
List<Integer> list = Array.asList(array);
// 返回的list不是ArrayList,是一個List對象,只讀不可寫
list.add(4); // UnsupportedOperationException

// 如果想轉換成一個ArrayList對象,可以創建一個新的ArrayList對象,然後把List對象的數據都添加進去
List<Integer> arrayList = new ArrayList<>();
arrayList.addAll(list);

// 代碼簡寫爲
Integer[] array = {1, 2, 3}
List<Integer> arrayList = new ArrayList(Arrays.asList(array));
重寫equals方法
@Override
public boolean equals(Object o) {
  	if (this == o) {
      	return true;
    }
    if (o == null || getClass() != o.getClass()) {
      	return false;
    }
    Score score1 = (Score) o;
    return score == score1.score && Objects.equals(name, score1.name);
}
總結

List的特點:

  • 按索引順序訪問的長度可變的鏈表
  • 優先使用ArrayList而不是LinkedList
  • 可以直接使用for…each遍歷
  • 可以和Array相互轉換

如果要在List中查找元素:

  • List的實現類通過元素的equals方法比較兩個元素
  • 放入的元素必須正確覆寫equals方法(JDK提供的String、Integer等已經覆寫了equals方法)
  • 編寫equals方法可藉助Objects.equals()判斷

如果不在List中查找元素:

  • 不必覆寫equals方法

Map

映射

Map<K, V>是一種鍵-值(Key-Value)映射表:

  • 可以通過Key快速查找Value(元素)
Map<String, Student> map = ...
Student stu = map.get("XiaoMing");
  • V put(K key, V value) 把Key-Value放入Map
  • V get(K key) 通過Key獲取Value
  • boolean containsKey(K key) 判斷Key是否存在
遍歷Map
  • 遍歷Key可以使用for…each循環遍歷keySet()
Map<String, Integer> map = ...
for (String key : map.keySet()) {
  	Integer value = map.get(key);
}
  • 同時遍歷Key和Value可以使用for…each循環遍歷entrySet()
Map<String, Integer> map = ...
for (Map.Entry<String, Integer> entry : map.entrySet()) {
  	String key = entry.getKey();
  	Integer value = entry.getValue(); 
}
HashMap

最常用的實現類是HashMap,HashMap內部存儲不保證有序

  • 遍歷時的順序不一定是put放入的順序,也不一定是Key的排序順序
Map<String, Integer> map = new HashMap<>();
map.put("A", 59);
map.put("B", 78);
map.put("C", 89);
for (String key : map.keySet()) {
		System.out.println(key + "->" + map.get(key));
}
// B -> 78	A -> 59  C -> 89
SortedMap

SortedMap保證遍歷時以Key的順序排序

  • SortedMap的實現類是TreeMap
Map<String, Integer> map = new TreeMap<>();
map.put("A", 59);
map.put("B", 78);
map.put("C", 89);
for (String key : map.keySet()) {
		System.out.println(key + "->" + map.get(key));
}
// 	A -> 59  B -> 78  C -> 89

自定義排序需要創建TreeMap時傳入一個Comparator

Map<String, Integer> map = new TreeMap<>(new Comparator<String>() {
  	public int compare(String o1, String o2) {
      	// 倒序
      	return o2.compareTo(o1);
    }
});
map.put("A", 59);
map.put("B", 78);
map.put("C", 89);
for (String key : map.keySet()) {
		System.out.println(key + "->" + map.get(key));
}
// C -> 89   B -> 78 	A -> 59
equals()和hashCode()方法

正確使用Map必須保證:

  • 作爲Key的對象必須正確覆寫equals()方法,例如:String、Integer…
class Person {
  	private String name;
  	private int age;
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj instanceof Person) {
						Person p = (Person)obj;
          	return Objects.equals(this.name, p.name) && this.age == p.age;
        }
      	return false;
    }
}
  • 作爲Key的對象必須正確覆寫hashCode()方法:
    • 如果兩個對象相等,則兩個對象的hashCode()必須相等
    • 如果兩個對象不相等,則兩個對象的hashCode() 不需要相等
public int hashCode() {
  	// 保證name和age相同時,兩個對象時相同的
  	return Objects.hash(this.name, this.age);
}

如果一個對象覆寫了equals()方法,就必須正確覆寫hashCode()方法:

  • 如果a.equals(b) == true, 則a.hashCode() == b.hashCode()
  • 如果a.equals(b) == false, 則a和b的hashCode()儘量不要相等
總結
  • Map<K, V> 是一種映射表,可以通過Key快速查找Value
  • 可以通過for…each遍歷keySet()
  • 可以通過for…each遍歷entrySet()
  • 需要對Key排序時使用TreeMap
  • 通常使用HashMap
  • 作爲Key的對象必須正確覆寫equals和hashCode方法
  • 一個類如果覆寫了equals,就必須覆寫hashCode方法
  • hashCode可以通過Objects.hash()輔助方法實現

Properties

讀取配置

Properties用來讀取配置:

  • .properties文件只能使用ASCII編碼
  • 可以從文件系統讀取.properties文件
// 獲取文件路徑
String path = "C:\\conf\\setting.properties";
// 創建Properties對象
Properties props = new Properties();
// 加載文件
props.load(new FileInputStream(path));
// 讀取配置
String url = props.getProperty("url");
// 設置默認值,當key不存在是返回默認值
String desc = props.getProperty("description", "default description");
  • 可以從ClassPath讀取.properties文件
Properties props = new Properties();
// 從ClassPath下讀取文件
props.load(getClass().getResourceAsStream("/common/setting.properties"));
// 讀取配置
String url = props.getProperty("url");
// 設置默認值,當key不存在是返回默認值
String desc = props.getProperty("description", "default description");
  • 可以讀取多個.properties文件

  • 後讀取的Key-Value會覆蓋已讀取的Key-Value

Properties props = new Properties();
// 從ClassPath下加載配置
props.load(getClass().getResourceAsStream("/common/setting.properties"));
// 從文件中讀取加載配置
props.load(new FileInputStream("C:\\conf\\setting.properties"));

// 讀取配置
String url = props.getProperty("url");
// 設置默認值,當key不存在是返回默認值
String desc = props.getProperty("description", "default description");

Properties實際上是從Hashtable派生:

  • String getProperty(String key)
  • void setProperty(String key, String Value)
  • Object get(Object key) 繼承下來的方法,不要使用
  • void put(Object key, Object value) 繼承下來的方法,不要使用
總結
  • Properties用於讀寫配置文件xxx.properties
  • .properties文件只能使用ASCII編碼
  • 可以從ClassPath或文件系統讀取.properties文件
  • 讀寫Properties時:
    • 僅使用getProperty() / setProperty()方法
    • 不要使用繼承而來的get() / put() 方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章