Map及其子类
程序员文章站
2022-06-02 23:22:07
...
目录
Map
主要方法:
方法 | 说明 |
---|---|
public V put(K key,V value) | 存储数据,如果Key存在则发生替换,返回旧的数据,不存在返回null |
public V get(Object key) | 通过Key查询对应的内容 |
public V remove(Object key) | 根据Key删除对应的内容 |
public int size() | 获取集合的长度 |
public Collection values() | 返回所有的内容 |
public set keySet() | 获取所有的Key(Key不能重复) |
public Set<Map.Entry<K,V>> entrySet() | 将所有的内容以Map.Entry集合的形式返回 |
示例:
Map<String, String> map = new HashMap<>(10);
//put():增加数据
map.put("1","one");
map.put("2","two");
map.put("3","three");
map.put("4","four");
map.put("5","five");
//get():通过key查询value的值
System.out.println("get()->"+map.get("3"));
//remove():通过key删除内容
System.out.println("remove()->"+map.remove("2"));
//size():获取长度
System.out.println("sie()->"+map.size());
//values():返回所有的values值
System.out.println("values()->"+map.values());
//keySet():返回所有的key值
System.out.println("keySet()->"+map.keySet());
//将所有的数据以 key = value 的集合形式输出
System.out.println("entrySet()->"+map.entrySet());
结果:
get()->three
remove()->two
sie()->4
values()->[one, three, four, five]
keySet()->[1, 3, 4, 5]
entrySet()->[1=one, 3=three, 4=four, 5=five]
**Collection和Map: **
1、Collection是为了输出而进行存储,Map是为了查询而进行存储。
2、Collection是单值集合,Map是二院偶对象集合。
总结:
1、碰见单值集合优先使用List,List接口优先使用ArrayList。
2、需要通过key来查询数据,属于Map接口,Map接口优先考虑hashMap子类。
3、集合的输出全部砽Iterator接口。
HashMap
无参构造:
public HashMap() {
this.loadFactor = 0.75F; //阈值为75%,当超过75%时进行扩容
}
扩容:
final HashMap.Node<K, V>[] resize() {
HashMap.Node<K, V>[] oldTab = this.table;
int oldCap = oldTab == null ? 0 : oldTab.length; //旧的容量
int oldThr = this.threshold;
int newThr = 0;
int newCap;
if (oldCap > 0) { //旧的容量大于0
if (oldCap >= 1073741824) { //当旧的容量大于或等于1073741824
this.threshold = 2147483647; //1073741824 * 2赋值给threshold,阈值
return oldTab;
}
//旧的容量赋值给新的容量 * 2 < 1073741824 && 旧的容量 >= 16,第一次不会进入
if ((newCap = oldCap << 1) < 1073741824 && oldCap >= 16) {//hashMap每次扩容1倍
newThr = oldThr << 1; //新的阈值 = 旧的阈值 * 2
}
} else if (oldThr > 0) { //旧的容量 > 0 (???) 可能是当大于int的范围后变负数,才会进去
newCap = oldThr; //新的容量 = 旧的阈值
} else {
newCap = 16; //第一次容量为扩充为16
newThr = 12; //第一次阈值为12
}
if (newThr == 0) {
float ft = (float)newCap * this.loadFactor;
newThr = newCap < 1073741824 && ft < 1.07374182E9F ? (int)ft : 2147483647;
}
this.threshold = newThr; //新的阈值赋值给threshold
HashMap.Node<K, V>[] newTab = new HashMap.Node[newCap];
this.table = newTab;
数据性能保证:
int binCount = 0;
在while循环中,当binCount = 7,存储的数据其实为8个,binCount从零开始。
if (binCount >= 7) { //当binCount等于7时,转成红黑树
this.treeifyBin(tab, hash); //会进行树状结构转换(红黑树自动修复,保证查询性能)
}
++binCount;
LinkedHashMap
LinkedHashMap是HashMap的子类,其实现机制几乎和HashMap一致,只不过HashMap是无序存储,LinkedHashMap是有序存储,因此想要对数据进行有序存储就使用LinkedHashMap。
TreeMap
TreeMap会自动排序,根据ASCII码的大小进行排序,从小到大,Key不可以为null。
)]
示例:
public class Demo02 {
public static void main(String[] args) {
Map<String,String> map = new TreeMap<>();
map.put("1","one"); //ASCII码 49
map.put("a","again"); //ASCII码 97
map.put("2","two"); //ASCII码 50
map.put("A","Action"); //ASCII码 65
System.out.println(map);
}
}
结果:
{1=one, 2=two, A=Action, a=again}
上一篇: 网吧电脑变身云终端
下一篇: 马化腾:物联网和云计算掀信息化新浪潮