Java集合系列之四大常用集合(ArrayList、LinkedList、HashSet、HashMap)的用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lkp1603645756/article/details/85014364

ArrayList

ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本。ArrayList 是以数组实现的,遍历时很快,但是插入、删除时都需要移动后面的元素,效率略差些。它提供了如下一些好处:

  • 动态的增加和减少元素
  • 实现了ICollection和IList接口
  • 灵活的设置数组的大小
  • 不是同步容器
  • 按照插入顺序来保存元素,可以利用下标来查找值
  • 按照下标访问元素最快

常用方法:

boolean add(Object obj) 将指定元素obj追加到集合的末尾 
Object get(int index) 返回集合中指定位置上的元素 
int size() 返回集合中的元素个数 
boolean add(int index, Object obj) 将指定元素obj插入到集合中指定的位置 
Object remove(int index) 从集合中删除指定index处的元素,返回该元素 
void clear() 清空集合中所有元素 
Object set(int index, Object obj) 用指定元素obj替代集合中指定位置上的元素

LinkedList

LinkedList 是以链表实现的,插入、删除时只需要改变前后两个节点指针指向即可,它是链表实现的线性表(双链表)。

它的一些特点:

  • 双向链表实现
  • 元素时有序的,输出顺序与输入顺序一致
  • 允许元素为 null
  • 要找到某个结点,必须从头开始遍历。(查询慢,增删快)
  • 和 ArrayList 一样,不是同步容器

常用方法:

boolean add(Object obj) 将指定元素obj追加到集合的末尾 
Object get(int index) 返回集合中指定位置上的元素 
int size() 返回集合中的元素个数 
boolean add(int index, Object obj) 将指定元素obj插入到集合中指定的位置 
Object remove(int index) 从集合中删除指定index处的元素,返回该元素 
void clear() 清空集合中所有元素 
Object set(int index, Object obj) 用指定元素obj替代集合中指定位置上的元素

//LinkedList特有
void addFirst(E e)	将元素添加到集合的起始位置;
void addLast(E e)	将元素添加到集合的末尾位置;
Object getFirst()		获取集合的第一个元素;
Object getLast()    	获取集合的最后一个元素;
Object removeFirst()	删除集合的第一个元素,并返回该元素;
Object removeLast()	删除集合的最后一个元素,并返回该元素;	

HashSet

HashSet是set接口的实现类,也是我们最常用的set集合

  • 储存的是无序,唯一的对象(不能够存储重复的元素)
  • 由于是无序的所以每组数据都没有索引,很多list可用的方法他都没有
  • 凡是需要通过索引来进行操作的方法都没有
  • 所以也不能使用普通for循环来进行遍历,只有foreach和迭代器两种遍历方法
  • 允许包含值为null的元素,但最多只能有一个null元素。

常用方法:

boolean add(Object obj) 将指定的元素添加到此集合
boolean contains(Object obj)  如果此集合包含指定的元素,则返回true
boolean isEmpty()  如果此集合不包含元素,则返回true
int size() 返回集合中的元素个数 
boolean remove(Object obj) 如果存在,则从该集合中删除指定的元素
void clear() 从此集合中删除所有元素

HashMap

HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。

  • 底层实现是 链表数组,JDK 8 后又加了 红黑树
  • 实现了 Map 全部的方法
  • key 用 Set 存放,所以想做到 key 不允许重复,key 对应的类需要重写 hashCode 和 equals 方法
  • 允许空键和空值(但空键只有一个,且放在第一位)
  • 元素是无序的,而且顺序会不定时改变
  • 插入、获取的时间复杂度基本是 O(1)(前提是有适当的哈希函数,让元素分布在均匀的位置)
  • 遍历整个 Map 需要的时间与 桶(数组) 的长度成正比(因此初始化时 HashMap 的容量不宜太大)
  • 两个关键因子:初始容量、加载因子

常用方法:

void clear();    删除所有的映射
boolean containsKey(Object key)  如果此映射包含指定键的映射,则返回true
boolean containsValue(Object value)  如果将一个或多个键映射到指定值,则返回true
V get(Object key)   返回到指定键所映射的值,或 null如果此映射包含该键的映射
boolean isEmpty()   如果此地图不包含键值映射,则返回 true  
V put(K key, V value)   将指定的值与此映射中的指定键相关联
V remove(Object key)  从该地图中删除指定键的映射(如果存在)
V replace(K key, V value)   只有当目标映射到某个值时,才能替换指定键的条目 
int size()   返回此地图中键值映射的数量 

ArrayList与LinkedList区别

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
  2. 对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。 
  3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 

HashSet与HashMap的区别

HashMap HashSet
HashMap实现了Map接口 HashSet实现了Set接口
HashMap储存键值对 HashSet仅仅存储对象
使用put()方法将元素放入map中 使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢

如何选择在什么场景下使用它们

ArrayList:如果需要大量的随机访问就要使用ArrayList

LinkedList:如果要经常从中间插入和删除就要使用LinkedList

HashSet:元素无放入顺序,元素不可重复,重复元素会覆盖掉

HashMap:如果要通过键值队来访问就是用HashMap,键唯一,值不唯一,key和value都可以为null

Don't go through life,grow through life——不求此生匆匆过,但求每日都成长。

猜你喜欢

转载自blog.csdn.net/lkp1603645756/article/details/85014364