title: 我的第一篇博客 date: 2024-05-17 20:36:01 tags: [学java(基础)]
集合
体系图一览
集合相对于数组的优点
实际开发根据业务逻辑选择
-
一组对象(单列)
-
一组键值对(双列)
Collection接口
List: 允许重复
LinkList/ArrayList/Vector
-
增删多:用 LinkList (底层维护了一个双向链表), 通过改变pre和next指向即可实现Node的增删;
-
改查多:用ArrayList/Vector(底层结构是可变数组), 进一步选择
Set: 不允许重复
1. HashSet
-
无序: HashSet[底层是HashMap,维护了一个哈希表(数组+链表+红黑树)] 添加元素步骤:
-
先得到hash值转换成索引值,找到对应储存位置
-
没有元素直接加入, 有则调用equals比较
-
hashcode()+equals()均可被重写, 由程序猿自己制定比较规则
-
扩容机制:
-
2.TreeSet
-
排序: TreeSet
-
底层为MapSet(key即为穿入的对象, value是PRESENRT占位符)
-
创建TreeSet时, 使用无参构造器则使用默认的Comparator, 亦可重写比较器, 制定比较规则
TreeSet treeSet = new TreeSet(); TreeSet treeSet = new TreeSet(new Comparator() { @Override public int compare(Object o1, Object o2) { //下面 调用 String 的 compareTo 方法进行字符串大小比较 //如果要求加入的元素,按照长度大小排序 //return ((String) o2).compareTo((String) o1); return ((String) o1).length() - ((String) o2).length(); }
-
3. LinkedHashSet
-
插入和取出顺序一致: LinkedHashSet(维护了一个(数组[存放]+双向链表[维持顺序]))
去重机制比较
-
HashSet:hashcode()得到hash值从而得到索引, 用equals()便利比较
-
用Comparator实现的compare方法比较, 该方法返回正数,0, 负数, 为0表示重复, 不添加
-
Map接口
1.HashMap
-
键无序: HashMap
-
底层是:哈希表(JDK7: 数组+链表)(hJDK8: 数组+链表+红黑树)
-
扩容机制:
-
第1次添加,则需要扩容tabl容量为16,临界值(threshold)为12(16*0.75)
-
以后再扩容,则需要扩容tab1e容量为原来的2倍(32),临界值为原来的2倍,即24
以次类推.
-
在Java8中,如果一条链表的元素个数超过TREEIFY THRESHOLD(默认是8),并且table的大小>= MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树)
-
-
2.TreeMap
-
键排序: TreeMap(定制排序, 原理见TreeSet)
3.LinkedhashMap
-
键插入和取出的顺序一致:LinkedhashMap(原理见LinkedhashSet)
4.Properties
-
读取文件: Properties
遍历方法
-
先取出 所有的 Key , 通过 Key 取出对应的 Value, 再进行遍历
Set keyset = map.keySet();
-
把所有的 values 取出, 这里可以使用所有的 Collections 使用的遍历方法
Collection values = map.values();
-
通过 EntrySet 来获取 k-v(以增强for循环为例) 原理: Map里面的Node(Node实现了Map.Entry<K, V>)转换成Entry, 再放到EntrySet里面去, 然而Map.Entry提供了方法getKey()和getValue()
Set entrySet = map.entrySet();// EntrySet<Map.Entry<K,V>> //(1) 增强 for System.out.println("----使用 EntrySet 的 for 增强(第 3 种)----"); for (Object entry : entrySet) { //将 entry 转成 Map.Entry Map.Entry m = (Map.Entry) entry; System.out.println(m.getKey() + "-" + m.getValue()); }
Collections工具类
-
Collections是一个操作Set, List, Map等集合的工具类
-
提供了一系列静态的方法对集合元素进行排序, 查询等
练习题踩坑
(结果输出4个对象)
-
hashcode()+equals()均被重写, 因此只用根据id 和name判断
-
p1.name更改后(p1为引用数据类型, 因此set中的p1也会发生改变), 在经hashcode()计算后,在数组中位置发生变化(假设变到索引为3的位置), 因此无法删除p1
-
set.add(new Person("1001", "CC")), 经过hashcode()计算后在索引为3的位置, 自然而然可以加入
-
set.add(new Person("1001", "AA")),经过计算后在索引为1的位置,与修改后的p1不相同, 因而任可以加入
本文截图均来自于【零基础 快速学Java】韩顺平 零基础30天学会Java