java 集合及分类
java 集合 接口 具体集合
数组,集合都是对多个数据进行存储(内存层面)操作的,简称为容器。在了解集合之前首先看一下数组的一些特点
- 数组一旦指定了长度,那么长度就被确定了,不可以更改。
int[] arr = new int[6];- 数组一旦声明了类型以后,数组中只能存放这个类型的数据。数组中只能存放同一种类型的数据。
int[] arr,String[] s,double[] d.....
也因此数组有以下缺点:
数组一旦指定了长度,那么长度就被确定了,不可以更改。
删除、增加元素 效率低。
数组中实际元素的数量是没有办法获取的,没有提供对应的方法或者属性来获取
数组存储:有序,可重复 。对于无序的,不可重复的数组不能满足要求。
正因为上面的缺点,引入了一个新的存储数据的结构集合
当需要将相同结构的个体整合到一起的时候,需要集合。
前后端交互时,后端从数据库返回的记录存储到集合中,再有前端遍历显示。常见应用场景:逛淘宝,逛外卖
集合分类
集合框架接口
stateDiagram
Iterable -->Collection
Collection -->List
Collection-->Set
Collection-->Queue
Set-->SortedSet
SortedSet-->NavigableSet
Queue-->Deque
Map-->SortedMap
SortedMap-->NavigableMAp
Iteratoe-->ListIterator
RadomAccess
因为不同集合底层数据结构不一样。集合不一样,特点也不一样
简要的集合结构如下
stateDiagram
集合 --> Collection
集合 --> Map
Collection --> List:子接口extends接口
Collection --> Set
List --> ArrayList:实现类implements子接口
List --> LinkedList
Set --> HashSet
Set --> TreeSet
Map --> HashMap:实现类implements接口
Map --> TreeMap
具体集合
集合类型 | 描述 |
---|---|
ArrayList | 可以动态增长和缩减的一个索引序列 |
LinkedList | 可以在任何位置高效插人和删除的个有序列 |
ArrayDeque | 实现为循环数组的一个双端队列 |
HashSet | 没有重复元素的一个无序集合 |
TreeSet | 一个有序集 |
EnumSet | 一个包含枚举类型值的集 |
LinkedHashSet | 一个可以记住元素插人次序的集 |
PriorityQueue | 允许高效删除最小元素的一一个集合 |
HashMap | 存储键/值关联的-一个数据结构 |
TreeMap | 键有序的一个映射 |
EnumMap | 键属于枚举类型的一- 个映射 |
LinkedHashMap | 可以记住键/值项添加次序的一个映射 |
WeakHashMap | 值不会在别处使用时就可以被垃圾回收的一个映射 |
IdentityHashMap | 用==而不是用equals比较键的一个映射 |
集合框架中的类
stateDiagram
AbstractCollection --> AbstractList
AbstractCollection --> AbstractSet
AbstractCollection --> AbstractQueue
AbstractCollection --> ArrayQueue
AbstractList-->AbstractSequentialList
AbstractSequentialList-->LinkedList
AbstractList-->ArrayList
AbstractSet-->HashSet
AbstractSet-->EnumSet
AbstractSet-->TreeSet
HashSet-->LinkedHashSet
AbstractQueue-->PriorityQueue
stateDiagram
AbstractMap-->HashMap
AbstractMap-->TreeMap
AbstractMap-->EnumMap
AbstractMap-->WeakHashMap
AbstractMap-->IdentityHashMap
HashMap-->LinkedHashMap
-
集合可依照存储的数据形式分为一一存储的Collection和一对一的Map。
-
public interface Collection<E> extends Iterable<E>
-
public interface Map<K,V>
-
Collection
List
- List接口有索引,特点有序、不唯一。
- ArrayList底层为紧密结构的数组,LinkedList底层为链式结构的链表(双向链表)
- ArrayList与Vector:底层都是数组的扩容。ArrayList扩容是长度为原数组1.5倍,线程不安全,效率高;Vector扩容是长度为原数组2倍,线程安全,效率低(淘汰);
- List接口的拓展方法中包含大量索引相关
Set
-
Set接口无索引,遍历可使用迭代器或增强for循环,特点无序(相对LIst接口来说,无序不等于随机)、唯一。
-
HashSet实现类底层原理:哈希表
-
TreeSet实现类底层原原理:实现内部比较器或外部比较器,因而放入数据时,自定义的类必须实现比较器接口。
Map
HashMap
-
特点:无序,唯一,是按照key进衍总结的,因为底层key遵照哈希表的结构(数组+链表)
-
哈希表原理:比如放入这个集合的数据对应的那个类:必须重写hashCode方法和equals方
-
HashMap 与Hashtable :HashMap JDK1.2效率高,线程不安全,key可以存入null值,并且key的null值也遵循唯一的特点;Hashtable JDK1.0效率低,线程安全,key不可以存入null值
-
LihkedHashMap实现类特点:唯一,有序(按照输入顺序进行输出)
TreeMap
- 特点:唯一,有序(按照升序或者降序)
- 原理:二叉树,key遵照二叉树的特点
- 放入集合的key的数据对应的类型内部一定要实现比较器((内部比较器,外部比较器)