-
目录
-
1.数组和集合的区别
- 1.1相同点
- 都是容器,可以存储多个数据
- 1.2不同点
- 数组的长度是不可变的,集合的长度是可变的
- 数组可以存基本数据类型和引用数据类型
- 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
- 1.1相同点
-
2.集合类体系结构
- 2.1集合体系结构
-
3.Collection集合
- 3.1Collection集合概述
- 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
- JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现
- 3.2创建Collection集合的对象
- 多态的方式
Collection<String> c = new ArrayList<>();
- 具体的实现类ArrayList
ArrayList<String> list = new ArrayList<>();
- 多态的方式
- 3.3Collection集合的常用方法
- boolean add(E e)
添加元素,List系列永远返回True,因为可以重复
- boolean remove(Object o)
从集合中移除指定的元素
- boolean removeIf(Object o)
根据条件进行移除
- void clear()
清空集合中的元素
- boolean contains(Object o)
判断集合中是否存在指定的元素。
底层是依赖equals方法进行判断是否存在的,所以,如果集合中存储的是自定义对象,
也想通过contains方法来判断是否包含,那么在JavaBean类中,一定要重写equals方法。
- boolean isEmpty()
判断集合是否为空
- int size()
集合的长度,也就是集合中元素的个数
- boolean add(E e)
- 3.4Collection集合的遍历
- 迭代器
- 迭代器介绍
不依赖索引- 迭代器是集合的专用遍历方式
- Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到 (默认指向0索引)
- Iterator中的常用方法
两个方法要对应这写- boolean hasNext(): 判断当前位置是否有元素可以被取出
- E next(): 获取当前位置的元素,并将迭代器对象移向下一个索引位置
- Collection集合的遍历
- 迭代器中删除的方法
- void remove(): 删除迭代器对象当前指向的元素
it.remove();(删除的是it指针指向的位置的值)
- void remove(): 删除迭代器对象当前指向的元素
- 细节
- 1.迭代器遍历完毕,指针不会复位
迭代器就好比是一个箭头,默认指向集合的0索引处
- 2.报错NoSuchElementException
循环结束之后,迭代器的指针已经指向了最后没有元素的位置
- 3.循环中只能用一次next方法
注意next方法的解释,会将迭代器对象移动下一个索引位置(集合位置只有一个指针,多个next会拿这一个指针去移动)
- 4.迭代器遍历时,不能用集合的方法进行增加或者删除
可以用迭代器中的删除方法
- 1.迭代器遍历完毕,指针不会复位
- 迭代器介绍
- 增强for
- 介绍
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
- 实现Iterable接口的类才可以使用迭代器和增强for
- 所有的单列集合和数组才能使用增强for进行遍历
- 简化数组和Collection集合的遍历
- 格式
- for(集合/数组中元素的数据类型 变量名 : 集合/数组名) {
- // 已经将当前遍历到的元素封装到变量中了,直接使用变量即可
- }
- 代码
- for(String str : list){
- System.out.println(str);
- }
- 细节
- 修改增强for中的变量,不会改变集合中原本的数据
将元素赋值给第三方变量(第三方变量是自己开一个空间)
- 修改增强for中的变量,不会改变集合中原本的数据
- 快速生成方式
- 集合名字+for 回车
- 介绍
- Lambda表达式
- 利用forEach方法,结合12.Lambda表达式的方式进行遍历
- default void forEach(Consumer<? super T> action);
- Consumer是一个函数式接口
- 迭代器
- 3.1Collection集合概述
-
4.ArrayList集合
- 4.1List集合的概述与特点
- 有序集合,这里的有序指的是存取顺序(存取有序)
- 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素(有索引)
- 与Set集合不同,列表通常允许重复的元素(可以重复)
- 4.2List集合的特有方法
- void add(int index,E element)
在此集合中的指定位置插入指定的元素
- E remove(int index)
删除指定索引处的元素,返回被删除的元素
- E set(int index,E element)
修改指定索引处的元素,返回被修改的元素
- E get(int index)
返回指定索引处的元素
- void add(int index,E element)
- 4.3List集合的五种遍历方式
- 迭代器
- 增强for
- Lambda表达式
- 普通for循环
- 4.4List集合中的两个删除的方法
- 直接删除元素(boolean remove(Object o))
- 通过索引进行删除(E remove(int index))
- 所以删除时 list.remove(1); 是删除1这个元素,还是1索引上的元素?
- 因为在调用方法的时候,如果方法出现了重载现象
- 优先调用,实参跟形参类型一致的那个方法。
- 4.5ArrayList源码分析
- 核心步骤:
- 1.创建ArrayList对象的时候,他在底层先创建了一个长度为0的数组。
添加第第一个元素时,底层会创建一个新的长度为10的数组。- 数组名字:elementDate,定义变量size。
size这个变量有两层含义:①:元素的个数,也就是集合的长度②:下一个元素的存入位置
- 数组名字:elementDate,定义变量size。
- 2.添加元素,添加完毕后,size++
- 1.创建ArrayList对象的时候,他在底层先创建了一个长度为0的数组。
- 扩容时机一
- 当存满时候,会创建一个新的数组,新数组的长度,是原来的1.5倍,也就是长度为15.再把所有的元素,全拷贝到新数组中。如果继续添加数据,这个长度为15的数组也满了,那么下次还会继续扩容,还是1.5倍。
- 扩容时机二
- 如果一次添加多个元素,1.5倍放不下,那么新创建数组的长度以实际为准。
- 添加一个元素时的扩容
- 流程图
- 添加多个元素时的扩容(有addall()方法一次添加多个元素)
- 流程图
- 核心步骤:
- 4.1List集合的概述与特点
-
5.LinkedList集合
- 5.1List集合的特点
- ArrayList集合:底层是数组结构实现,查询快、增删慢
- LinkedList集合:底层是链表结构实现,查询慢、增删快
- 5.2LinkedList集合的特有方法
- public void addFirst(E e)
在该列表开头插入指定的元素
- public void addLast(E e)
将指定的元素追加到此列表的末尾
- public E getFirst()
返回此列表中的第一个元素
- public E getLast()
返回此列表中的最后一个元素
- public E removeFirst()
从此列表中删除并返回第一个元素
- public E removeLast()
从此列表中删除并返回最后一个元素
- public void addFirst(E e)
- 5.3LinkedList源码分析
- 底层是双向链表结构
- 核心步骤:
- 1.刚开始创建的时候,底层创建了两个变量:一个记录头结点first,一个记录尾结点last,默认为null
- 2.添加第一个元素时,底层创建一个结点对象,first和last都记录这个结点的地址值
- 3.添加第二个元素时,底层创建一个结点对象,第一个结点会记录第二个结点的地址值,last会记录新结点的地址值
- 流程图
- 5.1List集合的特点
-
6.迭代器源码分析
- 迭代器遍历时的相关流程
7.List系列下集合(上篇)
最新推荐文章于 2024-09-27 00:45:01 发布