java.util 包中的集合类就像一个装有多少个对象的容器,提到容器就不难想到数组,集合与的数组的不同之处在于:
- 数组:长度固定,可以存储基本数据类型,也可以存储对象
- 集合:长度可变,只能存储对象类型(由于有包装类的存在,集合可以储存任何类型),集合给我们提供了丰富的API,功能更强大
1.什么是Collection
- 是单例集合的顶级接口,他表示一组对象,这些对象也称为Collection的元素
- JDK不提供此接口的任何实现类,他提供更具体的子接口(如Set和List)实现
2.怎么创建
由于Collection是接口,不能直接被实例化,所以我们采用多态方式创建
列如:
Collectioncon=new ArrayList<>(); //ArrayList是Collection的实现类
3.Collection常用方法
//添加方法 1. boolean add(E e) 确保此集合包含指定的元素(可选操作) 2.boolean addAll(Collection extends E> c) 将指定集合中的所有元素添加到此集合(可选操作) (Collection extends E> 解释: ·实现了Collection ·类型一定是E的子类 ·符号解释:?通配符) //删除方法 1.void clear() 从此集合中删除所有元素(可选操作) 2.boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作) 3.boolean removeAll(Collection> c) 删除指定集合中包含的所有此集合的元素(可选操作) //判断 1.boolean isEmpty() 如果此集合不包含元素,则返回 true 2.boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 3.boolean containsAll(Collection> c) 如果此集合包含指定 集合中的所有元素,则返回true //数组转换 Object[] toArray() 返回一个包含此集合中所有元素的数组
4.Collection集合的遍历(迭代器)
Iterator(迭代器):
Iteratoriterator() 返回此集合中的元素的迭代器,通过集合的iterator()方法得到的,依赖于集合而存在
Iterator迭代器作用:遍历集合
常用方法:
1.boolean hasNext() 如果迭代具有更多元素,则返回 true 2.E next() 返回迭代中的下一个元素
例题:
//创建Collection集合,并且规定泛型为String类型 Colletioncon=new ArrayList<>(); //向集合中添加元素 con.add("张三"); con.add("李四"); con.add("王五"); //进行集合遍历 //返回此集合中的元素的迭代器,通过集合的iterator()方法得到的 Iterator iterator = con.iterator(); //用while循环遍历,判断是否有下一个元素 while (iterator.hasNext()){ //如果有元素,则通过next()方法获取下一个元素 String next = iterator.next(); System.out.println(next);
遍历集合的三种方式
public class IteratorTest {
public static void main(String[] args) {
ArrayList str = new ArrayList<>();
str.add("jj");
str.add("hh");
str.add("ll");
//迭代器遍历
// Iterator iterator = str.iterator();
// while (iterator.hasNext()){
// String next = iterator.next();
// System.out.println(next);
//for循环遍历
// for (int i = 0; i < str.size(); i++) {
// String s = str.get(i);
// System.out.println(s);
// }
//增强for循环
for (String s1:str){
System.out.println(s1);
}
}
}
//}
二、List集合(底层是数组)
1.List集合概述
- 有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set集合不同,列表通常允许重复的元素
2.List集合的特点
- 有序:储存和取出的元素一致
- 可重复:储存的元素可以重复
3.List集合特有方法
1.E get(int index) 返回此列表中指定位置的元素 2.E set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素 3.void add(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作) 4.boolean removeAll(Collection> c) 从此列表中删除包含在指定集合中的所有元素(可选操作) ......
4.List迭代器
- ListIterator迭代器是接口,继承于Iterator接口
ListIterator迭代器常用方法
新增了倒数遍历方法(但是不常用):
- boolean hasPrevious() 返回 true如果遍历反向列表,列表迭代器有多个元素
- E previous() 返回列表中的上一个元素,并向后移动光标位置
例题
//创建一个list的集合
List list = new ArrayList();
//向末尾添加元素
list.add("吴用"); //0
list.add("刘唐"); //1
list.add("宋江"); //2
System.out.println(list);
//我们在1处的索引位置来插入元素,我们插入一个元素的话,改索引后面的元素都会向后移动一位
list.add(1, "晁盖");
System.out.println(list);
//创建一个集合
List list1 = new ArrayList();
list1.add("阮小五");
list1.add("阮小二");
list1.add("阮小⑦");
list.addAll(list1);
System.out.println(list);
//通过ListIterator的方式遍历
ListIterator listIterator = list.listIterator();while(listIterator.hasNext()){
//获得迭代的元素
String str = (String) listIterator.next();
if("刘唐".equals(str)){
//我们不能在一边遍历的时候一边操作集合,这样有多线程的并发问题
//list.add("白胜");
//迭代器可以给我们提供了一个add方法让我们避免并发问题,但是添加的时候本次遍历不生效
listIterator.add("白胜");
}
System.out.println(str);}System.out.println(list);
ArrayList(是接口List的实现类)
1.ArrayList 特点
- ArrayList中的元素可以重复
- 是有序的集合,长度可以改变,不固定
- 线程不安全(线程并发异常ConcurrentModificationException),效率性能高
- ArrayList 的底层是数组的原理,查询快,增删慢
- 默认初始化容量是10
2.长度变化
- ArrayList 在添加数据的时候初始的长度是10,后续会以5个长度来扩充集合的长度
1.特点
- 也是线程不安全的
- 底层结构是链表原理,查询慢,增删快
- linkedList中的元素可以重复
- 是有序的集合,长度可以改变,不固定
- 默认初始化容量是0
2.特有方法
1.特点
- 线程安全,性能底
- 底层结构是数组
- 可以改变长度,默认初始化容量10
ArrayList 和 linkedList 的区别:
1.ArratList 底层结构是数组,linkedList 底层结构是链表,他们的特性也是由其数据结构决定的
2.ArrayList 的初始化时默认10容量,linkedList 初始化时默认0容量
3.对于随机访问 get() 和 set() 方法,ArrayList(查询块,增删慢)要优于linkedList
4.对于添加 add() 和 删除 remove() 方法,linkedList(查询慢,增删快)优于ArrayList
ArrayList 和 Aector 的区别
1.线程安全:
Vector使用了Synchronized 来实现线程同步, 是线程安全
的,而ArrayList 是非线程安全的。
2.性能:
ArrayList在性能方面要优于Vector。
3.扩容:
ArrayList和Vector都会根据实际的需要动态的调整容量,只不
过在Vector扩容每次会增加1倍,而ArrayList只会增加50%。
1.Set集合的概述和特点
- 不包含重复元素
- 没有带索引的方法,所以不能用for循环,可以使用for增强和迭代器
- 无序集合,对集合顺序不做保证
2.创建方法
Setset=new HashSet (); //HashSet是Set接口的实现类
3.常用方法
都是继承Collection的方法,一样
1.HashSet 的特点
- 底层数据结构是哈希表
- 无序的集合,元素储存顺序和取出顺序不一致
- 线程不安全,性能高
- 是由HashMap支持的,HashSet集合,索引功能都是由HashMap提供,默认初始容量是16
2.什么是哈希值:
哈希值是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
获取方法
Object 类中有一个方法可以获取对象的哈希值
- public int 话说hashCode() 返回对象的哈希值码
对象哈希值的特点
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下,不同对象的哈希值是不同的,而且重写hashCode()方法,可以实现让不同对象的哈希值相同
3.HashSet 集合保证元素唯一性源码分析
linkedList集合(是Set集合的实现类)linkedList集合的概述和特点
- 哈希表和链表实现的 Set 接口,具有可预测的迭代次序
- 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
- 由哈希表保证元素统一,也就是说没有重复的元素
- 初始容量是16
1.特点
- 元素有序,这里的顺序指的不是存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
TreeSet(): 根据其元素的自然排序进行排序
TreeSet(Comparator comparator): 根据指定的比较器进行排序 - 没有带索引的方法,所以不能使用for循环遍历
- 由于是Set集合,所以不包含重复元素的集合
2.自然排序 Comparable 的用法
例子:
先创建一个Student类
再写一个测试类
总结:
- 用 TreeSet 集合储存自定义对象,无参构造方法使用的是自然排序对元素进行排序的
- 自然排序,就是让元素所属的实现类实现Comparable接口,重写compareTo(To) 方法
- 重写方法时,一定要注意排序规则必须按照要求的主要条件和条件来写
3.比较器排序 Comparator 的使用
例题可以参照 自然排序写
4.增加的方法



