3.17java集合终章
HashMap小结
1. Map接口的常用实现类 : HshMap, Hashtable 和Properties
2. HashMap 是 Map接口使用频率最高的实现类 是以key-val对的方式存储数据
3. key 不能重复 ,但是值可以充分, 允许使用null 键 和null 值
- 如果添加相同的key , 则会覆盖原来的key-val , 等同于修改(key不会替换, val会替换)
- 与HashSet一样, 不保证映射顺序, 因为底层是以hash表的方式来存储的
- HashMap没有实现同步, 因此线程不安全
HashMap底层机制以源码(扩容机制和HashSet一样)
- HashMap底层维护了Node类型的数组table, 默认为null
- 当创建对象是, 将加载因子(loadfactor)初始化为0.75
- 当添加key - val时, 通过key的哈希值得到在table的索引. 然后判断该索引处是否有元素, 如果没有元素直接添加. 如果该索引处有元素, 则继续判断该元素的key是否和准备加入的key相等, 如果相等 , 则直接替换val; 弱国不相等需要判断是树结构还是链表结构, 做出相应处理. 如果特甜伽师发现容量不够, 则需要扩容
- 第一次添加, 则需要扩容table容量为16 , 临界值(threshold)为12
- 以后再扩容, 则需要扩容table容两为原来的2倍
总结- 如何选择集合实现类
- 先判断存储类型(一组对象 , 还是一组键值对)
一组对象:Collection接口
允许重复: List
增删多: LinkedList [ 底层维护了一个双向链表]
改查多: ArrayList [ 底层维护Object类型的可变数组]
不允许重复 Set
无序: HashSet 底层是HashMap, 数组,链表,红黑树
排序:TreeSet
插入和取出顺序一直: LinkedHashSet, 数组+双向链表
--------------------------------------------------
一组键值对:Map
键无序: HashMap
键排序: TreeMap
键插入和取出顺序一致: LinkedHashMap
读取文件 Propertise
-----------------------------
一些细节
HashTable基本介绍
- 存放的元素是键值对: K-V
- Hashtable的键和值都不能为null, 否则会抛出NullpointerException
- Hashtable使用方法基本和hashMap一样
- HashTable是线程安全的, hashmap是现成不安全的
Properti 是 HashTable的子类所以也不能放null
----------------------------------------------
collection 的 基本方法
List list = new ArrayList();
list.add("tom");
list.add("smith");
list.add("king");
list.add("milan");
//reverse(List): 反转 List中的元素
Collections.reverse(list);
//shuffle(List): 对 List 集合元素进行随机排序
Collections.shuffle(list);
//sort(List): 根据元素的自然顺序对指定 List 集合元素按升序排序
Collections.sort(list);//按照字符串大小排的
//sort(List, Comparator): 根据指定的 Comparator 产生的顺序对 List集合元素排序
//我们希望按照, 字符串的长度大小进行排序
Collections.sort(list, new Comparator(){
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof String){
//可以加入校验代码
}
return ((String)o1).length() - ((String)o2).length();
}
});
//swap(List, int , int): 将指定list 集合中的 i 处元素和 j 处元素进行交换
Collections.swap(list, 0, 2);
//Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
System.out.println("自然顺序最大元素=" + Collections.max(list));
// Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
// 比如,我们要返回长度最大的元素
// Object maxObject = Collections.max(list, new Comparator() {
// @Override
// public int compare(Object o1, Object o2)
// { return ((String)o1).length() - ((String)o2).length();
ArrayList dest = new ArrayList();
//为了完成一个完整拷贝, 我们需要献给dest 复制, 大小和list.size()一样
for(int i = 0; i<list.size(); i++){
dest.add("");
}
//拷贝
Collections.copy(dest, list);
System.out.println(dest);
//boolean replaceAll(List list, Object oldVal, Object newVal):
// 使用新值替换 List 对象的所有旧值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix