概念
一个用于存储和获取数据的容器,其由来是:我们所学习的编程语言是面向对象的,面向对象的编程语言对事物的描述都是通过对象来体现的,为了方便对多个对象进行操作,我们就必须把对个对象进行存储,而要想存储多个对象而不是我们之前所存储的基本变量,所以应该找一容器类型的变量。而Stringbuilder只能存字符串,数组的长度有限制,所以都无法满足我们的需求,所以Java就提供了集合类来供我们使用。
1、集合的体系结构
2、单列集合
Collection:最基本的集合接口,单列集合的顶层接口。Collection表示一组对象,这些对象也称为collection的元素。JDK不提供该接口的直接实现,而它提供更具体的子接口实现。创建Collection集合的对象,我们采用的是多态的方式。
成员方法
boolean remove(Object o):从集合中移除元素boolean add(E e):添加元素
void clear():清空集合中的元素
boolean contains(Object o):判断集合中是否存在指定的元素
boolean isEmpty():判断集合是否为空
2.1、List接口
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。
List集合的特点:
A:有序(存储和取出元素的顺序一致)
B:存储的元素可以重复
常用实现类:
ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,允许存储重复元素
LinkList:底层数据结构是链表,查询慢,增删快,线程不安全,效率快,允许存储重复元素
Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,允许存储重复元素
2.2、Set接口
Collection的子接口,Set接口定义了一种规范,表示该容器不记录元素的添加顺序,没有索引,也不允许元素重复。
Set集合的特点:
A:不允许元素重复
B:不会记录元素的添加先后顺序,不能使用普通的for循环遍历,只能使用增强的for循环和迭代器遍历。
常用实现类:
A:HashSet类:其不保证set的迭代顺序,不保证该顺序恒久不变.底层采用哈希表实现,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashcode()和equals()方法保证的,如果没有重写就无法保证元素的唯一性。
B:TreeSet类:底层采用红黑树实现,可以对集合中的元素排序
3、双列集合
双列集合是每个元素都有键与值两部分组成的集合,记录的是键值对对应关系,即通过键可以找到值,键必须是唯一,值可以重复,Map集合为双列集合的根接口,其没有继承Collection接口。
Map集合的常用方法:
- V put(K key,V value):添加元素
- V remove(Object key):根据键删除键值对元素
- void clear():移除所有的键值对元素
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean containsValue(Object value):判断集合是否包含指定的值
- boolean isEmpty():判断集合是否为空
- int size():返回集合中的键值对的对数
常用实现类:
HashMap
底层是基于哈希表算法,Map中存储的key对象和HashCode值决定了在哈希表中存储的位置,因为Map中的key是Set,所以不能保证添加的先后顺序,也不允许重复。
HashMap的特点
- HashMap是异步的,因此HashMap中的对象不是线程安全的
- HashMap最多只有一个key值为null,但是可以多个value值为null
- 作为key的对象必须实现hashCode和equals方法
TreeMap
TreeMap底层的key是基于红黑树,因为Map中的key也是一个Set集合,所以不能保证添加的先后顺序,且也不允许重复,因为Map中存储的key会默认使用自然排序(从小到大),和TreeSet一样,除了可以使用自然排序也可以自定义自己的排序
4、遍历
方式:普通for、迭代器、增强for
普通for循环是List方法特有的,因为他是有索引,有序的。List集合特有的ListIterator可以实现逆向遍历,但是要求先正向遍历,才能逆向遍历,因此也不常用。迭代器是所有集合都可用的。