小言_互联网的博客

Java 集合框架

388人阅读  评论(0)

集合,是将许多元素组合成一个单一单元的容器对象
集合,可用于存储/检索/操作/传输/聚合数据

集合框架,是用于表示和操作集合的体系结构,集合框架应包含

  1. 接口(Interfaces):表示集合的抽象数据类型。使用接口,允许集合独立于其表示的细节进行操作
  2. 实现(Implementations):集合接口的具体实现,包含可重用的数据结构
  3. 算法(Algorithms):对集合执行搜索/排序等操作,是可重用的功能

即,Java提供了一套包含,多种集合类型,多种数据结构实现,以及操作处理算法的集合框架,供开发人员直接使用


java.lang.Iterable
Iterable接口。实现了此接口类的对象,支持ForEach循环语句
Iterable接口不属于Java集合框架

java.util.Collection
一个集合,表示一组被称为元素的对象
Collection接口。用于描述,最具通用性的集合。因此,也包含了最具通用性的集合操作方法
Collection接口继承自Iterable接口。即,所有集合类型均支持foreach循环语句


boolean add(E e),向集合添加元素。如调用更改了集合返回true,下同
boolean  addAll(Collection<? extends E> c),向集合添加一个集合
boolean remove(Object o),从集合移除中指定元素
boolean  removeAll(Collection<? extends E> c),从集合移除包含指定集合
void clear(),移除集合全部元素
boolean contains(Object o),判断集合是否包含指定元素
boolean  containsAll(Collection<? extends E> c),判断是否包含包含指定集合
boolean isEmpty(),判断集合是否包含元素
int size() ,集合长度
T[] toArray(T[] a),将集合转为指定类型的数组
Iterator<E> iterator(),获取迭代器

< E > ,泛型。集合并不关心元素的具体类型,因此设计使用泛型
创建集合时,必须将泛型具体化为一个引用类型。这有助于编译器的编译时检测,减少运行时错误

List


java.util.List< E >
List集合。有序的,允许包含重复元素的集合。除从Collection继承的方法外,提供基于位置索引的操作方法

void add(int index, E element),将指定位置元素后移,添加
E set(int index, E element),替换
E get(int index),获取
E remove(int index),移除

java.util.ArrayList类,基于对象数组数据结构的实现
java.util.LinkedList类,基于双向链表数据结构的实现


ArrayList

List< User > users = new ArrayList<> ();

集合中的元素必须为引用类型
当需要使用基本类型时,应声明使用其对应的包装类类型

集合为逻辑上的容器,容器中仅保存元素对象的引用地址;操作集合中的元素时,实际操作的是元素引用的对象

List集合,允许包含重复元素

List to Array。toArray(T[] a)方法(Collection接口声明)
Array to List。Arrays工具类提供asList(T… a)方法

asList()方法为适配器模式方法,仅转换了类型,底层仍是数组。因此,执行任何修改集合长度方法(add/remove等),将抛出异常
ArrayList构造函数
ArrayList(),创建空List集合。默认创建0个元素的对象数组
ArrayList(int initialCapacity),基于指定长度创建List集合。长度仅初始化集合时使用,后期添加/移除自动容量
ArrayList(Collection<? extends E> c),基于指定集合创建List集合


LinkedList

List集合,基于LinkedList双向链表数据结构的实现
会为每个元素创建2个节点,保存前/后元素的地址

ArrayList,可快速基于索引访问元素对象;其底层使用Arrays.copyOf()方法实现对象数组的增删,性能损失较小

LinkedList,当需要极其频繁的在集合头部添加元素时,效率较高。但需要为每一个元素创建两个节点对象,基于索引位置的访问需要线性时间(Positional access requires linear-time),整体性能开销较大

绝大多数情况下,使用ArrayList,或不可变集合(后期讨论)即可

Map

java.util.Map<K,V>
Map,用于存放键值对(key-value)
Map不是集合
通过key值 ,保存其对应的value值
通过Key值获取对其对应的value值操作

Map中key必须是唯一的,且每个key只能对应一个value
但不同key,可以对应同一个value
添加key-value时,如果key已经存在,则后一个覆盖前一个
通过key的hash值,判断key是否相同*
支持以基本数据类型为key/value;支持以任何类型对象为key/value
基本实现类
java.util.HashMap<K, V>,查询效率与内存占用最平衡,非线程安全
java.util.TreeMap <K, V>/HashTable<K, V>

V put(K key, V value),保存键值对
V get(K key),基于key获取对应的value,如果value不存在,返回null
default V getOrDefault(Object key, V defaultValue),获取对应的value,没有则使用默认值
V remove(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
putAll()/clear()

Map没有,基于index索引的操作
Map没有,继承Iterable接口,不支持foreach语句遍历

基于hashCode()方法获计算key的hash值
创建Node数组,基于加载因子扩容,平衡内存占用与执行效率
创建Node对象,基于key的hash值+算法,计算Node对象在数组中的索引。Node对象中,封装Key/value对象,相同位置以及存在Node对象
减少数量小于等于6个,基于单向链表保存
增加数量大于等于8个,基于红黑树保存
数量改变时,转换数据结构
获取时,基于key的hash值+算法,直接在Node数组获取对应的Node对象,基于具体数据结构(单向链表/红黑树)进一步获取value对象


Set

java.util.Set< E >
Set集合,不包含重复元素(数学中集合的抽象)
Set接口,只包含继承自Collection方法,并添加禁止重复元素的限制
基本实现类
java.util.HashSet< E >,元素无序(底层基于HashMap确定元素是否重复)
java.util.LinkedHashSet< E>,元素有序
java.util.TreeSet < E>,元素有序
无论使用有序/无序实现,均无基于索引的操作方法

List/Set集合均提供
基于Collection接口类型的构造函数
可以将2种集合相互转换

Iterator

java.util.Iterator < E >
Iterator接口。迭代器,允许遍历集合,并根据需求选择性地从集合中移除元素
不同的集合类型,的不同数据结构的实现类,有不同的迭代器实现,但仅需面向Iterator接口完成遍历与移除
Iterator iterator()方法,Collection接口方法,获取集合对象的迭代器

Iterator通过移动游标遍历集合。初始时,游标位于第一个元素前
boolean hasNext(), Iterator中是否有下一个元素
E next(),向后移动游标,同时返回游标指向的元素
void remove() 从基础集合移除当前游标指向的元素


Java集合框架,提供了多种类型集合,以及高性能/高质量的数据结构实现
集合之间可以方便的实现相互转换
各种类型的集合接口与具体实现分离,将对集合的操作(方法),与集合底层的具体实现方式,解耦
从而使开发者将时间精力致力于改善程序本身的质量和性能
避免了直接操作对象数组带来的同步/异步/性能/效率/异常/接口设计等一系列繁琐问题

Java集合框架,是典型的面向接口编程的体现


转载:https://blog.csdn.net/weixin_44091178/article/details/105390976
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场