每日总结day02

本文总结了Java集合的继承体系,包括单例集合和双例集合。介绍了Collection接口实现类的遍历方式,以及List、Set集合的特点和常见实现类。还阐述了集合元素排序方法,如自然排序和比较器排序。最后说明了Map集合的存储方式和遍历方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合总结:

 

单例集合继承体系:                              双例集合继承体系:


Collection<T>接口继承了Iterable<T>接口所以它的实现类可以使用迭代器进行集合元素进行遍历或者使用增强for循环进行集合元素遍历因为增强for循环的底层也是由迭代器实现的也就是说只有实现了Iterable<T>接口的类才能使用增强for循环.

迭代器通过hasNext()方法的返回值为循环判断条件(判断指针下面是存在元素),然后使用next()方法取出元素并把指针下移一位.

注意:通过迭代器遍历集合时不能使用集合的方法增加或删除集合元素不然会抛出异常ConcurrentModificationException(并发修改异常),同理增强for循环同样会抛出异常ConcurrentModificationException,解决方案是通过迭代器的删除方法删除

List<E>集合的特点是:

  1. 有序:即存取有序,存的顺序是什么取的顺序就是什么
  2. 有索引:即集合元素有索引值,可以通过索引获取集合元素也就是是说可以通过索引的方式遍历集合
  3. 可重复:即集合元素可以重复
  • ArrayList:底层通过数组的方式实现的所以具有数组的特点即查询快,增删慢
  • LinkedList:底层通过链表的方式实现的所以具备链表的特点即查询慢,增删快,同时拥有特有的对头尾元素进行增删的方法
  • Vector:被ArrayList取代了

Set<E>集合的特点是:

  1. 无序:即存取无序,存的顺序是什么取的顺序不一定是存的顺序
  2. 无索引:没有索引不能通过索引获取集合元素也不能通过索引遍历集合
  3. 不可重复:即集合元素唯一性,通过重写hashCode()和equals()方法保证元素唯一性
  • HashSet:底层通过HashMap实现,通过重写hashCode()和equals()方法保证元素唯一性
  • LinkedHashSet:底层是链表所以具备链表的特性存取有序,它是Set集合唯一一个存取有序的类
  • TreeSet:底层是二叉树结构,可以实现排序(自然排序或比较器排序)

集合元素排序:

  1. 自然排序:实现Comparable接口里的compareTo()方法
  2. 比较器排序:一般通过Comparator接口的匿名类重写compare()方法
  • 结论:1-2升序,2-1降序

Collections的sort排序方法的实现:

public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }


default void sort(Comparator<? super E> c) {
        //把集合用toArray()方法转成Object数组
        Object[] a = this.toArray();
        //然后通过Arrays的sort()方法进行排序
        Arrays.sort(a, (Comparator) c);
        //最后通过迭代器将排序好的Object数组依次添加进集合
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

通过源码可以得知:

  1. Collections的sort()排序方法其实是使用的List接口中的默认sort()方法
  2. 而List接口中的默认sort()方法底层又是把集合转数组使用数组中的sort()方法排序,排序规则是通过传入的Comparator比较器对象实现的
  3. 最后通过迭代器把排序好的数组遍历添加进集合

Map<E>接口没有继承Iterable<T>接口所以它的子类不能通过迭代器遍历集合同理也不能使用增强for循环,它存储数据是通过键值映射方式存储的,拥有唯一的Key,Value可以重复

Map<K,V>集合的特点:

  • 遍历方式:
    1. 键找值:因为实现Iterable<T>接口所以只能间接使用迭代器对map集合进行遍历
      1. 首先将map集合的key通过keySet()方法映射到一个Set集合
      2. 再使用Set集合的迭代器对key进行迭代
      3. 迭代过程中使用get(Object key)方法得到key所映射的value
    2. 键值对:通过Entry键值对对象进行遍历,该对象封装了map元素的键值映射关系
      1. 首先将map元素的映射关系通过entrySet()方法返回一个存储Entry键值对对象的Set集合
      2. 再使用Set集合的迭代器对Entry键值对对象进行迭代
      3. 最后使用Entry键值对对象的getkey(),getValue()获取键和值
  • HashMap<K,V>:由哈希表实现数据存储,存取无序
  • LinkedHashMap<K,V>:由哈希表和链表的方式存储,存取有序
  • TreeMap:由二叉树的方式存储数据会对Key进行排序,排序方式是(自然排序或比较器排序)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值