java集合类的使用_正确使用Java集合类(详细总结)

1、ArrayList

(1)初始分配长度为:10,每次扩展长度为之前的1.5倍

(2)内部采用动态数组实现

(3)可以随机访问,按照索引位置访问效率非常高,时间复杂度为O(1)

(4)按照内容查找效率比较低,时间复杂度为O(N),N为数组内容长度,性能与数组的长度成正比

(5)插入和删除元素效率比较低,因为需要移动元素,时间复杂度为O(N)

注:适合经常按照索引位置访问且插入与删除操作比较少的场景

2、LinkedList

(1)内部采用双向链表实现

(2)按需分配内存,不需要预先分配

(4)不可以随机访问,按照索引访问效率比较低,时间复杂度为O(N/2)

(5)按照内容查找效率比较低,需要逐个比较,时间复杂度为O(N)

(6)在两端添加与删除的效率非常高,时间复杂度为O(1)

(7)在中间添加与删除效率比较低,因为需要先定位,时间复杂度为O(N)

注1:与ArrayList正好相反,LinkedList 适合添加与删除比较多(尤其是在两端的添加与删除操作),而按照索引位置访问比较少的场景

注2:

队列(Queue)

特点是先进先出,在尾部添加元素,从头部删除元素,主要方法有:

add(E e)、offer(E e) 在尾部添加元素

element()、peek() 查看头部元素,但不改变队列

remove()、poll() 删除头部元素,并且从队列中删除

栈(Stack)

特点是先进后出,主要方法有:

push(E e) 表示入栈,在头部添加元素,栈的空间可能是有限的,如果栈满了,push会抛出异常IllegalStateException。

pop() 表示出栈,返回头部元素,并且从栈中删除,如果栈为空,会抛出异常

peek() 查看栈头部元素,不修改栈,如果栈为空,返回null

双端队列(Deque)

它包含了队列与栈的特性,可以说队列与栈是双端队列的特殊情况,主要方法有:

void addFirst(E e);

void addLast(E e);

E getFirst();

E getLast();

boolean offerFirst(E e);

boolean offerLast(E e);

E peekFirst();

E peekLast();

E pollFirst();

E pollLast();

E removeFirst();

E removeLast();

3、HashMap

(1)内部采用数组链表和哈希的方式进行实现

(2)键不能重复,key和value可以为null值

(3)初始分配大小为16,下次扩展大小与负载因子(loadFactor)有关,loadFactor 默认大小为 0.75,扩展规则为:当键值对个数大于threshold时开始扩展,threshold = 键值对个数 * loadFactor

(4)根据键保存和获取值的效率很高,时间复杂度为O(1)

(5)无序,因为hash值是随机的

注:适合根据键来查找值(查找效率非常高),且不要求顺序的场景

4、HashSet

(1)内部采用HashMap实现

(2)HashSet中存放的值不允许重复,所以HashSet中存放的对象需要重写hashCode和equals方法

(3)存放元素无序

(4)添加、删除、和判断元素是否存在效率都为O(1)

注:可用于排重,集合运算如交集、并集等运算

5、TreeMap

(1)内部采用红黑树实现

(2)TreeMap是按键有序,而不是按值有序

(3)TreeMap中的键对象需要实现Comparable接口,或者在构造器中传入比较器对象Comparator,推荐采用传入比较器的方式,更加灵活

(4)添加、删除、查找效率为O(log2(N)),N为元素个数

注1:需要排序考虑使用TreeMap,否则考虑使用HashMap(如果需要数据有序,考虑使用树结构,不需要排序,则优先使用哈希)

注2:

排序二叉树

(1)有序的树,元素不重复

(2)排序规则:A节点大于A节点的左子树但是小于A节点的右子树

(3)保存、删除、查找的效率为O(h),h为树的高度,如果是平衡的排序二叉树,h为log2(N),N为节点数

红黑树

(1)是一种平衡的排序二叉树

6、TreeSet

(1)HashSet是基于HashMap实现的,元素就是HashMap中的键,值是一个固定的值,TreeSet是类似的,它是基于TreeMap实现的

(2)元素不重复,且有序

(3)添加、删除、查找效率为O(log2(N)),N为元素个数

(4)TreeSet中的键对象需要实现Comparable接口,或者在构造器中传入比较器对象Comparator,推荐采用传入比较器的方式,更加灵活

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值