集合是java中,提供的一种容器,可以保存多个数据.
集合与数组的区别:
简化体系:
扩展:
1. 集合体系的由来:子类共性抽取,提炼成父类/接口
2. 集合的学习目标: crud(增删改查) + 遍历 + 每种集合各自特点
3. 集合的学习方式
先学哪个?
先学顶层(从上到下):共性方法
共性学一遍,其他底层实现类都学了一遍
使用哪个?
使用底层实现类(方法更多)
问题:集合类为什么有这么多?
为了满足不同的需求,元素重复,不重复的,有序,无序,排序
3.Collection-常见成员方法
迭代器介绍
- 迭代器,集合的专用遍历方式Iterator iterator():返回此集合中元素的迭代器,通过集合对象的iterator()方法得到
boolean hasNext():判断当前位置是否有元素可以被取出
E next():获取当前位置的元素,将迭代器对象移向下一个索引位置Collection集合的遍历
public class IteratorDemo1 {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList<>();
//添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("javaee");
//Iterator iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
Iterator it = c.iterator();
//用while循环改进元素的判断和获取
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
}
}
要点:
遍历: 将集合中的元素挨个取出,进行处理(最常见的处理是打印)
迭代器遍历: 所有 Collection 集合都可以使用
使用步骤
1.创建集合 2.添加元素 3.通过集合获取迭代器(集合.iterator()) 4.使用迭代器(hasNext(),next())5.Collection-迭代器原理分析
要点
理解下,迭代器中有一个指针,默认指向集合第一个元素 hasNext(),只判断,不移动指针 next(),返回当前元素,并移动指针到下一个位置6.Collection-迭代器删除方法
要点
1.理解ArrayList的特有方法删除重复元素, get(index),size()
2.遍历时, 可以通过Iterator迭代器 删除元素 (remove():删除从迭代器返回的最后一个元素)
注意:通过迭代器遍历时, 不能直接通过集合本身修改集合!! (添加或删除元素)
扩展: 通过迭代器遍历时,不能直接通过集合本身修改集合!!(添加或删除元素)
ConcurrentModificationException 是什么异常?
并发修改异常
原因:
当对象不允许并发修改时,抛出此异常
通俗说,将集合交给迭代器遍历,在迭代器遍历过程中,不通过迭代器,直接通过集合修改(添加/删除),就会抛出此异常
解决:
1.迭代器遍历时,使用迭代器进行修改
2.使用其他遍历方式,例如:get(index),size()
7.增强for-基本格式
Collectionlist = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); list.add("f"); //1,数据类型一定是集合或者数组中元素的类型 //2,str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素 //3,list就是要遍历的集合或者数组. for(String str : list){ System.out.println(str); }
要点
格式:
for (元素类型 变量名 : 数组/Collection集合) {
使用 变量名
}
例如:
for (String s : list){
System.out.println(s);
}
作用:简化 Collection 集合和 数组 的遍历
底层:
底层也是迭代器(不要一边遍历,一边通过集合修改元素)
遍历首选
别名: 增强for(超级for,forEach)
快捷键:
集合/数组对象.for
集合/数组名.iter
iter + 回车
8.增强for-注意点
ArrayList9.Collection转数组list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); // // for(String str : list){ // str = "q"; // System.out.println(str); // } for (String s : list) { System.out.println(s); }
Object[] objects = list.toArray();
Student[] stuArray = new Student[list.size()];
list.toArray(stuArray);
for (Student stu : stuArray) {
System.out.println(stu);
}
10.List-概述和基本使用
Listlist = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); //List 就当Collection一样遍历 Iterator it = list.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); } System.out.println("---------------------"); for (String s : list) { System.out.println(s); }
要点
Collection体系
Collection(接口)
List(子接口): 特点,有序,可重复,有索引
ArrayList<>
List特点
List 就当 Collection 用 (创建集合,添加元素,迭代器,增强for遍历)
验证有序,可重复
List的特点
- 有序 (存储和取出的顺序一致)可重复有索引(有针对索引操作的方法)
public class MyListDemo {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//method1(list);
//method2(list);
//method3(list);
//method4(list);
}
private static void method4(List list) {
// E get(int index) 返回指定索引处的元素
String s = list.get(0);
System.out.println(s);
}
private static void method3(List list) {
// E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
//被替换的那个元素,在集合中就不存在了.
String result = list.set(0, "qqq");
System.out.println(result);
System.out.println(list);
}
private static void method2(List list) {
// E remove(int index) 删除指定索引处的元素,返回被删除的元素
//在List集合中有两个删除的方法
//第一个 删除指定的元素,返回值表示当前元素是否删除成功
//第二个 删除指定索引的元素,返回值表示实际删除的元素
String s = list.remove(0);
System.out.println(s);
System.out.println(list);
}
private static void method1(List list) {
// void add(int index,E element) 在此集合中的指定位置插入指定的元素
//原来位置上的元素往后挪一个索引.
list.add(0,"qqq");
System.out.println(list);
}
}
要点
List的特点 1.有序 2. 可重复, 3 . 有索引 (可根据索引CRUD(增删改查)) 特有功能 根据索引curd, 遍历(迭代器, 增强for, 普通for(List特有))12.数据结构-栈和队列
栈:
进栈, 也叫压栈
出栈, 也叫弹栈
特点:
先进后出.
队列:
入队
出队
特点:
先进先出
要点
数组结构的特点: 查询?,增删?? 为什么? 查询快? 数组是一片连续的内存空间,而且有编号(索引) 增删慢? 数组添加元素或删除元素有可能移动元素 链表: 由一个个节点组成, 节点保存的是数据和下一个节点的地址 特点: 查询?,增删? 查询慢? 每个节点的地址不是连续的, 每次都从头或从尾查. 增删快? 因为添加元素和删除元素不影响链表的整体结构,只记录地址,不移动元素.(好像牵手和放手)14.ArrayList-源码解析
size : 当前元素个数
size : 新元素要添加的索引位置
public class MylinkedListDemo4 {
public static void main(String[] args) {
linkedList list = new linkedList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// public void addFirst(E e) 在该列表开头插入指定的元素
//method1(list);
// public void addLast(E e) 将指定的元素追加到此列表的末尾
//method2(list);
// public E getFirst() 返回此列表中的第一个元素
// public E getLast() 返回此列表中的最后一个元素
//method3(list);
// public E removeFirst() 从此列表中删除并返回第一个元素
// public E removeLast() 从此列表中删除并返回最后一个元素
//method4(list);
}
private static void method4(linkedList list) {
String first = list.removeFirst();
System.out.println(first);
String last = list.removeLast();
System.out.println(last);
System.out.println(list);
}
private static void method3(linkedList list) {
String first = list.getFirst();
String last = list.getLast();
System.out.println(first);
System.out.println(last);
}
private static void method2(linkedList list) {
list.addLast("www");
System.out.println(list);
}
private static void method1(linkedList list) {
list.addFirst("qqq");
System.out.println(list);
}
}
要点
linkedList底层是?特点是?
链表, 查询慢,增删快
像一条蛇,有头尾,
特有功能
有专门针对头和尾操作的功能
添加到头,添加到尾
获取头,获取尾
删除头,删除尾
addFirst(E);
addLast(E);
E removeFirst();
E removeLast();
E getFirst();
E getLast();
17.linkedList-源码解析
总结



