Map接口的实现类:双列数据,存储key-value
一、HashMap:ket->Set类型,value->Collection类型,Entry->Set类型
1.首先HashMap是线程不安全的,效率高,key和value可以存储null
2.底层实现:
jdk1.7中:数组+链表
jdk1.8中:数组+链表+红黑树
当new HashMap时,首先会创建一个长度为16的Entry数组。调用put()方法时,会先调用被添加元素所属类的hashCode()方法获得一个hash值,将hash值根据相应的算法取得数组中对应的下标。若数组中下标无元素,则添加成功。情况二:反之,数组下标有一个或者多个元素,则依次判断被添加元素的hash值是否与下标元素中的hash值相等,若相等则调用被添加元素的equals()方法判断是否相同,若相同则将被添加元素中的value替换原来的value。若不相同,则以链表的形式添加成功。
put()方法的扩容机制,当超过临界值(16*0.75)并且次位置上没有元素时,选择扩容,默认扩容为原来的2倍。
在jdk1.7中,情况二:被添加元素添加进数组中并指向原先元素
在jdk1.8中,情况二:原先元素指向被添加元素
在jdk1.8中:①数组名改为Node②new HashMap()并不会定义数组的长度,当调用put()方法时,才去声明数组的长度③当链表的长度>8并且数组的长度>64时,将链表改为红黑树存储,提高查询效率。
二、linkedHashMap:是HashMap的子类,在HashMap的基础,底层使用的双向链表,一对引用分别指向前一个添加元素和后一个添加元素。
特点:可以按照添加元素的顺序进行遍历,适用于遍历较多的场景
三、TreeSet:底层实现是红黑树,可以按照key进行自然排序或者自定义排序
四、Hashtable:线程安全的,效率较低,不可以存null
五、Properties:Hashtable的子类,用于配置文件,key和value都是String类型
六、HashMap的常用方法
1.增 put(Object key,Object value)
HashMap hashMap=new HashMap();
hashMap.put("abc", 123);
hashMap.put("def", 456);
hashMap.put("jkl", 789);
hashMap.put("uuu", 111);
2.删 remove(Object key) / remove(Object value)
HashMap hashMap=new HashMap();
hashMap.put("abc", 123);
hashMap.put("def", 456);
hashMap.put("jkl", 789);
hashMap.put("uuu", 111);
//hashMap.remove("abc");
hashMap.remove("abc", 123);
3.改 put(Object key,Object value)
@Test
public void test1() {
// HashMap中key-value可以存放null,Hashtable不行
HashMap hashMap=new HashMap();
// hashMap.put(null, null);
Hashtable table=new Hashtable();
// table.put(null, null);
//1.增 put(Object key,Object value) putAll(Map map)
hashMap.put("abc", 123);
hashMap.put("def", 456);
hashMap.put("jkl", 789);
hashMap.put("uuu", 111);
System.out.println(hashMap);
//2.删 remove(Object key) remove(Object key,Object value)
// hashMap.remove("abc");
hashMap.remove("abc", 123);
System.out.println(hashMap);
//3.改 put(Object key,Object value)
hashMap.put("def", 888);
4.查 get(Object key)
// HashMap中key-value可以存放null,Hashtable不行
HashMap hashMap=new HashMap();
// hashMap.put(null, null);
Hashtable table=new Hashtable();
// table.put(null, null);
//1.增 put(Object key,Object value) putAll(Map map)
hashMap.put("abc", 123);
hashMap.put("def", 456);
hashMap.put("jkl", 789);
hashMap.put("uuu", 111);
System.out.println(hashMap);
//2.删 remove(Object key) remove(Object key,Object value)
// hashMap.remove("abc");
hashMap.remove("abc", 123);
System.out.println(hashMap);
//3.改 put(Object key,Object value)
hashMap.put("def", 888);
System.out.println(hashMap);
//4.查 get(Object key)
System.out.println(hashMap.get("def"));
5.长度 size()
System.out.println(hashMap.size());
6.遍历: keySet values entrySet
for(Object set:hashMap.keySet()) {
System.out.print(set+"t");
}
System.out.println();
for(Object value:hashMap.values()) {
System.out.print(value+"t");
}
System.out.println();
for(Object o:hashMap.entrySet()) {
System.out.print(o+"t");
}
System.out.println();
for(Object key:hashMap.keySet()) {
Object value=hashMap.get(key);
System.out.print(key+"="+value+"t");
}
7.containsKey / containsValue
// containsKey containsValue
System.out.println(hashMap.containsKey("def"));
System.out.println(hashMap.containsValue(789));
七、 Collections工具类:用于处理Collection接口的实现类和Map接口的实现类
copy方法说明:
@Test
public void test2() {
//错误写法
List list1=new ArrayList();
list1.add(123);
list1.add(456);
list1.add(789);
List list2=new ArrayList();
Collections.copy(list2, list1);
System.out.println(list2);
}
@Test
public void test2() {
//正确写法
List list1=new ArrayList();
list1.add(123);
list1.add(456);
list1.add(789);
// List list2=new ArrayList();
List list2=Arrays.asList(new Object[list1.size()]);
Collections.copy(list2, list1);
System.out.println(list2);
}
@Test
public void test3() {
List list=new ArrayList();
for(int i=0;i<10;i++) {
list.add((int)(Math.random()*(100-1)+1));
}
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
@Test
public void test4() {
Comparator cp=new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student && o2 instanceof Student) {
Student s1=(Student)o1;
Student s2=(Student)o2;
if(s1.getScore()>s2.getScore()){
return -1;
}else if(s1.getScore()



