容器

**概念:**用来存放其他类的一种类,被称为容器或集合。

**为何需要容器?**数组可以用来存放数据,但数组一旦生成就不能改变大小,而且数组只能存放相同的数据类型。

容器关系图:(补充:Map接口下还有HashTable,做图的时候忘记了)
自学笔记:Java容器


Iterator接口

是一个迭代器,因为创建代价小,被称为“轻量级”对象。开发人员在不了解序列底层结构的情况下,对其进行遍历。

hasNext():检查序列下一个元素是否存在,有则返回true。
next ():返回序列的下一个元素。
remove():将迭代器上次返回的元素从集合中删除。必须先调用next(),才能使用remove()。


Collection接口

集合框架的两种类型其中之一。有三个子接口:List,Set,Queue。

其中定义了集合操作的常用方法:基本操作,批量操作,数组操作,流操作。

boolean add(E e):添加元素
boolean remove(Object o):删除元素
boolean contains(Object o):是否包含指定元素。
boolean isEmpty():集合是否为空。
int size():返回集合的大小
Iterator iterator():返回该集合的迭代器对象。
Object[] toArray():返回包含所有元素的对象数组。
void clear():将集合清空。
等。

List接口

是Collection接口的子接口,实现一种线性表的数据结构。是按照元素的添加顺序来存储数据的,因此List是有序的。
存放在List中的所有元素都有下标,可以通过下标操作元素。
其实现类有:ArrayList、LinkedList、Vector。

除了父接口Collection接口定义的方法外,List接口额外的定义了一些方法。
E get(int index):获取指定下标的元素。
E set(int index,E e):将指定下标的元素修改为e,并返回原来的值。
void add(int index,E e):将指定的值插入到指定下标
E remove(int index):删除指定下标的元素,并返回。
int indexOf(Object o):查找o第一次在集合中出现的下标。未查询到返回-1。
int lastIndexOf(Object o):最后一次出现的位置。
List subList(int begin,int to):返回一个从下标begin到to的子线程表。(含头不含尾)

Arraylist
是基于数组实现的List类。创建时不指定初始容量的话,初始容量为10,每次扩容1.5倍。线程不安全。

优点:适合遍历和查找。 原因:基于数组,元素的空间地址连续。
缺点:增删很慢。 原因:每次增删都需要对数组进行复制。

LinkedList
基于链表结构存储数据的。

优点:增删很快。 原因:与链表的结构有关,增删只需要改变前一个结点的后继和后一个节点的前驱即可。
缺点:查询和遍历慢。 原因:因为链表节点的地址值不一定连续。

Vector
与ArrayList相似,但它是线程安全的。也因为如此,它的效率没有ArrayList高。

Set接口

是Collection的子接口。其不允许重复的值。
实现类:HashSet、LinkedHashSet、TreeSet。

HashSet
底层是HashMap,存入元素时,会将元素存入HashMap中的key值,然后将统一的一个object对象作为value值。
不能保证存储的顺序,也不能保证顺序恒久不变,因此是无序的。
具有比较良好的查找存取性能。
***注意!!!***如果要将一个自定义类装入Hashset集合中,一定要重写夫hashCode()和equals()方法,详情见HashMap。

LinkedHashSet
继承HashSet的子类。底层结构比HashSet多了一根链表,用于维护存储顺序,因此Linked是有序的。
优缺点:遍历很快,增删由于需要维护链表,所以性能略低HashSet。

TreeSet
是一个有序的set集合。底层是红黑树,是一种特殊的AVL树(平衡二叉树)。
自定义类必须实现Comparable<T>接口,元素根据自然排序或者自定义类重写comPareto()。

Queue接口

是Collection接口的子接口之一。用于模拟队列这种数据结构,先进先出。


Map接口

Map接口是一个单独的接口。
该接口用于保存映射关系(键值对)。每个Entry都有“键”-“值”两个对象。键不能重复,值可以重复。键可以为null但只能有一个,值可以有多个为空。

方法:
V put(K key,V value):添加。如果key存在,则会覆盖掉,并返回旧值。
V get(K key):返回指定键的值。
V remove(K key):删除掉键值对。并返回值。
boolean containsKey(K key):是否包含key。
boolean containsValue(V value):是否包含value。
int size():但会键值对的个数。
boolean isEmpty():映射是否为空。

Set<K> keyset():返回一个有键组成的set集合对象。
Collection<V> values():返回一个由值组成的Collection对象。
Set<Map.Entry<K,V>> entrySet():返回一个Set集合对象,集合中的元素为键值对

HashMap
是无序集合,不能保证键值对的顺序恒久不变。
**原理:**底层是哈希表。自定义类作为key时必须重写hashcode()和equals()。
这是由于HashMap的key不能重复,存入key值时,会先根据哈希地址分配链表,如果已经有一个key的哈希地址和新key相同,则会在通过equals比较。而Object的hashCode()被native修饰,是一个原生函数,如果不重写的话,即使两个key的属性相同,得到的哈希地址也不同,这样就会导致HashMap存入相同的key。

哈希表:在java1.7之前,是数组+链表
java1.8之后,是数组+链表+红黑树。当链表长度达到8的时候,就转换为红黑树。

LinkedHashMap
与LinkedHashSet相似,在HashMap的基础上添加了一根链表,用于维护存储顺序。是有序集合

HashTable
与HashMap相似,但HashMap线程不安全。HashTable的方法上大多加上了synchonized关键字,是同步方法,所以是线程安全的。

TreeMap
与TreeSet相似。

Collections工具类

Java提供的对集合对象操作的工具类。大多对List进行操作,如排序,重排,查找,求极值等。

排序
static<T> void sort(List<T> list):对传入的list集合排序。
如自定义类,必须实现Comparable接口,重写compareTo()方法。
static<T> void sort(List<T> list,Comparator<? super T> c):根据自定义的排序规则排序

查找
static int binarySearch(List<T> list,T key):使用二分法,查找list集合中key的位置

打乱顺序
static void shuffle(List<?> list):打乱list集合中元素的位置

求极值
static <T>T max(Collection<? extends T> c):返回集合c中的最大值
static <T>T min(Collection<? extends T> c):返回集合c中的最小值

反转
static void reverse(List<?> list):反转list集合中元素的顺序


相关文章:

  • 2021-12-22
  • 2021-11-27
  • 2021-11-10
  • 2021-10-29
  • 2021-07-30
  • 2021-05-22
猜你喜欢
  • 2021-05-14
  • 2021-06-26
  • 2021-11-25
  • 2021-04-27
  • 2021-11-17
  • 2022-12-23
  • 2021-08-26
相关资源
相似解决方案