Java之List、Set、Map区别和使用场景

发布于:2022-11-28 ⋅ 阅读:(737) ⋅ 点赞:(0)

Collection集合体系之List、Set

一、List 集合添加元素是有序的、可重复、有索引的

1. ArrayList集合

ArrayList:实现了List接口,基于索引的接口,底层是数组,查询快。所以查询量大的时候会使用List作为集合来
查。在修改和删除方面会比较慢,删除一个元素后,会进行重新排序
- 方法:
- public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
- public E get(int index):返回集合中指定位置的元素。
- public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
- public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回更新前的元素值。
小结:
    List系列集合有序,可重复,有索引的。
    ArrayList实现类集合底层基于数组存储数据的,查询快,增删慢!!
    开发中ArrayList集合用的最多!!
    
List遍历方式:
        (1for循环。(List集合独有)2)迭代器。
        (3)foreach。
        (4)JDK 1.8新技术。

2. LinkedList集合

 LinkedList:以链表的形式进行存储数据,一个指向前一个,一个指向下一个,可以适用顺序要求较高的增删操作频
 繁的场景,因为Linkedlist有指定的方法,可以快速进行操作。删除元素的时候,因为是以链表的形式进行存储的,
 上一个元素自动指向下一个,所以在修改和删除要比ArrayList性能要高。
 LinkedList除了拥有List集合的全部功能还多了很多操作首尾元素的特殊功能:
    - 方法:
    - public void addFirst(E e):将指定元素插入此列表的开头。
    - public void addLast(E e):将指定元素添加到此列表的结尾。
    - public E getFirst():返回此列表的第一个元素。
    - public E getLast():返回此列表的最后一个元素。
    - public E removeFirst():移除并返回此列表的第一个元素。
    - public E removeLast():移除并返回此列表的最后一个元素。
    - public E pop():从此列表所表示的堆栈处弹出一个元素。
    - public void push(E e):将元素推入此列表所表示的堆栈。
小结:
    LinkedList是支持双链表,定位前后的元素是非常快的,增删首尾的元素也是最快的。
    所以提供了很多操作首尾元素的特殊API可以做栈和队列的实现

二、Set集合添加的元素,是无序,不重复,无索引的。

-- HashSet:添加的元素,是无序,不重复,无索引的。(无拓展)
-- LinkedHashSet:添加的元素,是有序,不重复,无索引的。
-- TreeSet: 不重复,无索引,按照大小默认升序排序!! ( 可排序集合 )

研究两个问题(面试热点):
  (1Set集合添加的元素是不重复的,是如何去重复的?
    首先判断两个对象的哈希值,如果不相等则返回false。相同则让两个对象进行equals比较,如果相等返回true
    ,否false。
    如果想只要对象内容相同就返回true,需要重写对象的hashCode和equals方法
    
  (2Set集合元素无序的原因是什么?
    JDK 1.8之前:哈希表 = 数组 + 链表  + (哈希算法)
    JDK 1.8之后:哈希表 = 数组 + 链表 + 红黑树(二叉树-右边数值小)  + (哈希算法)
        当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
    小结:
        Set系列集合是基于哈希表存储数据的
        它的增删改查的性能都很好!!但是它是无序不重复的!如果不在意当然可以使用!

1. LinkedHashSet集合

 LinkedHashSet集合是HashSet的子类,元素是“有序” 不重复,无索引,LinkedHashSet底层依然是使用哈希表
 存储元素的,但是每个元素都额外带一个链来维护添加顺序!!不光增删查快,还有序。缺点是多了一个存储顺序的
 链会占内存	空间!!而且不允许重复,无索引。
总结:
     如果希望元素可以重复,又有索引,查询要快用ArrayList集合。(用的最多)
     如果希望元素可以重复,又有索引,增删要快要用LinkedList集合。(适合查询元素比较少的情况,经常要首尾
     操作元素的情况)
     如果希望增删改查都很快,但是元素不重复以及无序无索引,那么用HashSet集合。
     如果希望增删改查都很快且有序,但是元素不重复以及无索引,那么用LinkedHashSet集合。

2. TreeSet集合

TreeSet集合是不重复,无索引,按照大小默认升序排序!! TreeSet集合称为排序不重复集合,可以对元素进行默认的
升序排序。
     TreeSet集合自排序的方式:
        1.有值特性的元素直接可以升序排序。(浮点型,整型)
        2.字符串类型的元素会按照首字符的编号排序。
        3.对于自定义的引用数据类型,TreeSet默认无法排序,执行的时候直接报错,因为人家不知道排序规则。
    小结:
        TreeSet集合对自定义引用数据类型排序,默认无法进行。
        但是有两种方式可以让程序员定义大小规则:
             a.直接为对象的类实现比较器规则接口Comparable,重写比较方法(拓展方式)
             b.直接为集合设置比较器Comparator对象,重写比较方法
        注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则。
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到