JAVA集合框架体系

集合框架 -- 容器 包容
JAVA集合框架中的类可以用于存储多个队系那个,还可用于保存具有映射关系的关联数组。

Collection接口

单列数据集合。存储一个一个的数据。

# 常用方法:增
add(E obj) --> 加的是一个
addall(Collection other) --> 加基本单元,五个小单元组成的中单元 放进去也是5个小单元。
# 常用方法:判断
size()
isEmpty()
contains(Object obj) --> 调用equals方法比较
containsAll(Collection coll)
equals(Object obj) 【很少用】
# 常用方法:删
clear()
remove(Object obj) --> 调用equals方法
removeAll(Collection coll)
retainAll(Collection coll) --> 取交集
# 常用方法:变
toArray() --> 返回包含当前集合中所有元素的数组【集合转换为数组】
hashCode() --> 获取集合对象的哈希值
iterator() --> 返回迭代器,用于集合遍历

【数组转换为集合】Arrays的asList方法(只能放对象,不能放基本数据类型)

注:自定义的类写入集合,必须重写equals方法。

迭代器

iterator 迭代器接口,本身并不提供存储对象的能力,主要用于遍历 Collection 中的元素。
接口中常用的方法 iterator()\ next()\ hasNext()
遍历时注意要先判断后面空不空,再去遍历,否则会报错。【注意指针指的是第一个元素的前一个,hasnext一次 指针移动一次,每次操作的都是同一个对象】
使用迭代器可以删除集合的元素,但要使用iterator的remove方法,不能用集合对象的remove方法。【可以实现按照指定条件进行删除的功能】

增强for循环 【foreach】

for(元素的数据类型 局部变量 : Collection集合或数组){
操作
}

内部原理是迭代器,注意循环里的是临时变量 可能不会生效。

List子接口 -- 动态数组

增、删、改、查、插、长度和遍历

# 获取
get(int index)
subList(int index, int toIndex)
indexOf(object obj)
lastIndexOf(Object obj)
# 插入
add(int index, Object ele)
addAll(int index, Collection eles)
# 删除和替换
remove(int index)
set(int index, Object ele)

实现类

  1. ArrayList:线程不安全,效率高,使用频率高,底层是数组 obj
  2. Vector:线程安全,效率低,但不怎么用,底层是数组 obj。慢,尽量避免使用
  3. LinkedList:底层采用链表(双向链表)结构存储数据决定,便于增删。
addFirst(Object obj)
addLast(Object obj)
getFirst()
getLast()
removeFirst()
removeLast()

Set子接口

使用频率较低,一般用来过滤重复数据

实现类

HashSet

底层使用HashMap(数组 + 单向链表 + 红黑树)
集合元素可以是null,不是线程安全的,不能保证元素的排列顺序。
判断元素相同的标准 -- hashcode -- equals【所以这两个方法一定要重写!】

添加元素的过程

1.向该集合中存入元素时,先调用该对象的hashCode方法得到该对象的 hashCode 值,然后根据该值通过某个散列函数决定该对象在 HashSet 底层数组中的存储位置。
2.如果该位置没有元素,则添加成功。
3.如果有元素则继续比较:①两个元素的hashCode值不相等,添加成功【存在底层数组中】; ②两个元素的hashCode值相等,继续调用equals方法;结果为false 添加成功【存在链表中】,结果为 true,添加失败。

重写hashCode()方法的基本原则:同一个对象多次调用该方法返回的是同一个值,两个对象的equals方法返回值为true时,这两个对象的hashCode方法返回值也应当一样。

LinkedHashSet

HashSet的子类,在原有基础添加双向链表记录添加顺序,可以按照元素顺序遍历。

TreeSet

底层使用红黑树结构存储数据,可以按照添加的元素的制定属性的大小进行遍历。
两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。
· 自然排序:调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。(要想放入TreeSet,必须实现Comparable接口和对应的方法compareTo)
· 定制排序:如果所属的类没有实现Comparable接口,或不希望按照升序的方式排列或希望按照其他属性大小进行排列。此时需要重写comapre方法

Map接口

存储具有映射关系键值对的集合,属于一种一一对应的关系。键不能重复,所以使用set来存储键。值采用Collection
Map中的 key 和 value可以是任何引用类型的数据,但常用类 String 作为Map的键。

# 添加
put(Object key, Object value)
putAll(Map m)
# 删除
remove(Object key) --> 移除指定key的key-value对,并返回value
clear()
# 查询
get(Object key)
containsKey(Object key)
containsValue(Object value)
size()
isEmpty()
equals(Object obj)
# 元视图 用来遍历
keySet() --> 返回所有 set 构成的 Set 集合
values() --> 返回所有 values 构成的 Collection 集合
entrySet() --> 返回所有 key-value 对构成的 Set 集合

实现类

HashMap

使用频率最高,线程不安全,允许添加 null 键和 null 值。存储数据采用的是哈希表结构,底层使用一维数组+单向链表+红黑树进行键值对的存储。
判断两个key相等的标准是:两个key的hashCode值相等,通过equals方法返回true。
判断两个value相等的标准是:两个value通过equals方法返回true。

LinkedHashMap

存储数据采用的是哈希表结构+链表结构,在HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的先后顺序,可以保证遍历元素时与添加的顺序一致。所在的键为set 所以一定要重写hashcode和equals方法。

TreeMap

TreeSet底层使用红黑树结构
TreeMap的key排序

  • 自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException。
    – 定制排序:创建 TreeMap 时,构造器传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key
    实现 Comparable 接口。
    TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。

Hashtable

Map的古老实现类,线程安全。实现原理与HashMap相同,功能相同。底层都使用哈希表结构(数组+单向链表),查询速度快。
不允许使用 null 做为 key 或 value。

Properties

该类是Hashtable的子类,该对象用于处理属性文件。
属性文件里的 key、value 都是字符串类型,所以 Properties 中要求 key 和 value 都是字符串类型。
存取数据时建议使用 setProperty(String key, String value) 方法和 getProperty(String key) 方法。

【数据封装,实现数据和代码解耦,省去重新打包的步骤】

Collections工具类

参考操作数组的工具类,Collections Arrays 是一个操作set、list和Map等集合的工具类。

常用方法

提供静态方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、实现同步控制等静态方法。

# 排序
reverse(List)
shuffle(List)
sort(List)
sort(List, Comparator)
swap(List, int, int)
# 查找
max(Collection)
min(Collection, Comparator)
min(Collection)
min(Collection, Comparator)
# 复制、替换
# 添加


posted @ 2023-09-11 18:52  芋圆院长  阅读(2)  评论(0编辑  收藏  举报