lesson8:java的集合类

一.为什么需要集合类

我们在编程时,常常需要集中存放多个数据,这个时候,我们可能会想到数组,但是数组的长度是固定的,于是我们就有了集合,java中的集合类是特别有用的工具,可以存放数量不等的多个对象,并且可以实现映射关系的关联数组。

二.java集合的框架

java集合的框架主要有Collection和Map这两个顶级接口派生出来,Collection下有Set(无序不可重复集合)、List(有序可重复集合),Queue(队列,FIFO原则),这三大接口,Map则是一一对应的键值对形式的集合类。给大家摘两张来自疯狂java讲义的集合框架图
在这里插入图片描述
在这里插入图片描述
Collection集合主要有以下方法:
boolean add(E e) 确保此 collection 包含指定的元素(可选操作)。
boolean addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
void clear() 移除此 collection 中的所有元素(可选操作)。
boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true。
boolean containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。
boolean equals(Object o) 比较此 collection 与指定对象是否相等。
int hashCode() 返回此 collection 的哈希码值。
boolean isEmpty() 如果此 collection 不包含元素,则返回 true。
Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。
boolean remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
boolean retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
int size() 返回此 collection 中的元素数。
Object[] toArray() 返回包含此 collection 中所有元素的数组。
T[] toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

1.List接口

List是Collection子接口,可以用Collection中所有的方法,集合中数据都是有序可重复的数据。可以通过索引来找到指定的集合元素,它添加了一些根据索引来操作集合元素的方法。
void add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。
boolean addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
E get(int index) 返回列表中指定位置的元素。
int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
E remove(int index) 移除列表中指定位置的元素(可选操作)。
E set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。
List subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分集合。
List集合中比较集合类元素是否相同的方法只是比较对象的equals方法
List接口的几个子类
ArrayList和Vector,默认长度是10, Vector是线程安全的,而Arraylist不是,可以调用Collections.synchronizedList(list)这个方法,手动使得线程安全。Vector还有个Stack的子类,模拟了栈(FILO)的数据结构,提供了以下几个方法:
boolean empty()
查看堆栈是否为空。
E peek()
查看堆栈顶部的对象,但不从堆栈中移除它。
E pop()
移除堆栈顶部的对象,并作为此函数的值返回该对象。
E push(E item)
把项压入堆栈顶部。
int search(Object o)
返回对象在堆栈中的位置,以 1 为基数。

2.Queue接口

模拟了队列的数据结构(FIFO),队头数据保持时间最长,队尾保持时间最短,插入(offer)数据是插到队尾,访问(poll)数据是访问对头。通常队列不容许随机访问。
定义了以下常用的方法:
boolean add(E e)
将指定的元素插入此队列(如果立即可行且不会违反容量限制)的尾部,在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
E element()
获取,但是不移除此队列的头。
boolean offer(E e)
将指定的元素插入此队列(如果立即可行且不会违反容量限制)的尾部,当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
E peek()
获取但不移除此队列的头;如果此队列为空,则返回 null。
E poll()
获取并移除此队列的头,如果此队列为空,则返回 null。
E remove()
获取并移除此队列的头。
Queue的几个子类:
LinkList是Queue的实现,既是List的实现类(可以随机访问元素),但是访问并不是很好,因为基于链表实现的,又实现了Dequeue接口(双向队列),可以进行队列的操作。
查看Api我们得知,LinkList有以下常用方法:
boolean add(E e)
将指定元素添加到此列表的结尾。
void add(int index, E element)
在此列表中指定的位置插入指定的元素。
boolean addAll(Collection<? extends E> c)
添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序。
boolean addAll(int index, Collection<? extends E> c)
将指定 collection 中的所有元素从指定位置开始插入此列表。
void addFirst(E e)
将指定元素插入此列表的开头。
void addLast(E e)
将指定元素添加到此列表的结尾。
void clear()
从此列表中移除所有元素。
Object clone()
返回此 LinkedList 的浅表副本。
boolean contains(Object o)
如果此列表包含指定元素,则返回 true。
Iterator descendingIterator()
返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。
E element()
获取但不移除此列表的头(第一个元素)。
E get(int index)
返回此列表中指定位置处的元素。
E getFirst()
返回此列表的第一个元素。
E getLast()
返回此列表的最后一个元素。
int indexOf(Object o)
返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
int lastIndexOf(Object o)
返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
ListIterator listIterator(int index)
返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。
boolean offer(E e)
将指定元素添加到此列表的末尾(最后一个元素)。
boolean offerFirst(E e)
在此列表的开头插入指定的元素。
boolean offerLast(E e)
在此列表末尾插入指定的元素。
E peek()
获取但不移除此列表的头(第一个元素)。
E peekFirst()
获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
E peekLast()
获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
E poll()
获取并移除此列表的头(第一个元素)
E pollFirst()
获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
E pollLast()
获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
E pop()
从此列表所表示的堆栈处弹出一个元素。
void push(E e)
将元素推入此列表所表示的堆栈。
E remove()
获取并移除此列表的头(第一个元素)。
E remove(int index)
移除此列表中指定位置处的元素。
boolean remove(Object o)
从此列表中移除首次出现的指定元素(如果存在)。
E removeFirst()
移除并返回此列表的第一个元素。
boolean removeFirstOccurrence(Object o)
从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。
E removeLast()
移除并返回此列表的最后一个元素。
boolean removeLastOccurrence(Object o)
从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。
E set(int index, E element)
将此列表中指定位置的元素替换为指定的元素。
int size()
返回此列表的元素数。
PriorityQueue是一个比较标准的队列的实现类,它的peek和poll是按照取出最小的元素来取得,它有个元素实现Comparable这个接口的概念,所以不能添加null。它的队列元素排序有两种。一种是自然的排序:指的是集合元素是同类别的实现了comparable这个接口的排序,另外一种是创建集合是传入Comparator对象,这个对象负责给元素排序,采用此排序时,不要求所有元素都实现comparable这个接口

3.Set接口

Set集合中存放的元素是不可重复的无序的元素,在Collection基础上没有提供额外的方法,不过是以不同的行为即不可重复的元素,Set比较元素是否相同只是比较equals方法。
Set接口的几个子类,
HashSet是一个常用的实现类,它不能保证元素的顺序,不可重复,不是线程安全的,它是按照hash算法你来存储元素的。集合元素可以为 NULL的几个特点,其底层其实是一个数组,存在的意义是加快查询速度。我们知道在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较,此时的查询效率依赖于查找过程中比较的次数。而 HashSet 集合底层数组的索引和值有一个确定的关系:index=hash(value),那么只需要调用这个公式,就能快速的找到元素或者索引。对于 HashSet: 如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。
b.LinkHashSet,是HashSet的子类。不可以重复,有序的,因为底层采用链表和哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性,相对于HashSet它的效率会低一些,但是迭代全部元素时会有更好的性能,因为它以链表的形式来维护内部顺序。
c.TreeSet,它是SortSet唯一子类,确保元素排序,排序方法并不是按照插入顺序是根据集合中的元素的compareTo(Obj obj)方法排序,类似于PriorityQueue的排序。
d.EnumSet,添加枚举类型的集合,不可以添加NULL,有序的,按照在枚举类中顺序添加到集合中去。

4.Map接口

Map用于保存映射关系的数据集合。
Map与Set相似,有HashMap、LinkHashMap、TreeMap,EnumMap等。定义了以下方法:
void clear()
删除映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o)
比较指定的对象与此映射是否相等。
V get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode()
返回此映射的哈希码值。
boolean isEmpty()
如果此映射未包含键-值映射关系,则返回 true。
Set keySet()
返回此映射中包含的键的 Set 视图。
V put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。
V remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size()
返回此映射中的键-值映射关系数。
Map的几个子类
HashMap和Hashtable,他们都是Map的实现类,类似于ArrayList和Vector,一个是非线程安全,一个是线程安全,Hashtable从jdk1.0,基本已经弃用,如果考虑到线程安全,可以使用Collctions工具类将HashMap变成线程安全类。他们都与HashSet存储元素的方式一样,比较集合类元素value是否相等,只是比较equals方法,如果是比较key则是需要比较equals和hashcode
2.LinkHashMap,它是HashMap的子类,内部由双向链表维护key-value的次序,迭代顺序与插入顺序一致。
3.TreeMap,类似于TreeSet.

本文只是对java集合类做个简单的介绍总结。如有不当之处,烦请大神指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值