- HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16
- 当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍!目的是减少调整元素的个数
- jdk1.8 当每个链表长度大于8,并且元素个数大于等于64时,会调整为红黑树,目的提高执行效率
- jdk1.8 当链表长度小于6时,调整成链表
- jdk1.8 以前,链表时头插入,jak1.8以后是尾插入!
- HashMap的存储结构是:哈希表(数组+链表+红黑树)
- HashMap :JDK1.2版本,线程不安全,运行效率快,允许用null作为key或者是value
- 创建Student类来给后面调用
package com.Map.HashMapClass;
public class Student {
private String name; //姓名
private int id; //学号
//封装属性
public void setId(int id) {
this.id = id;
}
public int getId(){
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//无参构造器
public Student(){
}
//有参构造器
public Student(String name,int id){
this.name = name;
this.id = id;
}
@Override
public String toString() { //重写toString方法
return "Student{" +
"name='" + name + ''' +
", id=" + id +
'}';
}
}
- 创建HashmapDemo01类进行比较测试
package com.Map.HashMapClass;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashmapDemo01 {
public static void main(String[] args) {
//创建一个hashmap集合
HashMap hashMap = new HashMap();
//创建学生
Student s1 = new Student("张飞",101);
Student s2 = new Student("关羽",102);
Student s3 = new Student("曹操",103);
//添加元素
hashMap.put(s1,"广西");
hashMap.put(s2,"广东");
hashMap.put(s3,"上海");
System.out.println("当前元素个数为:"+hashMap.size());
System.out.println(hashMap.toString());
//遍历数据
//1.1通过增强for循环
System.out.println("---------------1.通过keyset循环-----------------");
for (Student key:hashMap.keySet()
) {
System.out.println(key.toString()+"======="+hashMap.get(key));
}
System.out.println("---------------2.通过Entry键值对循环-----------------");
for (Map.Entry key2:hashMap.entrySet()
) {
System.out.println(key2);
}
//判断
System.out.println(hashMap.containsKey(s1)); //存在 返回true
System.out.println(hashMap.containsValue("上海"));
}
}
- 结果图
- 实现了SortedMap接口(SortedMap是map的子接口),可以对key自动排序!
- 存储结构:红黑树
使用代码进行演示
package com.Map.TreeMapclass;
import com.Map.HashMapClass.Student;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreemapDemo01 {
public static void main(String[] args) {
//创建TreeMap集合
TreeMap treeMap = new TreeMap<>(new Comparator() {
@Override //需要使用比较器,因为学生类不能直接转成Comparable。因为Treemap的存储结构是红黑树,需要制定一个规则进行比较!
// 所以需要使用Comparator比较器,才可正常遍历
public int compare(Student o1, Student o2) {
int n = o1.getId()-o2.getId(); //使用学号进行比较
return n;
}
});
//1、添加元素
Student s1 = new Student("张飞",101);
Student s2 = new Student("关羽",102);
Student s3 = new Student("曹操",103);
Student s4 = new Student("小猴子",100);
treeMap.put(s1,"广西");
treeMap.put(s2,"玉林");
treeMap.put(s3,"河池");
treeMap.put(s4,"广东");
System.out.println("元素个数:"+treeMap.size());
System.out.println(treeMap.toString());
//2、遍历元素
//2.1使用KeySet来遍历元素
System.out.println("-------------2.1使用KeySet来遍历元素---------------");
for (Student sss: treeMap.keySet()
) {
System.out.println(sss+treeMap.get(sss));
}
//2.2使用EnkeySet来遍历元素
System.out.println("-------------2.2使用EnkeySet来遍历元素---------------");
for (Map.Entry entry:treeMap.entrySet()
) {
System.out.println(entry);
}
//3、删除元素
treeMap.remove(s1);
System.out.println("删除后元素个数:"+treeMap.size());
}
}
- 结果图
三、Colletions工具类总结:需要注意的就是,在使用Treemap集合的时候,由于Treemap的存储结构是红黑树,所以在使用Student类作为key遍历的时候,不能直接进行遍历,因为需要一个比较结果,所以必须要调用到比较器,也就是Comparator,否则会提示异常!
- 概念:集合工具类。定义了除了存取以外的集合常用方法
- 方法:
- public static void reverse(List> list) //反转集合中的元素的顺序
- public static void shuffle(List> list) //随机重置集合元素的顺序
- public static void sort(List list) //升序排序(元素类型必须实现Comparable接口)
- 使用代码测试
package com.Map.CollectionsClass;
import java.util.*;
public class Collectionscalss {
public static void main(String[] args) {
//创建Set集合
List list = new ArrayList<>();
list.add(220);
list.add(20);
list.add(5);
list.add(30);
list.add(150);
System.out.println("排序之前:"+list.toString());
//sort排序
Collections.sort(list); //使用Collections工具类对list集合进行排序。
System.out.println("排序之后:"+list.toString());
//shuffle打乱顺序
Collections.shuffle(list); //重新排序,随机排序,用于重新洗牌
System.out.println("随机重置集合中的数值:"+list);
//copy复制
List dest = new ArrayList<>();
for (int i = 0; i < list.size(); i++) { //需要给dest集合初始化一个长度
dest.add(0);
}
Collections.copy(dest,list);
System.out.println("复制后的数值:"+dest);
//reverse反转
Collections.reverse(list);
System.out.println("反转之后"+list);
//数组转成集合
System.out.println("-----------数组转成集合------------");
String[] names = {"张三","李四","王五"};
//转换成集合后,该集合是一个受限集合,不能添加和删除
List list2 = Arrays.asList(names);
//list2.remove("张三"); 不能被删除!也不能被添加!
System.out.println("将数组转成集合之后:"+list2);
}
}
结果图:
总结:需要注意的是,在将基本类型的数组转换成集合的时候,需要使用包装类型!否则无法正常使用!
注:文章仅做个人学习日记,不做学习建议,学习来源:千峰教育



