Java 集合(Collection)笔记

1.集合

什么是集合

概念:

对象的容器,提供了一些多个对象操作的方法,类似于数组。

跟数组的区别:

  • 数组长度是固定的,集合长度不固定。
  • 数组支持基本类型与引用类型,集合只支持引用类型。

2.Collection体系

3.Collection根接口

特点:

表示一组任意类型的对象,每个对象被称为元素,并且定义了一些常用方法。

常用方法:

boolean add(E e)添加指定元素到集合中
boolean addAll(Collection<? extends E c)将相同引用类型的集合中所有元素添加到当前集合
void clear()移除集合中所有元素
boolean contains(Object o)返回集合是否包含指定的对象
boolean containsAll(Collection<?> c)返回当前集合是否包含指定集合的所有元素
boolean equals(Object o)与指定对象进行比较
int hashCode()返回当前集合的哈希值
boolean isEmpty()返回集合是否不包含任意元素
Iterator<E> iterator()返回集合中的元素的迭代器
default Stream<E> parallelStream()返回一个当前集合作为数据来源的可能并行的Stream
boolean remove(Object o)从集合中移除指定的元素
boolean remove(Collection<?> c)移除当前集合中包含的指定集合的所有元素
default boolean removeIf(Predicate<? super E> filter)移除当前集合中满足指定Predicate的所有元素
boolean retainAll(Collection<?> c)仅保留当前集合包含的指定集合的所有元素
int size()返回集合中元素个数
default Spliterator<E> spliterator()创建当前集合中元素的Spliterator
default Stream<E> stream()返回一个当前集合作为数据来源的Stream
Object[] toArray()返回包含当前集合所有元素的数组;数组类型为Object类型
<T> T[] toArray(T[] a)返回包含此集合中所有元素的数组;数组类型与元素类型相同

4.迭代器(Iterator)

概念:

专门遍历集合的对象。

方法:

default void forEachRemaining(Consumer<? super E> action)对迭代器剩余的每个元素执行指定的Consumer,直到所有剩余元素都被处理或发生异常中断
boolean hasNext()迭代器是否有下一个元素
E next()返回迭代器下一个元素
default void remove()从迭代器对应的集合中移除最后一个元素(其实是迭代器当前索引位置的元素)

注意:

不能在使用迭代器遍历时,使用Collection.remove等可以移除元素的方法。

5.List

特点:

有序、有下标所以元素可重复。

独有方法:

List 继承自Collection,所以 List 内的方法包含了Collection接口方法,就不再赘述,见上文。

void add(int index,E element)在List指定位置插入指定的元素
void addAll(Collection<? extends E> c)在List指定位置插入指定集合的所有元素
E get(int index)返回指定位置的元素
int indexOf(Object o)返回在List中指定对象第一次出现的索引
int lastIndexOf(Object o)返回在List中指定对象最后一次出现的索引
ListIterator<E> listIterator()返回List的ListIterator
ListIterator<E> listIterator(int index)返回List从指定索引开始的ListIterator,ListIterator包含指定索引的元素
E remove(int index)移除List指定位置的元素
boolean replaceAll(UnaryOperator<E> operator)使用UnaryOperator替换List中每个元素
E set(int index,E element)替换List中指定位置的元素
default void sort(Comparator<? super E> c)使用指定的Comparator对List所有元素进行排序
List<E> subList(int fromIndex,int toIndex)以List返回指定起始索引到终止索引见的所有元素,包含起始索引对应的元素,不包含终止索引对应的元素

6.List 常用实现类

ArrayList数组结构实现,查询快、增删慢;JDK1.2 版本支持,运行效率快、线程不安全
Vector数组结构实现,查询快、增删慢;JDK1.0 版本支持,运行效率慢、线程安全
LinkedList链表结构实现,查询慢、增删快;JDK1.2 版本支持,运行效率快、线程不安全

7.ArrayList

源码分析:

  • static final int DEFAULT_CAPACITY 是10,是默认容量。但是如果没向集合中添加任何元素是,当前ArrayList容量为0,添加一个元素后,容量为10。
  • 可以指定初始容量,在构造ArrayList时指定。
  • ArrayList 每次扩容会扩容为原来的1.5倍。
  • Object[] elementData 是存放元素的数组。
  • int size 是实际元素个数。

8.ArrayList与LinkedList的区别

9.泛型

  • Java 泛型是JDK1.5引入的一个新特性,本质是把类型参数化,即类型可以作为参数传递。
  • 常见形式有泛型类、泛型接口、泛型方法。
  • 语法:<T,….>T称为类型占位符,表示一种引用类型。
  • 好处:提高代码的重用性;防止类型转换异常,提高代码的安全性。

10.泛型集合

概念:

参数化类型以及类型安全的集合,要求所有集合元素的类型必须一致。

特点:

  • 编译时即可检查,而不会运行时抛出异常(类型不一致异常)。
  • 访问,不需要强制类型转换(拆箱)。
  • 不同泛型之间引用不能相互赋值,泛型不存在多态。

11.Set接口

Set 接口完全继承自Collection,没有自己独有的方法。

12.Set 实现类

HashSet基于HashCode实现元素不重复
当存入元素的HashCode相同时,会调用equals进行判断,如果为true,会拒绝后者写入
TreeSet基于排列顺序实现元素不重复。
实现了SortedSet接口,对集合元素自动排序。
元素对象的类型必须实现Comparable接口,指定排序规则。
通过CompareTo方法确定是否为重复元素。

13.HashSet

存储结构:

哈希表(数组+链表+红黑树)

存储过程:

先根据元素的HashCode计算存储位置,如果计算出来的存储位置没有存储对象,那么就直接存储;如果有,就调用equals方法,如果equals方法返回true,则认为重复拒绝写入,否则,形成链表。

14.TreeSet

存储结构:

红黑树。

15.Map

Map体系

Map 接口

特点:存储键值对,无序、无下标,键不可重复,值可以重复。

常用方法:

V put(K key,V value)将键值对存入到Map中。Key 重复会覆盖掉原值
Object get(Object key)根据键获取值
Set<K> keySet()返回所有Key
Collection<V> values()返回包含所有值的Collection集合
Set<Map.Entry<K,V>> entrySet()键值匹配的Set集合

16.Map实现类

HashMapJDK1.2,线程不安全,运行效率快;允许用null作为Key或Value
HashtableJDK1.0,线程安全,运行效率慢;不允许用null作为Key或Value
PropertiesHashtable 子类,要求Key和Value都必须String;通常用于资源文件的读写
TreeMap实现了SortedMap接口(是Map的子接口),可以对Key自动排序

17.HashMap

存储结构:

哈希表。

重复依据:键的hashCode()方法和equals()方法。

源码分析:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;hashMap初始容量大小
static final int MAXIMUM_CAPACITY = 1 << 30;hashMap的数组最大容量
static final float DEFAULT_LOAD_FACTOR = 0.75f;默认加载因子
static final int TREEIFY_THRESHOLD = 8;jdk1.8 当链表长度大于8时,调整为红黑树
static final int UNTREEIFY_THRESHOLD = 6;jdk1.8 当链表长度小于6时,调整为链表
static final int MIN_TREEIFY_CAPACITY = 64;jdk1.8 当链表长度大于8时,并且集合元素个数大于等于64时,调整为红黑树
transient Node<K,V>[] table哈希表中的数组
transient int size;元素个数

总结:

  1. HashMap刚创建没添加元素时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16.
  2. 当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。
  3. jdk1.8 当每个链表长度大于8,并且数组元素个数大于等于64时,会调整为红黑树,目的提高执行效率。
  4. jdk1.8 当链表长度小于6时,调整为链表。
  5. jdk1.8以前,链表是头插入,jdk1.8以后是尾插入。

注意:

HashSet 内部用的就是HashMap。

18.TreeMap

存储结构:

红黑树。

注意:

TreeSet 内部用的就是TreeMap。

19.Collections工具类

概念:

集合工具类,定义了集合除存取以外的集合常用方法。

方法:

public static void reverse(List<?> list)反转集合中元素的顺序
public static void shuffle(List<?> list)随机重置集合元素的顺序
public static <T extends Comparable<? super T>> void sort(List<T> list)升序排序(元素类型必须实现Comparable接口)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值