【java集合】复习Collection接口下List接口下的集合(ArrayList,LinkedList,Stack,Vector))

集合的概念

什么是集合?
存储数据的容器

集合和数组,数据库的区别

数组 数据库都可以存放数据,集合存在的意义?
集合和数组的差别:
1、数组是静态,集合是动态的(可扩容)
2、集合功能更全面
3、数据需要指定类型,存储数据必须是这个类型
集合创建时可有可无,如果没有可以存储任意
4、数组既可以使用普通类型,也可以使用引用类型
集合只能使用引用类型
5、数组是java内置类型效率更高

和数据库的差别:

数组,集合,数据库的使用场景
特点——》分析
数组:根据需求来使用
集合:根据需求来使用
数据库:需要数据持久化

Conllection接口下的集合

Conllection接口:(存储单值)

  • List:ArrayList LinkedList Vector Stack
  • Set:HashSet LinkedHashSet TreeSet
  • Queue:ArrayQueue PriorityQueue

Map:(key—value键值对)

HashMap:LinkedHashMap TreeMap HashTable

面试常问题?

特点 底层数据结构 初始容量 是否可以存储null元素
是否允许存储重复元素
底层的扩容机制 增删改查方法 是否线程安全

list集合

分析特点的时候我们可以从实现的接口来看

  • (1)Collection接口:是存放一组单值的最大接口。 所谓的单值是指集合中的每个元素都是一个对象。一般很少直接使用此接口直接操作。
  • (2)List接口: 是Collection接口的子接口 ,也是最常用的接口。此接口对Collection接口进行了
    大量的扩充,里面的内容是允许重复允许为NULL的并且有序(插入)。
  • (3)Set接口: 是Collection接口的子类, 没有对Collection接口进行扩充,里面不允许存放重复内容!
  • (4)Map接口: 是存放一对值的最大接口!即接口中的每个元素都是一对, 以key --> value的形式保存
    并且Key是不重复的,元素的存储位置由key决定。也就是可以通过key去寻找key-value的位置。从而得到value的 值。
  • (5)Iterator接口:
    集合的输出接口,用于输出集合中的内容,只能进行从前到后的单向输出!(这里会举一个例子帮助同学们理解什么是迭代器)
  • (6)ListIterator接口: 是Iterator接口的子接口,可以进行双向输出
  • (7)Enumeration接口:是最早的输出接口,用于输出指定集合中的内容
  • (8)SortedSet接口:单值的排序接口。实现此接口的集合类,里面的内容可以使用比较器排序(Comparable和Comparator的区别)
  • (9)SortedMap接口:存放一对值得排序接口。实现此接口的集合类,里面的内容按照key排序,使用比较器排序
  • (10)Queue接口: 队列接口,具有队列先入先出的特点。此接口的子类可以实现队列操作
  • (11)Map.Entry接口:Map.Entry的内容接口,每一个Map.Entry对象都保存着一对 key -->
    value的内容,每个Map接口中都保存有多个Map.Entry接口实例。(具体HashMap的Entry类中有实现)

Queue :先入先出 一端添加 另一端删除

Deque:可以在两端进行添加与删除

ArrayList:

由接口可以得出

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  • List接口允许存放null元素并且可以重复有序(插入顺序有序)
  • RandomAccess:可以随机访问
  • Cloneable:可以实现克隆
  • Serializable:可以实现序列化
LinkedList
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
  • List:允许重复null值并且插入有序

  • 继承了Deque接口具有如下特点:

  • 1.当作链表操作

    增加:
    add(E e):在链表后添加一个元素 尾插
    add(int index, E element) 在指定下标添加元素 随机插入
    删除
    remove(E o); 删除一个指定元素
    remove(int index) 删除指定下标的元素
    获取:
    get(int index);获取指定下标的元素
    修改指定的下标的元素
    set(int index, E element);

  • 2.当作双端队列操作

: 注意返回值 异常情况的处理
增加:
addFirst(E e):在链表头部插入一个元素; 特有方法
addLast(E e):在链表尾部添加一个元素; 特有方法 add(int index, E element):在指定位置插入一个元素。
offerFirst(E e):JDK1.6版本之后,在头部添加; 并返回是否添加成功
offerLast(E e) 在数组后天添加元素, 并返回是否添加成功 offerLast(E e):JDK1.6版本之后,在尾部添加; 特有方法

删除:
	removeFirst(E e):	删除头,  获取元素并删除; 
	removeLast(E e):	删除尾;  
	pollFirst():		删除头;  
	pollLast():		删除尾;  
	removeFirstOccurrence(Object o) 删除第一次出现的指定元素
    removeLastOccurrence(Object o)  删除最后一次出现的指定元素

获取元素
	getFirst():	获取第一个元素;  
	getLast():		获取最后一个元素
	peekFirst():	获取第一个元素,但是不移除; 
	peekLast():	获取最后一个元素,但是不移除;
  • 3.普通队列操作

尾部添加 头部删除 获取元素也是获取头部第一个元素 返回值 关心
add(E e) 在队列尾部添加一个元素
offer(E e) 在队列尾部添加一个元素,并返回是否成功
remove() 删除队列中第一个元素, 并返回该元素的值,如果元素为null,将抛出异常
poll() 删除队列中第一个元素, 并返回该元素的值,如果元素为null,将返回null
element() 获取第一个元素,如果没有将抛出异常
peek() 获取第一个元素,如果没有返回null

  • 4.栈操作

    头部添加 头删除

  • Cloneable:可以实现克隆

  • Serializable:可以实现序列化

Stack
public
class Stack<E> extends Vector<E> 

继承Vector,具有其特征,同现场安全,重新实现自己的先入后出

Vector
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

和ArrayList特点一样

ArrayList 和Vector的异同

1)从继承的接口来看:
实现的接口相同,特点相同
2)底层实现上来看
都是数组实现,调用方法没有区别
3)从源码上来看
a:
ArrayList 的初始数组大小为空
Vector的初始数组大小为10
b:
扩容方法:Vector更合理
ArrayList 以1.5倍扩容,如果目前元素时1000,再增加1个,则要1.5倍扩容,会造成499个空间的浪费。
Vector默认2倍扩容,如果增长因子大于零,则扩容增长因子个大小。
c:
线程安全问题:
Vector:方法都用了Synchronized 来修饰,是线程安全,缺点(锁加在方法上效率低)(同HashTable)
ArrayList :没有加锁是线程不安全的
4)使用场景
如果需要考虑线程安全问题,则选择Vector
如果不考虑线程安全问题,则选择ArrayList
(为什么不考虑线程安全问题时不使用Vector?
答:加锁操作是非常耗时的

常见面试题?

1、数组和集合的区别?
2、ArrayList、LinkedList、Vector区别
(底层数据结构、初始容量、方法、扩容机制、线程安全、使用场景上)
3、迭代器:设计模式
解释
让代码更加有序并不是越多越好
(1)提供一种统一的遍历方式,(2)不暴露其内部结构
ListIterator可以双向遍历(传参)
iterator只能单向遍历

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值