HashMap
- Map父接口
- 特点:存储一对数据,无序、无下标,键值不可以重复,值可重复;允许用null或者Value作为key值
- 方法:
- (1) put(key,value)
- (2) get(key)
- (3) keySet*
- (4) Collection values
- (5) entrySet*
Set:
public class Demo01 {
public static void main(String[] args) {
// 创建Map
Map<String, String> m1 = new HashMap<>();
// 添加元素
m1.put("1","zzk");
m1.put("2","gyx");
m1.put("3","sb");
m1.put("4","2+3=gyxsb");
System.out.println(m1);
// 删除
m1.remove("1");
System.out.println(m1);
// 遍历
// 1 keySet
Set<String> keyset = m1.keySet();
for (String s : keyset) {
System.out.println(s +"---"+m1.get(s));
}
// 2 entrySet
for (Map.Entry<String, String> entry : m1.entrySet()) {
System.out.println(entry.getKey() +"==="+entry.getValue());
}
// 判断
System.out.println(m1.containsKey("1"));
System.out.println(m1.containsValue("asd"));
}
}
HashSet:
package com.mapDemo.hashMapDemo;
import com.setDemo.hashSetDemo.Person;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* HashMap【重点】:
* 存储结构:哈希表(数组+链表+红黑树)
* 使用 key 可 hashcode 和 equals 作为重复
* 注意:
* (1)默认初始容量是16,默认加载因子0.75
* 方法:
* (1)
*/
public class Demo02 {
public static void main(String[] args) {
HashMap<Student,String> students = new HashMap<>();
students.put(new Student("zzk",20),"第一个学生");
students.put(new Student("nzk",22),"第二个学生");
students.put(new Student("czk",23),"第三个学生");
students.put(new Student("gzk",24),"第四个学生");
students.put(new Student("gzk",24),"第五学生");
System.out.println(students);
// 删除
students.remove(new Student("czk",23),"第三个学生");
System.out.println(students);
// 遍历
// 使用 keySet
for (Student key : students.keySet()) {
System.out.println(key+"===="+students.get(key));
}
// 使用entrySet
Set<Map.Entry<Student, String>> et1 = students.entrySet();
for (Map.Entry<Student, String> sse : et1) {
System.out.println(sse.getKey()+"--------"+sse.getValue());
}
// 判断
System.out.println(students.containsKey(new Student("gzk",24)));
System.out.println(students.containsKey(new Student("g2",24)));
System.out.println(students.isEmpty());
}
}
源码总结:
- HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16。
- 当元素个数大于阈值(16*0.75 =12 ) 时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。
- jdk1.8 当每个链表长度大于8,并且数组元素个数大于64时,会调整为红黑树,目的提高执行效率。
- jdk1.8 当链表长度小于6时,调整成链表。
- jdk1.8 以前,链表时头插入,jdk1.8以后时是尾插入。
HashTable
- JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value
Properties
- Hashtable的子类,要求key和value都是String。通常用于配置文件的读取
TreeMap
- 实现了SortedMap接口(是Map的子接口),可以对key自动排序