Java之ListSetMap区别和使用场景
Posted 蜡笔小心_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之ListSetMap区别和使用场景相关的知识,希望对你有一定的参考价值。
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遍历方式:
(1)for循环。(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: 不重复,无索引,按照大小默认升序排序!! ( 可排序集合 )
研究两个问题(面试热点):
(1)Set集合添加的元素是不重复的,是如何去重复的?
首先判断两个对象的哈希值,如果不相等则返回false。相同则让两个对象进行equals比较,如果相等返回true
,否false。
如果想只要对象内容相同就返回true,需要重写对象的hashCode和equals方法
(2)Set集合元素无序的原因是什么?
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对象,重写比较方法
注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则。
以上是关于Java之ListSetMap区别和使用场景的主要内容,如果未能解决你的问题,请参考以下文章
java面试_集合框架001_ListSetMap三者的区别_说出ArrayListLinkListVector的区别
Java集合 -- ListSetMap三者的区别Arraylist 与 LinkedList 区别RandomAccess接口双向链表和双向循环链表ArrayList 与 Vector