Collection集合(1)
数组和集合对比
- 相同点
都是容器,可以存储多个数据
- 不同点
- 数组的长度是不可变的,集合长度是可变的
- 数组可以保存基本数据类型和引用数据类型,集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
public class MyArrays {
/*
数组的长度是不可变的,集合长度是可变的
数组可以保存基本数据类型和引用数据类型,集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
*/
public static void main(String[] args) {
// 数组长度是不可变的,集合长度是可变的
// 定义一个初始长度为10的数组
int[] arr = new int[10];
arr[0] = 1;
// 数组可以存储引用数据类型,也可以存基本数据类型
String[] arrStr = new String[10];
arrStr[0] ="abc";
// 集合存储引用数据类型
ArrayList<String> arrayListStr= new ArrayList<String>();
arrayListStr.add("ace");
// 定义一个集合,存储的数据类型为Integer,也就是int类型的包装类,
// 当尖括号中直接输入基本类型的时候会报错
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(10);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeYh3Eq8-1606381370377)(C:\Users\云酱\Desktop\图片\01_集合类体系结构图.jpg)]
Collection常用方法
1.什么是Collection集合
Collection是单列集合的顶级接口,他没有直接的具体实现类,有两个子接口,分别是Set和List
2.如何创建Collection集合对象
- 多态的方式
Collection<String> collection = new ArrayList<String>();
- 具体的实现类,ArrayList,LinkedList,HashSet,TreeSet
3.Collection集合常用的方法
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
boolean removeIf(Object o) | 根据条件进行移除 |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中元素的个数 |
public class MyCollectionDemo1 {
public static void main(String[] args) {
// 创建一个集合,这里采用多态的方式进行创建
Collection<String> collection = new ArrayList<String>();
// 添加元素
collection.add("aaa");
collection.add("bbb");
collection.add("bbb");
collection.add("ccc");
collection.add("ddd");
collection.add("fffff");
// 输出集合的长度
System.out.println(collection.size());
// 从集合中移除指定元素
// 根据集合的特性,删除一个元素,它后面的元素都会往前移动一下
// 所以删除的时候我们控制一下这种情况
for (int i = 0; i < collection.size(); i++) {
// 如果删除了指定元素,就后退一个索引,然后继续遍历寻找,直到删除所有指定元素
if (collection.remove("bbb")) {
i--;
}
}
// 查看是否删除了集合中所有的指定元素
System.out.println(collection);
// 根据条件进行移除,括号中的正则表达式是 boolean test(T t);
collection.removeIf((String s)->{
return s.length()==5;
});
System.out.println(collection);
// 判断集合中是否存在指定的元素,存在返回true,不存在返回false
System.out.println(collection.contains("aaa"));
// 清空集合中的元素
collection.clear();
System.out.println(collection);
// 判断集合是否为空,空返回true,非空返回false
System.out.println(collection.isEmpty());
}
}
Collection-迭代器的基本使用
1.什么是迭代器
迭代器是集合专用的遍历方式(迭代器就是一个对象)
2.如何创建迭代器
Iterator<String> iterator = collection.iterator();
返回此集合中元素的迭代器,该迭代器对象默认指向当前集合0索引
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rxr126bg-1606381370382)(C:\Users\云酱\Desktop\图片\迭代器.png)]
3.Iterator中的常用方法
boolean hasNext():判断迭代器指向有没有超过集合的大小
E next();将迭代器指向移向下一个索引位置,同时获取当前位置的元素.
4.Collection集合的遍历
public class MyCollectionDemo5 {
public static void main(String[] args) {
// 创建一个集合,这里采用多态的方式进行创建
Collection<String> arrayList = new ArrayList<String>();
// 添加元素
arrayList.add("aaa");
arrayList.add("bbb");
arrayList.add("bbb");
arrayList.add("ccc");
arrayList.add("ddd");
arrayList.add("fffff");
// 使用迭代器进行遍历
Iterator<String> iterator1 = arrayList.iterator();
while (iterator1.hasNext()){
String str = iterator1.next();
System.out.println(str);
}
}
}
迭代器的原理分析
迭代器原理(三个方法)
1.Iterator 对象名 = 集合名.iterator():获取迭代器对象,默认指向0索引
2.boolean hasNext():判断迭代器指向有没有超过集合的大小
3.E next():将迭代器指向移向下一个索引位置,同时获取当前位置的元素
// iterator
Iterator<String> iterator1 = arrayList.iterator();
while (iterator1.hasNext()){
String str = iterator1.next();
System.out.println(str);
}
迭代器中删除的方法
void remove:删除迭代器对象当前指向的元素
public class MyCollectionDemo6 {
public static void main(String[] args) {
// 创建一个集合,这里采用多态的方式进行创建
Collection<String> arrayList = new ArrayList<String>();
// 添加元素
arrayList.add("aaa");
arrayList.add("bbb");
arrayList.add("bbb");
arrayList.add("ccc");
arrayList.add("ddd");
arrayList.add("fffff");
// 使用迭代器进行遍历
Iterator<String> iterator1 = arrayList.iterator();
while (iterator1.hasNext()){
String str = iterator1.next();
// 使用String类中的equals的方法,对比获取到的元素,然后删除
if(str.equals("aaa")){
iterator1.remove();
}
}
System.out.println(arrayList);
}
}
注意:迭代器不能修改和添加元素
增强for循环-基本应用
1.什么是增强for
简化数组和Collection集合的遍历,比迭代器简单,也比for循环简单
2.如何使用?
for(集合/数组元的数据类型 变量名:集合/数组名){
System.out.println(变量名);
}
3.增强for的原理
他是JDK5之后出现的,内部原理也是一个Iterator迭代器(数组是for,集合为Iterator)
4.增强for的应用场景
实现Iterable接口的类,才可以使用迭代器和增强for(数组)
- 示例代码
public class MyCollectionDemo4 {
public static void main(String[] args) {
// 创建一个集合,这里采用多态的方式进行创建
Collection<String> arrayList = new ArrayList<String>();
// 添加元素
arrayList.add("aaa");
arrayList.add("bbb");
arrayList.add("bbb");
arrayList.add("ccc");
arrayList.add("ddd");
arrayList.add("fffff");
// 使用增强for遍历数组
// 使用增强for遍历数组
// 数据类型是集合中元素的类型
// String 是传入集合中所存元素的类型
// s仅仅是一个变量名而已,在循环的过程中表示集合中的每一个元素
// arrayList就是要遍历的集合或者数组
for (String s : arrayList) {
System.out.println(s);
}
}
}
增强for的注意事项和三种遍历应用的场景
1.注意事项
在增强for循环中无法改变数组或集合中的元素(Iterator)
2.三种遍历应用的场景
增强for:
对集合进行遍历时候进行使用,遍历过程中如果要增删元素,就不能使用
迭代器(Iterator):
遍历过程中,需要取出元素,再删除元素时候使用,否则报错
普通for:
普通遍历在需要增删元素,或其他操作时候使用
注意!!!注意!!!注意!!! 增强for可以操作数组和集合,而迭代器只能操作集合
List集合
1.什么是List集合
- 有序集合,这里有序说的是存储有序
- 用户可以精确控制列表中每个元素的插入位置,用户可以通过索引访问元素
- 与set集合不同,列表一般允许存储重复的元素
2.List集合特点
- 存取有序
- 元素可以重复
- 有索引
List集合的特有的方法
方法名 | 说明 |
---|---|
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
public class MyCollectionDemo7 {
public static void main(String[] args) {
// 创建一个集合,这里采用多态的方式进行创建
List<String> arrayList = new ArrayList<String>();
// 添加元素
arrayList.add("aaa");
arrayList.add("bbb");
arrayList.add("ccc");
arrayList.add("ddd");
arrayList.add("fffff");
// 在此集合中的指定位置插入指定的元素
// 在1索引位置插入元素nnn
// 在使用方法的时候注意,你创建的对象的时候,用的是否是List集合
// =.=!!! 我就用错用了Collection
arrayList.add(1,"nnn");
System.out.println(arrayList);
// 删除指定索引的元素,返回值是被删除的元素
// 我们把索引2处bbb删除,并打印输出一下
System.out.println(arrayList.remove(2));
System.out.println(arrayList);
// 修改指定索引出的元素,返回被修改的元素
// 我们把4索引处的五个f修改为三个,然后返回一下被修改的元素
System.out.println(arrayList.set(4, "fff"));
System.out.println(arrayList);
// 返回指定索引处的元素
// 我们看下0索引下的元素是什么
System.out.println(arrayList.get(0));
System.out.println(arrayList);
}
}
数据结构,栈,队列,链表
数据结构之栈和队列
-
栈结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9OpcHK4-1606381370384)(C:\Users\云酱\Desktop\图片\栈结构图.png)]
栈结构遵循先进后出的原则
-
队列结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAmZFCRy-1606381370386)(C:\Users\云酱\Desktop\图片\队列结构图.jpg)]
队列遵循先进先出的原则,从队尾进队伍,然后从队头出队
数组和链表的特点
这里不详细说数组和链表,只简单说一下他们的特点
数组的特点: 查询快,增删慢
链表的特点:增删快,查询慢
数组用的比较多,比较广泛
ArrayList源码解析
1.ArrayList的底层是一个数组
2.当初始化ArrayList时候,数组长度为0
3.当第一次添加元素的时候,数组的长度为10
(特别注意的是,你使用length方法或者size方法,获取的是当前集合或数组中所存元素的个数,不要搞混了)
4.以后添加时,如果数组的长度不满足时,进行扩容,按照1.5倍来进行扩容
5.扩容之后,将原数组的元素拷贝到新的数组中
List集合的实现类
LinkedList的基本应用
LinkedList与ArrayList的区别
1.ArrayList集合的特点
底层是数组结构实现的,查询快增删慢
2.LinkedList集合特点
底层是链表结构实现的,查询慢,增删块
LinkedList集合的特有功能
- 特有方法
方法名 | 说明 |
---|---|
public void addFirst(E e) | 在该列表的开头插入一个元素 |
public void addLast(E e) | 在该列表的末尾插入一个元素 |
public E getFirst() | 返回此列表的第一个元素 |
public E getLast() | 返回此列表的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
- 示例代码
public class MyCollectionLinkedList {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("默默");
linkedList.add("主宰");
linkedList.add("三千");
// 在该列表的开头插入一个元素
linkedList.addFirst("时光不老,我们不散");
for (String s : linkedList) {
System.out.println(s);
}
System.out.println("------我是一条华丽的分割线------");
// 在该列表的末尾插入一个元素
linkedList.addLast("在黑马学习的日子,我过的很充实,也很开心,希望接下来的日子,我能学到更多的知识");
linkedList.addFirst("时光不老,我们不散");
for (String s : linkedList) {
System.out.println(s);
}
System.out.println("------我是一条华丽的分割线------");
// 返回此列表的第一个元素
System.out.println(linkedList.getFirst());
System.out.println("------我是一条华丽的分割线------");
// 返回此列表的最后一个元素
System.out.println(linkedList.getLast());
System.out.println("------我是一条华丽的分割线------");
// 删除方法就不再演示了,因为这就是我现在想说的话,我不想删了它
}
}
LinkedList需要注意的事项的补充
get(Index)首先判断索引离头近,还是离尾近,如果离头近从开头查,离尾近,就从末尾查