目录
一、集合概述 128
总结:

二、Collection集合的体系特点 128
总结:
三、Collection集合常用API 129
代码展示:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
public class CollectionDemo {
public static void main(String[] args){
//ArrayList:添加的元素 有序、可重复、有索引
//HashSet:添加的元素 无序、不重复、无索引
Collection<String> list = new ArrayList<>();
Collection<String> list1 = new HashSet<>();
//1、添加元素,添加成功返回true
list.add("HTML");
list1.add("HTML");
list.add("Java");
list1.add("Java");
System.out.println(list.add("HTML"));//对于ArrayList 添加成功返回值为true
System.out.println(list1.add("HTML"));//对于HashSet 如果添加的是原数组中重复的元素那么返回值为false
System.out.println(list);
System.out.println(list1);
//2、清空集合的元素
// list.clear();
// System.out.println(list);
//3、判断结合是否为空,
// System.out.println(list.isEmpty());
// System.out.println(list1.isEmpty());
//4、获取集合的大小
System.out.println(list.size());
//5、判断集合中是否包含某个元素
System.out.println(list.contains("Java"));
System.out.println(list1.contains("java"));
//6、删除某个元素:如果有多个重复的元素默认删除首先出现的元素
list.remove("java");
System.out.println(list);
list1.remove("Java");
System.out.println(list1);
//7、把集合转换成数组 [HTML, Java, HTML] 由于原来定义的泛型只是字符串类型,如果我们需要添加一个整型数据类型,那么就需要对其进行转换成数组了
Object[] arrs = list.toArray();//转换成所有的数据类型
System.out.println("数组:" + Arrays.toString(arrs));
System.out.println("-------------拓展----------------");
//addAll将另外的一个数组中元素放置到另外的一个数组中进行补充添加
Collection<String> list2 = new ArrayList<>();
list2.add("xiaoliu");
list2.add("xiaodong");
list.addAll(list2);//将list2集合中的元素添加到list当中,进行补充添加
System.out.println(list);
}
}
结果展示:
四、Collection集合的遍历方式 129
4.1方式一:迭代器 129
使用循环,对集合中的内容进行查看。
代码展示:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo1 {
public static void main(String[] args){
Collection<String> c = new ArrayList<>();
c.add("赵敏");
c.add("小昭");
c.add("灭绝");
c.add("素素");
System.out.println(c);
//1、得到当前集合的迭代器对象
Iterator<String> it = c.iterator();//要和集合的泛型进行匹配,集合是String类型的
// String ele = it.next();//获取集合中元素,并进行输出出来。每使用一次,就会陆续向后读取一个元素内容
// System.out.println(ele);
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());//超过集合中的元素内容,会出现报错的情况。集合中有几个元素就用几个这个就行,next获取 多了就会出现报错的情况发生
//2、使用循环进行集合中元素内容的查看
while (it.hasNext()) {//hasNext()是判断集合中是否有元素存在的一个API,结果和上面的方法一的一样。没有元素有返回值为false
String ele = it.next();
System.out.println(ele);
}
}
}
结果:
技巧:
在迭代器中的循环当中,不要出现两次next,避免出现错误的情况发生。
总结:
4.2方式二:foreach/增强for循环 129
收获以及注意:
1、 正确的使用增强的for循环,需要准确记住其格式形式。
2、增强的for循环,可以对集合和数组进行遍历循环
3、快速使用增强for循环,如下所示:
4、修改无意义,不会影响原来集合或者数组的元素值。
本部分的代码展示:
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo03 {
public static void main(String[] args){
//利用增强的for循环来对集合中的元素进行遍历输出
Collection<String> c = new ArrayList<>();
c.add("赵敏");
c.add("小昭");
c.add("灭绝");
c.add("素素");
System.out.println(c);
for(String ele : c){
System.out.println(ele);
}
System.out.println("-------------------------");
//利用增强的for循环来对数组中的元素进行遍历输出
double[] arr = {10,10.1,20.9,30,30.5};
for (double v : arr) {
System.out.println(v);
}
}
}
结果:
总结:
4.3 方式三:Lambda表达式遍历129
五、Collection集合存储自定义类型的对象 129
底层原理:
总结:
六、常见数据结构 130
6.1数据结构概念、栈、队列 130
数据结构概述
常见的数据结构
栈数据结构的执行特点
队列数据结构的特点
例子:银行的排队叫号系统。
6.2数组 130
数组是连续排列的区域。长度
6.3链表 130
结点包含的内容:本次查询的数据内容信息+下一个结点的地址信息(便于下个节点的内容查询)
6.4二叉树、二叉查找树 130
普通的二叉树:节点的数据是混乱的。
二叉查找树:左侧的数据小,右侧的数据大。
6.5平衡二叉树 130
二叉树查找存在的问题:
平衡二叉树的要求:
具体的情况查看视频130的旋转的四种情况。
6.6红黑树 130
红黑树概念:
红黑树规则:
添加节点:
对于添加节点是红色效率高做出解释说明:
添加三个元素 18 20 23
下面将添加的节点作为黑色
下面是将添加的节点作为红色
其中红黑树需要进行再次的学习,观看视频130 45分钟-50分钟左右
总结:
七、List系列集合 131
7.1List集合特点、特有API 131
List系列集合特点:
List集合特有方法:
总结:
7.2List集合的遍历方式小结 131
遍历数据:这四种的方式都没有差别,都可以用。
如果有其他的要求,所以根据每种方式的特点进行选择确定方式。
遍历位置:使用for循环
7.3ArrayList集合的底层原理 131
当需要扩容时,会扩大到原来的1.5倍 ,将原来的元素 进行迁移到新的集合中。
该部分的内容使用,其实实际上是进行栈和队列的表示。
如果表示为栈,就是用 入栈addFirst()方法 等同于push 出栈.remove() 等同于pop()
代码如下所示:
LinkedList<String> list = new LinkedList<>();
//栈 先进后出
//入栈
list.addFirst("第一颗子弹");
list.addFirst("第二颗子弹");
list.addFirst("第三颗子弹");
list.addFirst("第四颗子弹");
System.out.println(list);
System.out.println(list.getFirst());
//出栈
System.out.println(list.removeFirst());
结果如下所示:
如果表示为队列,就是用 入栈addLast()方法 offLast()表示入队
代码如下所示:
//队列
LinkedList<String> list1 = new LinkedList<>();
//入队 先进先出
list1.addLast("1号");
list1.addLast("2号");
list1.addLast("3号");
list1.addLast("4号");
System.out.println(list1);
System.out.println(list1.getFirst());
//出栈
System.out.println(list1.removeLast());
结果如下所示:
LinkedList集合的底层:
八、 补充知识:集合的并发修改异常问题 131
解决遍历存在的迭代器删除元素的问题:(代码展示)
遍历:迭代器、增强for循环、foreach()、这三种都会出现并发错误,foreach的底层原理实际上是用增强for循环进行得到的。
for循环,会出现漏删的情况发生。但是有两种解决的方案。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("黑马");
list.add("Java");
list.add("Java");
list.add("赵敏");
list.add("赵敏");
list.add("素素");
System.out.println(list);
//需求:删除所有的某一元素内容, 本案例所删除的是Java
//a、使用迭代循环来检验相关的元素内容,找到相应的元素内容对其进行删除
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){//检查元素的内容
String ele = iterator.next();
if("Java".equals(ele)){
// list.remove("Java");//这个会出现报错的问题,是由于remove()方法删除了Java会影响后面的元素内容的索引值,就会出现报错情况发生
iterator.remove();//使用迭代器进行删除,不会影响后面的元素内容索引发生变化。
}
}
System.out.println(list);
}
}
结果:
小技巧:
快捷键生成迭代器:先输入list.iterator() 在 ctrl+alt+v 即可生成。
九、补充知识:泛型深入 132
9.1泛型的概述和优势 132
9.2自定义泛型类 132
作用:统一数据类型。
总结:
9.3自定义泛型方法 132 (学得不好)
总结:
9.4自定义泛型接口 132 (学的不好)
总结:
9.5泛型通配符、上下限 132 (学的不好)