集合框架

Java集合框架体系

java.util.Collection:存储一个一个的数据

  • 子接口:List:存储有序、可重复的数据(“动态”数组)
    • ArrayList(主要实现类)、LinkedList、Vector
  • 子接口:Set:存储无序、不可重复的数据(中学数学中的集合)
    • HashSet(主要实现类)、LinkedHashSet、TreeSet

java.util.Map:存储一对一对的数据(key-value键值对,类似于中学数学的函数)

    • HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

Collection接口

常用方法

Collection中有15个常用的方法,其实现类可以使用

集合和数组的转换

集合–>数组toArray

数组–>集合调用Arrays的静态方法asList

向Collection中添加元素的要求:元素所属类一定要重写equals方法

因为Collection的相关方法(contains、remove)在使用时要调用equals方法

遍历

iterator迭代器:

iterator迭代器常用来遍历集合元素

1
2
3
while(iterator.hasNext()){
System.out.println(iterator.next());//next()指针下移,将下移以后的元素返回
}

(补充)增强for循环:

作用:遍历数组和集合

格式:

1
2
3
for(要遍历的集合或数组的元素类型 临时变量 : 要遍历的集合或数组变量){
操作临时变量输出
}

说明:

  • 针对于集合来讲,增强for循环底层仍使用的是迭代器
  • 增强for循环执行的过程中,是将集合或数组中的元素依次赋值给临时变量,注意,循环体中对临时变量的修改,可能不会导致原有集合或数组元素的修改

List接口

常用方法

第一部分:

Collection中声明的15个方法

第二部分:因为LIst是有序的,所以会增加一些索引方法

常用方法大致可分为:增、删、改、查、插、长度、遍历

方法声明 说明
add(Object ele) 添加ele元素
addAll(Collection eles) 将eles中的所有元素添加进来
remove(Object ele) 删除指定索引的元素,并返回此元素
remove(int index) 删除指定索引的元素,并返回此元素
set(int index , Object ele) 设置指定索引位置的元素为ele
get(int index) 获取指定索引元素
add(int index , Object ele) 在指定索引插入ele元素
addAll(int index , Collection eles) 从指定索引开始将eles中的所有元素插入进来
size() 获取长度
interator() 遍历
增强for循环 遍历

List接口不同实现类的对比

使用情况 线程安全性 数据结构 添加、查找效率 插入、删除效率
ArrayList 主要实现类 线程不安全 Object[]
LinkedList ——— ——— 双向链表
Vector 基本被抛弃 线程安全 Object[]

Set接口

相较于List、Map,Set的使用频率相对较低。常用来过滤重复数据。

理解:

  • 无序性:

    • 与添加的元素的位置有关,不像ArrayList是依次紧密排列的。这里是根据添加元素的哈希值,计算的其在数组中的存储位置,表现为无序性;

    • 不等于随机性;

    • 不等于添加的元素的顺序和遍历元素的顺序不一致。

  • 不可重复性:

    • 添加到Set中的元素是不能相同的。比较的标准,需要根据hashCode()得到的哈希值以及equals方法得到的boolean型的结果。哈希值相同且equals方法返回true则相同。

添加到HashSet和LinkedSet的元素的要求:重写equals和hashCode,二者结果尽量保持一致性。

TreeSet实现类

添加元素的要求:

  • 添加到TreeSet中的元素必须是同一个类型的对象;
  • 添加的元素需要考虑排序。

注意:

  • 判断数据相同的标准,不再是hashCode和equals方法,也就意味着不用再重写这两个方法;
  • 比较元素大小或者是否相同的标准就是自然排序或定制排序中comparaTo或compare的返回值。如果相等,则认为两个对象相等,则后一个相等的元素就不能添加到TreeSet中。

常用方法

即为Collection中声明的15个抽象方法,没有新增的方法。

Set接口不同实现类的对比

关系 数据结构 特点
HashSet 主要实现类 Hashmap ———
LinkedHashSet HashSet的子类 Hashmap+双向链表 便于频繁的查询操作
TreeSet ——— 红黑树 可按元素的指定属性的大小顺序遍历

Map接口

HashMap中元素的特点

  • HashMap中的所有key彼此之间是不可重复的、无序的。所有的key就构成一个Set集合。–>key所在的类要重写hashCode和equals

  • HashMap中的所有value彼此之间是可重复的、无序的。所有的value就构成一个Collection集合。–>value所在的类要重写equals

  • HashMap中的一个key-value,就构成了一个entry。

  • HashMap中的所有entry彼此之间是不可重复的、无序的。所有的entry就构成一个Set集合。

TreeMap实现类

TreeMap和TreeSet底层接口一致,使用上只要将TreeSet中元素的地位替换为TreeMap中的Key的地位即可。也就是说,对TreeSet元素的要求都更换为对key的要求。

常用方法

长度 遍历
put(Object key,Object value) Object remove(Object Key)返回value put(Object key, Object value) Object get(Object key)获取key对应的value size() 遍历key集:Set keySet()
putAll(Map m) putAll(Map m) 遍历value集:Collection values()
遍历entry集:Set entrySet()

Map接口及其实现类的对比

关系 线程安全性 效率 健壮性 数据结构 特点
HashMap 主要实现类 线程不安全 好,可以添加null 数组+单向链表+红黑树 ———
LinkedHashMap HashMap子类 ——— ——— ——— HashMap+双向链表 便于频繁的遍历操作
TreeMap ——— ——— ——— ——— 红黑树 可按元素的指定属性的大小顺序遍历
Properties ——— ——— ——— ——— ——— 键值对是String类型
Hashtable 类似HashMap,但是废弃 线程安全 不好,不可添加null 数组+单向链表 ———

Collections工具类

Collections是一个操作List、Set、Map等集合的工具类—>v162