集合Collection总结
java基础中最重要的东西 —–集合
无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我花了一些时间,查阅了一些资料,总结了一下
一. 集合介绍
1.1为什么需要Collection
集合类的出现:java是一门面向对象的语言,就免不了处理对象,为了方便操作多个对象,那么我们就得把这多个对象存储起来,想要存储多个对象(变量),很容易就能想到一个容器——-
常用的容器我们知道有—>StringBuffered,数组,但是由于数组的长度固定;访问方式单一,只能用下标;删除数据,数据不连续,需要往前移动数据;插入数据,数据要向后移动,这些缺点,
所以,java就为我们提供了集合(Collection).
1.2 数据和集合的区别
区别:
1.长度的区别
数组的长度固定;集合的长度可变。
2.内容的区别
数组存储的是同一种类型的元素
集合可以存储不同类型的元素(一般我们不这样做)
3.元素的数据类型
数组可以存储基本数据类型,和引用类型
集合只能存储引用类型(若是简单的int,它会自动装箱成Integer)
1.3Collection的由来与功能
Collection的由来:
集合可以存储多个元素,但是我们对多个元素也有不同的需求
- 多个元素,不能有相同的
- 多个元素,能够按照某个规则排序
针对不同的需求:java就提供了很多集合类,多个集合类的数据机构不同,但是,数据结构不重要,重要的是能够存储东西,能够判断,获取,把集合共性的内容不断往上提取,最终形成集合的继承体系—-
———Collection
集合(4接口,9类),Iterator,增强for,可变参数,集合工具类
Colletcion的大致结构体系是:
-1.3.1 Collection接口
Collection是最基本的集合接口,一个Collection代表一Object,即Collection的元素(Elements),java sdk不提供直接继承自Collection的类,java SDK提供的类都是继承自Collection的“子接口”如List和Set
1.) Collection的基础功能:
-
Collection:单列集合的顶层接口,定义了单列集合的共性内容
package java.util;
public interface Collection<E> extends Iterable<E> {
// Query Operations
//查询的一些方法
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
// Modification Operations
//修改的一些方法
boolean add(E e);
boolean remove(Object o);
// Bulk Operations
//一些批量操作的方法
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
// Comparison and hashing
//和hash对比
boolean equals(Object o);
int hashCode();
成员方法: A:添加功能
boolean add(Object obj):往集合中添加一个元素
boolean addAll(Collection c):往集合中添加多个元素(即添加一个集合)
B:删除功能
void clear():清空所有元素
boolean remove(Object o):从集合中删除一个元素
boolean removeAll(Collection c):从集合中删除另一个集合的元素
C:判断功能
boolean contains(Object o):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含另一个集合的元素
boolean isEmpty():判断集合是否为空。
D:交集功能
boolean retainAll(Collection c) :移除此 collection 中未包含在指定 collection 中的所有元素,如果此 collection 由于调用而发生更改,则返回true。
E:迭代器(集合特有的遍历方式)
Iterator iterator()
重点:Iterator的使用
A:使用步骤
B:迭代器原理
F:长度功能
int size():返回集合中元素的个数
练习题:数组有length()吗?字符串有length()吗?集合有length()吗?
答:数组里面是length属性;字符串里面是length()方法;集合里面是size()方法
G:集合转数组
我们可以发现Collection的源码中继承了Iterable,有iterator()这个方法…
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代器对象:如下
迭代器使用步骤:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
遍历集合的方法:
(1)将集合转成数组,遍历数组(不常用)
(2)迭代器遍历(创建迭代器对象,用while循环调用hasnext()方法判断下一个元素是否存在,然后调用迭代器的next()方法)
(3)用foreach直接进行遍历
格式:for(数据类型 变量名:要遍历的集合名){
直接输出变量;
}
1.5 数据存储结构总结
一)Collection接口:存储单列数据:
(1)List:单列有序集合(可以重复):
A、ArrayList:底层结构是数组,底层查询快,增删慢(非线程安全,效率高);
B、LinkedList:底层结构是链表型的,增删快,查询慢(线程不安全,效率高);
C、vector:底层结构是数组,线程安全的,增删慢,查询快(不常用);
(2)Set:单列无序集合(唯一):
A、HashSet:底层结构是哈希表
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
按照哈希算法来存取集合中的元素,存取速度比较快;
B LinkedHashSet
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。
C、TreeSet:基于红黑树数据结构,实现元素的“自然排序”;
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
二)Map接口:存储键、值的双列数据集合:
a Map集合的数据结构仅仅针对键有效,与值无关。
b 存储的是键值对形式的元素,键唯一,值可重复。
A HashMap
底层数据结构是数组和链表。线程不安全,效率高
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
B、LinkedHashMap:
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。
C、TreeMap:
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
D、HashTable:
底层数据结构是哈希表。线程安全,效率低
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
1.6 我们怎么选择集合类型?
是否是键值对象形式:
是:Map
键是否需要排序:
是:TreeMap
否:HashMap
不知道,就使用HashMap。
否:Collection
元素是否唯一:
是:Set
元素是否需要排序:
是:TreeSet
否:HashSet
不知道,就使用HashSet
否:List
要安全吗:
是:Vector(其实我们也不用它,后面我们讲解了多线程以后,我在给你回顾用谁)
否:ArrayList或者LinkedList
增删多:LinkedList
查询多:ArrayList
不知道,就使用ArrayList
不知道,就使用ArrayList
1.7 集合的常见方法及遍历方式
Collection常见的方法:add() , remove(), contains() , iterator() size()
遍历方式:增强for ,迭代器,
list集合的遍历:3种-1)for循环 2)迭代器 3)增强for循环
set集合的遍历(元素默认是无序的):2种-1)迭代器 3)增强for循环
map集合的遍历:4种
Map接口没有继承Iterator ,所以不能直接使用迭代器
(1)keySet() //取出所有的键,放入一个Set类型集合
(2)keyvules() //取出所有的值,放入一个Collection集合
(3)entrySet() //取出所有的Entry对象,放入一个Set类型集合
//可以对一组键迭代遍历
//对一组值迭代遍历
//对一组Entry对象迭代遍历
注意:用迭代器遍历时不能删除元素
(4)