集合类——基本功考查重点,用的很频繁

本文详细解析了集合类在Java中的核心概念,包括ArrayList、HashMap、List接口及其子类的特性、方法对比,以及面试中常被提及的面试点。讲解了数据容器的使用、数据结构底层实现和线程安全问题,适合准备面试和技术实践者阅读。
摘要由CSDN通过智能技术生成

谁的子类/接口 ——>描述数据结构  ——> 底层结构 ——>初始/扩容 ——> 有序/允许重复/允许null  ——>  线程安全

目的:临时存储数据

集合类的三个角度:

  1. 使用角度:数据容器:(希望比较/快速的进行增删改查)
  2. 底层引入了组织方式:数据结构,容器内部的数据按照哪种结构组织(高效/快速)
  3. 落实到代码上:怎么表示数据结构的 用什么对象关系(具体的在内存上实际存在的)描述这种数据结构:数组或者链表

面试重点:ArrayList和HashMap

se面试常用点:String、多线程、垃圾回收、集合类、网络编程、I/O流

Collection

单列集合

  1. Collection是Collection集合体系的顶级接口
  2. Collection的一些子实现是有序的,另一些子实现是无序的
  3. Collection的一些子实现允许存储重复元素,另一些子实现不允许存储重复元素
  4. Collection的一些子实现允许存储null(例如:ArrayList),另一些子实现不允许存储null(例如:TreeSet)

这里要记住JDK不提供此接口的任何直接实现:它提供更具体的子接口,如Set、List实现

Collection的方法:

booleanadd(E e)
          确保此 collection 包含指定的元素(可选操作)。
 booleanaddAll(Collection<? extends E> c)
          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
 voidclear()
          移除此 collection 中的所有元素(可选操作)。
 booleancontains(Object o)
          如果此 collection 包含指定的元素,则返回 true。
 booleancontainsAll(Collection<?> c)
          如果此 collection 包含指定 collection 中的所有元素,则返回 true。
 booleanequals(Object o)
          比较此 collection 与指定对象是否相等。
 inthashCode()
          返回此 collection 的哈希码值。
 booleanisEmpty()
          如果此 collection 不包含元素,则返回 true。
 Iterator<E>iterator()
          返回在此 collection 的元素上进行迭代的迭代器。
 booleanremove(Object o)
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
 booleanremoveAll(Collection<?> c)
          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
 booleanretainAll(Collection<?> c)
          仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
 intsize()
          返回此 collection 中的元素数。
 Object[]toArray()
          返回包含此 collection 中所有元素的数组。
<T> T[]
toArray(T[] a)
          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

最后一个泛型是需要加深理解,面试有可能会问,但是日常开发不会用到。

Iterator每个底层的实现方式都不一样

 并发修改异常——Foreach

情景:如果这个线程在遍历集合,而另一线程在删除。

解决办法:

加锁(不可行)——颗粒度太细

jdk使用的方法是使用这个modCount的并发,但是没有加锁完美,会导致单线程出现问题

 Itreator中的next指向的是两个元素之间

Foreach循环——除了数组,其他底层都是Iterator遍历的

 List子接口——接口作用:定义规范

  1. List是Collection接口的子接口
  2. 描述的是线性表这种数据结构(线性表:有序序列-有下标/有下标api)
  3. 必定有序
  4. 允许存储重复元素
  5. 允许存储null

List接口

booleanadd(E e)
          向列表的尾部添加指定的元素(可选操作)。
 voidadd(int index, E element)
          在列表的指定位置插入指定元素(可选操作)。
 booleanaddAll(Collection<? extends E> c)
          添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。
 booleanaddAll(int index, Collection<? extends E> c)
          将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
 voidclear()
          从列表中移除所有元素(可选操作)。
 booleancontains(Object o)
          如果列表包含指定的元素,则返回 true。
 booleancontainsAll(Collection<?> c)
          如果列表包含指定 collection 的所有元素,则返回 true。
 booleanequals(Object o)
          比较指定的对象与列表是否相等。
 Eget(int index)
          返回列表中指定位置的元素。
 inthashCode()
          返回列表的哈希码值。
 intindexOf(Object o)
          返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
 booleanisEmpty()
          如果列表不包含元素,则返回 true。
 Iterator<E>iterator()
          返回按适当顺序在列表的元素上进行迭代的迭代器。
 intlastIndexOf(Object o)
          返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
 ListIterator<E>listIterator()
          返回此列表元素的列表迭代器(按适当顺序)。
 ListIterator<E>listIterator(int index)
          返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
 Eremove(int index)
          移除列表中指定位置的元素(可选操作)。
 booleanremove(Object o)
          从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。
 booleanremoveAll(Collection<?> c)
          从列表中移除指定 collection 中包含的其所有元素(可选操作)。
 booleanretainAll(Collection<?> c)
          仅在列表中保留指定 collection 中所包含的元素(可选操作)。
 Eset(int index, E element)
          用指定元素替换列表中指定位置的元素(可选操作)。
 intsize()
          返回列表中的元素数。
 List<E>subList(int fromIndex, int toIndex)
          返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
 Object[]toArray()
          返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
<T> T[]
toArray(T[] a)
          返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

subList

是一个视图方法,是一个切割方法,并没有真正的切割出数据,仅仅是维护了原数据的一些标记,标记哪些元素是切割出来的范围。看上去好像是复制了一根数据,实际上并没有。他里面的数据还是源数据。

视图、数据库、“虚表”,给原本的数据划分不同的表,不同的表持有不同的数据引用

iterator迭代器

remove只能删除刚刚遍历过的元素

iterator这些操作只是维护了标记。

iterator的子接口ListIterator

修改、添加、向前遍历

add是添加到要遍历的位置--->连续添加

set是修改刚刚遍历过的元素位置-->连续修改

ArrayList

特点:

clone方法:只拷贝两层,第一层是ArrayList对象,第二层是ArrayList所持有的数组

 

 Vector

  1. 是List接口的一个子实现JDK1.0之后
  2. 描述的数据结构是线性表
  3. 底层结构是数组
  4. 默认的初始长度,数组扩容机制
  5. 有序
  6. 允许重复
  7. 允许存储null
  8. 是线程安全的

stack

  1. 是Vector的一个子类,复用Vector的底层结构,参数 变量以及方法
  2. 描述的数据结构是栈
  3. 底层结构是数组
  4. 默认初始容量是10,默认扩容机制是2倍
  5. 有序,允许重复 可以null
  6. 线程安全

如果使用Stack的时候尽量不要使用从Vector继承来的方法,因为既然使用了stack那么你就希望它作为栈而存储,而非普通线性表。

如果真的需要一个栈,可以优先使用Deque接口下的具体实现,因为Deque这个接口定义了栈的数据结构操作。

LinkedList

  1. 是List一个具体实现(同时它还实现了Deque接口)
  2. 描述的数据结构是:线性表、队列、双端队列、栈
  3. 底层结构是双向链表
  4. 有序
  5. 允许存储重复元素
  6. 允许存储null
  7. 线程不安全

clone方法

Deque

这个接口描述的数据结构:队列,双端队列,栈

Map-键值对(自我描述)

双列集合——键值对

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值