一、JCF概论
-
JCF的集合接口是Collection,包括add添加,contains包含,remove删除,size数据元素个数,iterator迭代器
-
JCF的迭代器接口是Iterator,包括hasNext是否有下一个元素,next获取下一个元素,remove删除某个元素
-
JCF主要的数据结构实现类:
列表(List,ArrayList,LinkedList)
集合(Set,HashSet,LinkedHashSet)
映射(Map,HashMap,TreeMap,LinkedHashMap) -
JCF的主要算法(工具)类:
Arrays:对数组进行查找和排序等操作
Collections:对Collection及其子类进行排序和查找操作
二、List
-
List:列表
- 有序的Collection
- 允许出现重复元素
- 可嵌套:{1,2,3,{5,2},1,3}
-
List的主要实现:
-
ArrayList(非同步)
- 以数组实现的列表,不支持同步
- 利用索引位置可以快速定位访问
- 不适合指定位置的插入、删除操作
- 适合变动不大、主要用于查询的数据
- 和Java数组相比,其容量是可动态调整的
- ArrayList在元素填满容器时会自动扩充容器大小的50%
- 使用for循环遍历速度最快
-
LinkedList(非同步)
- 以双向链表实现的列表,不支持同步
- 可被当做堆栈、队列和双端队列进行操作
- 顺序访问高效,随机访问较差,中间插入和删除高效
- 适用于经常变化的数据
- 使用for循环遍历速度最快,使用随机访问最慢(两者速度相差三个数量级)
-
Vector(同步)
- 用法同ArrayList一致
- Vector同步,适合在多线程下使用
- 原先不属于JCF框架,属于Java最早的数据结构,性能较ArrayList差一些
- 官方文档建议在非同步情况下优先使用ArrayList
-
三、Set
-
Set:集合
- 确定性:对任意一个对象都能判断其是否属于某一个集合
- 互异性:集合内每个元素都是不相同的,注意是内容互异
- 无序性:集合内的顺序无关
- Set与高中数学中所学的集合别无二致
-
Set的主要实现:
-
HashSet(基于散列函数的集合,无序,不支持同步)
- 基于HashMap实现的,可容纳null元素,不支持同步
- 使用同步:
Set s = Collections.synchronizedSet(new HashSet(……));
- 使用同步:
- add 添加一个元素
- clear 清除整个HashSet
- contains 判断是否包含某个元素
- remove 删除某个元素
- size 大小
- retainAll 计算两个集合的交集
- 基于HashMap实现的,可容纳null元素,不支持同步
-
LinkedHashSet(基于散列函数和双向链表的集合,默认按插入顺序排序,不支持同步)
- 继承HashSet,也是基于HashMap实现的,可容纳null元素,不支持同步
- 使用同步:
Set s = Collections.synchronizedSet(new LinkedHashSet(……));
- 使用同步:
- 方法与HashSet基本一致(add、clear、contains、remove、size)
- 通过一个双向链表维护来插入顺序
- 继承HashSet,也是基于HashMap实现的,可容纳null元素,不支持同步
-
TreeSet(基于树结构的集合,默认按元素大小排序,不支持同步)
- 基于TreeMap实现的,不可以容纳null元素,不支持同步
- 使用同步:
Set s = Collections.synchronizedSet(new LinkedHashSet(……));
- 使用同步:
- 方法与前二者一致(add、clear、contains、remove、size)
- 根据compareTo方法或指定Comparator排序
- 基于TreeMap实现的,不可以容纳null元素,不支持同步
-
-
Set总结:
-
HashSet、LinkedHashSet、TreeSet的元素都只能是对象
-
HashSet、LinkedHashSet判断元素重复的原则:
- 判断两个元素的hashCode返回值是否相同(T/F)
- 若hashCode相同,则判定equals方法(T/F)
- 注:hashCode和equals方法所有类都有,因为Object类有;添加到HashSet、LinkedHashSet中的元素需要改写hashCode、equals、toString三个方法,否则集合判定会出现异常
-
TreeSet判断元素重复的原则:
- 添加到TreeSet中的元素需要继承Comparable接口,并改写CompareTo方法(Java四个重要接口:Comparable可比较的,Clonable可克隆的,Runnable可线程化的,Serializable可序列化的)
- 比较两个元素的CompareTo方法
-
四、Map
-
Map:映射
- 数学定义:两个集合之间的元素对应关系
- 一个输入对应一个输出
- 说白了就是键值对(K-V对)
-
Java中的Map
-
Hashtable(同步、慢、数据量小,较为过时)
- K-V对,K和V都允许null
- 同步,多线程安全
- 无序的
- 适合小数据量
- 主要方法:clear、contains/containsValue/containsKey、get、put、remove、size
- 遍历:Entry迭代器、KeySet迭代器、Enumeration迭代器(三者相差不大,Enumeration稍快)
-
HashMap(不支持同步、快、数据量大,当下较流行)
- K-V对,K和V都允许null
- 不同步,多线程不安全
- 使用同步:
Map m = Collections.synchronizedMap(new HashMap(……));
- 使用同步:
- 无序的
- 主要方法:clear、containsValue/containsKey、get、put、remove、size
- LinkedHashMap
- 基于双向链表并且维持插入顺序的HashMap
- TreeMap
- 基于红黑树的Map,可以根据key的自然顺序或者compareTo方法进行排序输出
-
Properties(同步、文件形式、数据量小)
- 继承于Hashtable
- 唯一一个可以将K-V对保存进文件中的类
- 适用于数据量较少的文件
- 主要方法:从Hashtable继承来的方法 + load文件加载、store文件写入、getProperty获取属性、setProperty设置属性
-
五、JCF工具类
-
工具类概述:
- 不存储数据,而是在数据容器上实现高效操作(包括排序和搜索)
-
Arrays类:处理对象是数组
- 排序:对数组进行排序,sort/parallelSort
- 查找:从数组中查找一个元素,binarySearch
- 批量拷贝:从源数组批量复制元素到目标数组,copyOf
- 批量赋值:对数组进行批量赋值,fill
- 等价性比较:判定两个数组的内容是否相同,equals
-
Collection类:处理对象是Collection及其子类
-
排序:对List进行排序,sort
-
搜索:从List中搜索元素,binarySearch
-
批量赋值:对List批量赋值,fill
-
最大、最小:max、min
-
反序:将List反序排列,reverse
-
若是对对象的比较则需要让对象实现Comparable接口(修改对象类的compareTo方法)
- compareTo方法:> 返回 1、== 返回 0、< 返回 -1,Arrays和Collections在进行对象sort时自动调用该方法
-
若对象类不可修改,则新建Comparator比较器(需要实现comparator接口)
- 重写compare方法,> 返回 1、== 返回 0、< 返回 -1,Comparator比较器将作为参数提交给工具类的sort方法
-
-
注意:
sort方法默认升序排列