第一讲 集合的概述
1. 为什么会出现集合?
集合是一种存储对象的容器,在数组出现的情况下为什么还会有集合?因为集合不仅能够存储对象,而且它的长度可以变化,适合做变化的需求。
2. 集合与数组的区别
数组既可以存储基本数据类型也可以存储引用类型,而集合只能存储引用类型。但数组长度一旦声明不可变,集合长度却是可变的。
3. 集合的整体框架
第二讲 Collection
1. Collection概述
Collection是List和Set的根接口,List中的元素是可重复有序的,Set中的元素是不可重复无序的。
2. Collection集合的具体方法
2.1 添加功能
boolean add(Object obj):添加一个元素
boolean addAll(Collection c):添加一个集合元素
2.2 删除功能
boolean remove(Object obj):移除一个元素
boolean removeAll(Collection c):移除一个集合元素
void clear():移除所有元素
2.3 判断功能
boolean contains(Object obj):判断是否包含指定元素
boolean containsAll(Collection c):判断是否包含指定集合元素
boolean isEmpty():判断集合元素是否为空
2.4 交集功能
boolean retainAll(Collection c):注意若c1.retainAll(c2),则c1中保存的是交集的结果,返回值表示的是c1中的元素是否发生改变
2.5 长度功能
int size():获取集合元素个数
2.6 将集合转化为数组
Object[] toArray()
3. 迭代器
迭代器(Iterator)是专门用于对集合进行遍历的,Collection的每个子接口都有迭代器。
3.1 Iterator的使用方法
Iterator接口有两个方法,一般用这两个方法对于集合元素进行遍历
boolean hasNext():如果仍有元素可以迭代,则返回true。
Object next():返回迭代的下一个元素。
注意:在集合遍历的时候,每一次迭代next()之前都需要判断集合中是否还有元素可以迭代hasNext().
具体的使用方法如下:
public class IteratorDemo {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
// Iterator iterator():迭代器,集合的专用遍历方式
Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态
while (it.hasNext()) {
// System.out.println(it.next());
String s = (String) it.next();
System.out.println(s);
}
}
}
3.2 迭代器的注意点
迭代器每使用一次next(),就会自动向下取一次元素,所以对于当前元素的操作要在下一次的next()之前操作完;
next()返回的是Object类型,需要进行类型转换
第三讲 List
1. List接口的概述
List接口的特点是可重复的元素,并且有序(有序是指进去的和出来的顺序是一样的,并不是比较大小)
2. List接口的特有方法
2.1 添加功能
void add(intindex,Object element):指定位置添加元素
2.2 获取功能
Object get(intindex):获取指定位置的元素
2.3 列表迭代器
ListIteratorlistIterator():
2.4 删除功能
Objectremove(int index):根据索引删除元素,返回被删除的元素
2.5 修改功能
Object set(intindex,Object element)根据索引修改元素,返回被修改的元素
3. ListIterator迭代器特有方法
void add(Object obj):增加一个元素
void set(Object obj):修改一个元素
boolean hasPrevious():判断前面有没有元素
object previous():取前一个元素
4. List集合的遍历
结合size()和get()方法使用
public class ListDemo2 {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
// 最终的遍历方式就是:size()和get()
for (int x = 0; x < list.size(); x++) {
// System.out.println(list.get(x));
String s = (String) list.get(x);
System.out.println(s);
}
}
}
5. ListIteraator需要注意的问题
如题:有一个集合,里面有内容,向判断里面有没有“world”这个元素,如果有就添加一个“javaee”元素
刚开始我们一般这么做:
public class ListIteratorDemo2 {
public static void main(String[] args) {
// 创建List集合对象
List list = new ArrayList();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
// 迭代器遍历
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
if ("world".equals(s)) {
list.add("javaee");
}
}
}
但是会报出这样一个异常:ConcurrentModificationException
这个异常是什么意思呢?并发修改异常,意思是当检测到对象的并发修改,但是不允许这种修改的时候报出的异常。
产生的原因:
迭代器是依赖于集合存在的,上面的程序中,在判断成功后,向集合中添加元素,但是迭代器此时在迭代,迭代器不知道集合的改变,所以报异常。
原则是:迭代器在迭代元素的时候,集合是不能修改元素的。
两种解决方法:
a:迭代器迭代元素并修改元素-----元素的添加是继续在刚才迭代过的元素之后
// 方式1:迭代器迭代元素,迭代器修改元素
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String s = (String) lit.next();
if ("world".equals(s)) {
lit.add("javaee");
}
}
结果:
hello
world
javaee
java
b:集合遍历元素,集合修改元素-----元素在最后添加
// 方式2:集合遍历元素,集合修改元素(普通for)
for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("world".equals(s)) {
list.add("javaee");
}
}
结果:
hello
world
java
javaee
第四讲 List--ArrayList,Vector,LinkedList
1. 数据结构—栈,队列,链表的概述
1.1 栈
栈的概念就是:先进后出,举例:子弹夹
1.2 队列
队列的概念就是先进后出,举例:排队买票
1.3 链表
2. LinkedList的特有方法
2.1 添加功能
Void addFirst(Object obj):在开头添加元素
Void addLast(Object obj):在末尾添加元素
2.2 获取功能
Object getFirst():获取第一个元素
Object getLast():获取最后一个元素
2.3 删除功能
Object removeFirst():删除第一个元素并且返回第一个元素
Object removeLast():删除最后一个元素并且返回最后一个元素
3. 例题:用LinkedList来实现栈结构
测试:
public class MyStackDemo {
public static void main(String[] args) {
// 创建集合对象
MyStack ms = new MyStack();
// 添加元素
ms.add("hello");
ms.add("world");
ms.add("java");
// System.out.println(ms.get());
// System.out.println(ms.get());
// System.out.println(ms.get());
// NoSuchElementException
// System.out.println(ms.get());
while(!ms.isEmpty()){
System.out.println(ms.get());
}
}
}
结果:
4. Vector的特有方法
早期功能:
void addElement(Objectobj):添加元素,相当于add()
Object elementAt(int index):元素索引查找,相当于get(int index)
Vector特有的特有的迭代:
Enumeration elements():相当于Iterator
BooleanhasMoreElements():相当于hasNext()
Object nextElement():相当于next()
Enumeration en = v.elements(); // 返回的是实现类的对象
while (en.hasMoreElements()) {
String s = (String) en.nextElement();
System.out.println(s);
}
5. ArrayList,Vector,LinkedList的特点
5.1 ArrayList:
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
5.2 Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低
5.3 LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高