Java基础三:集合概述

集合

  • 集合是Java中的一种容器类,它的主要作用是用于存储对象,并且实现了日常开发中所用到的数据结构,而且提供了对这些数据结构的增删改查等基本操作,在很大程度上简化了开发的步骤。
  • 集合主要分为两大类:
  • 1.Collection
    • 一个独立元素的序列,这些元素都服从一条或者多条规则,比如List必须保证存储顺序和插入顺序一致、Set元素不可重复、Queue按照排队规则来确定对象的顺序。
  • 2.Map
    • 首先说明的是,Map和Collection是属于同一层次的数据结构,很多人容易把二者的层级关系搞混,认为Map是Collection的子类,其实二者是平级的。Map是属于一种成对的"键值对"类型的数据,而且可以通过key(键)来查找value(值),属于一种映射关系。
      Java的集合框架图如下:

在这里插入图片描述

List集合

  • List可以将元素维护在特定的序列中,是线性数据结构的主要实现。List接口在Collection的基础上添加了很多方法,可以实现对List的添加移除以及中间插入操作。List中最常用的是ArrayList和LinkedList:

ArrayList:

  • 首先,ArrayList是非线性安全的。内部通过动态数组进行存储数据,当添加一个元素时,会去判断是否需要扩容,如果需要扩容的话,那么就把原数组长度扩大1.5倍,扩容时是把原来的数据拷贝到扩容后的数组中。ArrayList的随机访问时很快的,因为可以通过数组确定元素的位置,快速定位元素;但是当删除或者添加的时候,如果要添加或者删除的元素位置是位于数组尾部位置的还好,如果位于头部,那么会移动数组头后面的所有元素,所以ArrayList的添加和删除性能是不稳定的。

LinkedList:

  • Linked的本质是双向链表,所以对于随机访问的话,需要遍历链表来查找元素,那么相对于ArrayList,LinkedList的查找性能是不稳定的,大部分情况下很差。那么删除和添加,LinkedList就有明显的优势,它不需要挪动其他元素的位置,只需要把添加或者删除影响到的元素的引用更新成新的就可以了。
  • LinkedList除继承AbstractList抽象类外,还实现了接口Deque,这个接口同时拥有队列和栈的性质。LinkedList包含三个重要的成员:first、last、size。first是第一个节点的引用,last是最后一个节点的引用,size是双向链表中节点的个数。LinkedList可以通过附加引用的方式把零散的内存单元关联起来,形成一种按照链路顺序查找的线性结构,所以内存利用率比较高。

Queue

  • 队列是一个典型的先进先出(FIFO)的容器,也就是从容器的一端放入元素,从另一端取出元素,并且元素从容器中取出和放入的顺序是相同的。由于这一特性,队列在高并发场景中运用十分广泛,经常作为数据缓冲区来使用。
    另外,LinkedList实现了Queue接口,所以LinkedList可以作为Queue的一种实现。
  • offer()是Queue的方法之一,它在允许的情况下,将一个元素插入到队尾,或者返回false。
  • peek()和element()都是在不移除的情况下返回队头,但是,peek()在队列为空时返回null,而element()则回抛出NoSuchElementException异常。
  • 队列的特点是先进先出,但是PriorityQueue则可以自定义一个规则,实现一个优先级队列,优先级队列声明下一个弹出的元素时优先级最高的元素。那么这时通过offer()插入元素时,这个元素就会在队列中被排序。优先级队列默认使用的是自然排序,当然我们也可以通过定义自己的Comparator来修改顺序。

Map

  • Map最突出的能力是它可以将对象映射到其他对象。
  • Map是通过key-value形式来存储数据,是一种哈希结构。key通过特定的哈希函数计算后确定为唯一的值,而value则是可以重复的。Map可以通过keySet()查看所有的key,通过values()查看所有的value,通过entrySet()查看所有的键值对。
  • 最早使用的HashTable已经被淘汰不用,现在使用最多的是非线程安全的HashMap和线程安全的ConcurrentHashMap。ConcurrentHashMap采用了分段锁的技术(16个),所以在多线程并发场景中,应该优先使用ConcurrentHashMap。TreeMap则是一种key值有序的Map类集合,默认是自然排序,也可以自定义排序方式。

Set

  • Set的特点是集合内数据不重复。
  • Set具有Collecttion完全一样的接口,因此Set没有任何额外的功能,其实,Set就是Collection,只不过是行为不同,这一点是继承和多态的典型的应用(不同的类的对象,对相同的消息,做出不同的行为)。
  • Set中最常用的有三类:HastSet、TreeSet、LinkedHashSet
    • HastSet使用了散列函数,底层是通过HashMap来实现的,它的value是一个固定的静态值,是通过key来保证集合元素的唯一性。
    • TreeSet将元素存储在红-黑树数据结构中,当添加新的元素时,通过特定的规则,把元素放到相对应的位置。
    • LinkedHashSet继承自HashSet,具有HashSet的优点,内部使用了链表来维护元素的插入顺序。

总结

本文只是大概的介绍了集合这一大家族的成员,属于扫盲篇,接下来的文章中,会从源码出发,逐步的去了解每一个集合类的数据结构,和它们对于添加修改删除查询等操作,各自具有的特点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值