Map,equals,hashCode,遍歷Map,裝載因子,HashMap,LinkedHashMap
阿新 • • 發佈:2019-01-28
//MapDemo-----------------------
package day081702;
import java.util.HashMap;
import java.util.Map;
/**
* Map像多行2列的表格(key - value)
*key不允許重複(指equals為true)
*/
public class MapDemo {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
/**
* V put(K k, V v)
* 若key不存在,則新增新內容,返回null
* 若key已存在,則替換value,返回被替換的value值
*/
map.put("數學", 90);
map.put("語文", 93);
map.put("物理", 94);
map.put("化學", 96);
System.out.println(map.put("英語", 97));//null
System.out.println(map.put("英語", 100));//97
System.out.println(map);//{物理=94, 語文=93, 英語=100, 數學=90, 化學=96}
/**
* V get(K k)
* 用key取得value
* 若key不存在,獲取值為null
*/
System.out.println(map.get("語文"));//93
System.out.println(map.get("歷史"));//null
/**
* 儘量避免使用基本型別,因為會自動拆箱
* 若get()返回null,久違引發空指標異常
*/
Integer num = map.get("歷史");
//int num2 = num.intValue();
//System.out.println(num2);//報錯: java.lang.NullPointerException
System.out.println(num);//null
/**
* boolean containsKey(K k)
* 判斷是否含有給定的key
* 是否含有根據equals判斷
*/
System.out.println(map.containsKey("數學"));
System.out.println(map.containsValue(101));//判斷是否含有給定的value
/**
* V remove(K k)
* 刪除元素,返回值為刪除的value
* 如果沒有對應的key,則返回null
*/
System.out.println(map);//{物理=94, 語文=93, 英語=100, 數學=90, 化學=96}
num = map.remove("物理");
System.out.println(num);//94
System.out.println(map);//{語文=93, 英語=100, 數學=90, 化學=96}
}
}
//Point------------------------------------
package day081702;
/**
* 重寫equals方法時應該同時重寫hashCode方法
* 重寫規則:
* 若兩個equals方法比較為true,那麼hashCode返回的數字必須相同
* 反之則必須不同,但是也應該儘量避免,即:兩個物件若equals比較結果為false,
* 他們的hashCode方法返回值儘量不同,否則影響HashMap的效能
* hashCode方法在當前物件內容沒有發生改變的前提下對此呼叫當前返回相同的數字
*
*/
public class Point {
private int x;
private int y;
public Point() {
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
//MapDemo2(equals,hashCode)-------------------------------
package day081702;
import java.util.HashMap;
import java.util.Map;
/**
* 使用HashMap時應注意:
* 作為key有以下要求:
* 1:首先當這個key重寫了equals方法,
* 那麼重寫hashCode的要求必須滿足
* 2:作為key的物件,不建議輕易改變
*
* 備註:1、如果兩個物件相同,那麼它們的hashCode值一定要相同;2、如果兩個物件的hashCode相同,它們並不一定相同
*/
public class MapDemo2 {
public static void main(String[] args) {
Map<Point,Integer> map = new HashMap<Point,Integer>();
Point p = new Point(1,2);
map.put(p, 100);
System.out.println(p.hashCode());//994
System.out.println(map.hashCode());//902
System.out.println(map.get(p));//取得value值100
p.setX(2);
System.out.println(p.hashCode());//1025
System.out.println(map.hashCode());//1125
System.out.println(map.get(p));//key已經改變,結果為null
p.setX(1);//恢復x的值
System.out.println(p.hashCode());//994
System.out.println(map.hashCode());//902
System.out.println(map.get(p));//取得value值100
}
}
//遍歷Map,裝載因子,HashMap,LinkedHashMap---------------------------
package day081702;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapDemo3 {
public static void main(String[] args) {
/**
* Map初始容量為16
* 資料量為總容量的四分之三最合適
* 裝載因子:假設知道要裝75萬條資料,可以事先指定容量為100萬,以防止不停擴容
* Map<Point,Integer> map = new HashMap<Point,Integer>(1000000);
*
* LinkedHashMap保證順序,但是一般使用HashMap很少關心順序
* Map<String,Integer> map = new LinkedHashMap<String,Integer>();
*/
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("數學", 90);
map.put("語文", 99);
map.put("物理", 85);
map.put("化學", 78);
map.put("英語", 92);
map.put("體育", 65);
map.put("生物", 78);
/**
* 遍歷所有的key
* Set<k> keySet()
* 存入Set
*/
Set<String> keySet = map.keySet();
for(String str:keySet){
System.out.print(" "+ str);
}
System.out.println();
Iterator<String> it = keySet.iterator();
while(it.hasNext()){
System.out.print(" "+ it.next());
}
System.out.println();
/**
* 遍歷鍵值對
* Set<Entry> entrySet()
* 該方法將每組key-value存入一個Entry例項中,
* 並將這些Entry存入一個Set集合並返回
* 我們只需要遍歷該集合,拿到一個Entry例項
* 並獲取其中的key和value
*/
Set<Entry<String,Integer>> entrySet = map.entrySet();
for(Entry<String,Integer> e: entrySet){
String key = e.getKey();
Integer value = e.getValue();
System.out.println(key + ":"+value);
}
/**
* 遍歷value(不常用)
*
*/
Collection<Integer> values = map.values();
for(Integer value : values){
System.out.println(value);
}
}
}