Collection值单列集合List(),以及遍历方式
知识点-- 单列集合常用类的继承体系
讲解:
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List
和java.util.Set
。其中,List
的特点是元素有序、元素可重复 ; Set
的特点是元素不可重复。List
接口的主要实现类有java.util.ArrayList
和java.util.LinkedList
,Set
接口的主要实现类有java.util.HashSet
和java.util.LinkedHashSet
。
从上面的描述可以看出JDK中提供了丰富的集合类库,为了便于初学者进行系统地学习,接下来通过一张图来描述集合常用类的继承体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVvOmDrI-1578647800404)(img/Collection%E9%9B%86%E5%90%88%E4%BD%93%E7%B3%BB%E5%9B%BE.jpg)]
注意:这张图只是我们常用的集合有这些,不是说就只有这些集合。
小结:
集合的继承体系:
单列集合:以单个单个的方式存储元素
Collection接口:也称Collection集合,定义了所有单列集合共有的功能
List接口:也称List集合,特点:元素有索引,元素存取有序,元素可以重复
Vector类:也称Vector集合,特点:查询快,增删慢,线程安全
ArrayList类:也称ArrayList集合,特点:查询快,增删慢,线程不安全
LinkedList类:也称LinkedList集合,特点:查询慢,增删快
Set接口:也称Set集合,特点:元素无索引,元素存取无序,元素不可以重复
HashSet类:也称HashSet集合,特点:元素无索引,元素存取无序,元素不可以重复
LinkedHashSet类:也称LinkedHashSet集合,特点:元素无索引,元素存取有序,元素不可以重复
TreeSet类:也称TreeSet集合,特点:元素无索引,元素存取无序,元素不可以重复,可以对元素进行排序
双列集合:以键值对的方式存储元素(键值对)
Map接口:也称Map集合
HashMap类:也称HashMap集合
LinkedHashMap类:也称LinkedHashMap集合
TreeMap类:也称TreeMap集合
知识点-- Collection 常用功能
目标:
- Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。
步骤:
- Collection集合 常用功能
讲解:
方法如下:
public boolean add(E e)
: 把给定的对象添加到当前集合中 。public void clear()
:清空集合中所有的元素。public boolean remove(E e)
: 把给定的对象在当前集合中删除。public boolean contains(Object obj)
: 判断当前集合中是否包含给定的对象。public boolean isEmpty()
: 判断当前集合是否为空。public int size()
: 返回集合中元素的个数。public Object[] toArray()
: 把集合中的元素,存储到数组中
tips: 有关Collection中的方法可不止上面这些,其他方法可以自行查看API学习。
public class Demo02ListMethod {
public static void main(String[] args) {
method4();
}
public static void method4() {
//创建集合
List<String> list = new ArrayList<>();
//添加元素
list.add("jack");
list.add("rose");
list.add("tony");
//打印集合
System.out.println("替换前:" + list); //[jack, rose, tony]
//调用set方法,使用 tom 替换掉原来索引为1的元素
String str = list.set(1, "tom");
System.out.println("替换后:" + list); //[jack, tom, tony]
System.out.println("str:" + str); //rose
}
public static void method3() {
//创建集合
List<String> list = new ArrayList<>();
//添加元素
list.add("jack");
list.add("rose");
list.add("tony");
//打印集合
System.out.println("删除前:" + list); //[jack, rose, tony]
//调用remove方法,删除索引为1的元素
String str = list.remove(1);
System.out.println("删除后:" + list); //[jack, tony]
System.out.println("str:" + str); //rose
}
public static void method2() {
//创建集合
List<String> list = new ArrayList<>();
//添加元素
list.add("jack");
list.add("rose");
list.add("tony");
//调用get方法,根据索引获取元素
System.out.println(list.get(1));
}
public static void method1() {
//创建集合
List<String> list = new ArrayList<>();
//添加元素
list.add("jack");
list.add("rose");
list.add("tony");
//打印集合
System.out.println("list:" + list); //[jack, rose, tony]
//向索引为1的位置插入元素。 lucy
list.add(1, "lucy");
//打印集合
System.out.println("list:" + list); //[jack, lucy, rose, tony]
}
}
知识点-- Iterator接口
讲解:
下面介绍一下迭代的概念:
- 迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:
public Iterator iterator()
: 获取集合对应的迭代器,用来遍历集合中的元素的。
Iterator接口的常用方法如下:
public E next()
:返回迭代的下一个元素。public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。
接下来我们通过案例学习如何使用Iterator迭代集合中元素:
public class IteratorDemo {
public static void main(String[] args) {
// 使用多态方式 创建对象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("串串星人");
coll.add("吐槽星人");
coll.add("汪星人");
//遍历
//使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
}
}
tips:
- 在进行集合元素获取时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会抛出java.util.NoSuchElementException没有集合元素异常。
- 在进行集合元素获取时,如果添加或移除集合中的元素 , 将无法继续迭代 , 将会抛出ConcurrentModificationException并发修改异常.
小结:
-
Iterator迭代器: 迭代:即Collection集合元素的通用获取方式。 在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来, 继续在判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。 获取迭代器:使用Collection集合中的方法iterator()方法 public Iterator<E> iterator();获取该集合对象对应的迭代器 使用迭代器进行判断和取出元素:使用Iterator迭代器的方法 boolean hasNext() 判断集合中是否还有元素可以迭代,如果有就返回true,否则返回false。 E next() 取出元素。
知识点-- 迭代器的实现原理
讲解:
我们在之前案例已经完成了Iterator遍历集合的整个过程。当遍历集合时,首先通过调用t集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XetsRtnE-1578647800405)(img\迭代器原理图.bmp)]
在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
小结:
略
知识点-- 增强for
讲解:
增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
格式:
for(元素的数据类型 变量 : Collection集合or数组){
//写操作代码
}
它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。
代码演示
public class NBForDemo1 {
public static void main(String[] args) {
int[] arr = {3,5,6,87};
//使用增强for遍历数组
for(int a : arr){//a代表数组中的每个元素
System.out.println(a);
}
Collection<String> coll = new ArrayList<String>();
coll.add("小河神");
coll.add("老河神");
coll.add("神婆");
for(String s :coll){
System.out.println(s);
}
}
}
tips:
增强for循环必须有被遍历的目标,目标只能是Collection或者是数组;
增强for(迭代器)仅仅作为遍历操作出现,不能对集合进行增删元素操作,否则抛出ConcurrentModificationException并发修改异常
小结:
增强for循环:
概述:增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。
它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
格式:
for(元素的数据类型 变量名 : 数组名\集合名){
}
执行流程:
1.判断 数组或者集合 中是否有元素可以迭代
2.如果有元素可以迭代,就会从这个 数组或者集合中 取出元素赋值给变量
3.依次类推,直到没有元素,就自动结束增强for循环
总结数组和集合的遍历方式:
Collection集合: 迭代器,增强for循环
List集合: 迭代器,增强for循环,普通for\while循环
Set集合: 迭代器,增强for循环
数组:增强for循环,普通for\while循环
List接口
讲解:
List接口的概述:
java.util.List
接口继承自Collection
接口,是单列集合的一个重要分支,习惯性地会将实现了List
接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
看完API,我们总结一下:
List接口特点:
- 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
- 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
- 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
tips:我们在基础班的时候已经学习过List接口的子类java.util.ArrayList类,该类中的方法都是来自List中定义。
小结:
略
知识点-- List接口中常用方法
讲解:
List集合特有的方法:
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。public E get(int index)
:返回集合中指定位置的元素。public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
List集合特有的方法都是跟索引相关,我们在基础班都学习过。
tips:我们之前学习Colletion体系的时候,发现List集合下有很多集合,它们的存储结构不同,这样就导致了这些集合它们有各自的特点,供我们在不同的环境下使用,那么常见的数据结构有哪些呢?在下一章我们来介绍:
小结:
List集合特有的方法:增删查改
- public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
- public E get(int index):返回集合中指定位置的元素。
- public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
- public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
知识点-- List的子类
讲解:
ArrayList集合
java.util.ArrayList
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList
是最常用的集合。
许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
LinkedList集合
java.util.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 E pop()
:从此列表所表示的堆栈处弹出一个元素。public void push(E e)
:将元素推入此列表所表示的堆栈。public boolean isEmpty()
:如果列表不包含元素,则返回true。
LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。
public class Demo04LinkedList {
public static void main(String[] args) {
method4();
}
/*
* void push(E e): 压入。把元素添加到集合的第一个位置。
* E pop(): 弹出。把第一个元素删除,然后返回这个元素。
*/
public static void method4() {
//创建LinkedList对象
LinkedList<String> list = new LinkedList<>();
//添加元素
list.add("达尔文");
list.add("达芬奇");
list.add("达尔优");
System.out.println("list:" + list);
//调用push在集合的第一个位置添加元素
//list.push("爱迪生");
//System.out.println("list:" + list);//[爱迪生, 达尔文, 达芬奇, 达尔优]
//E pop(): 弹出。把第一个元素删除,然后返回这个元素。
String value = list.pop();
System.out.println("value:" + value);//达尔文
System.out.println("list:" + list);//[达芬奇,达尔优]
}
/*
* E removeFirst():删除第一个元素
* E removeLast():删除最后一个元素。
*/
public static void method3() {
//创建LinkedList对象
LinkedList<String> list = new LinkedList<>();
//添加元素
list.add("达尔文");
list.add("达芬奇");
list.add("达尔优");
//删除集合的第一个元素
// String value = list.removeFirst();
// System.out.println("value:" + value);//达尔文
// System.out.println("list:" + list);//[达芬奇,达尔优]
//删除最后一个元素
String value = list.removeLast();
System.out.println("value:" + value);//达尔优
System.out.println("list:" + list);//[达尔文, 达芬奇]
}
/*
* E getFirst(): 获取集合中的第一个元素
* E getLast(): 获取集合中的最后一个元素
*/
public static void method2() {
//创建LinkedList对象
LinkedList<String> list = new LinkedList<>();
//添加元素
list.add("达尔文");
list.add("达芬奇");
list.add("达尔优");
System.out.println("list:" + list);
//获取集合中的第一个元素
System.out.println("第一个元素是:" + list.getFirst());
//获取集合中的最后一个元素怒
System.out.println("最后一个元素是:" + list.getLast());
}
/*
* void addFirst(E e): 在集合的开头位置添加元素。
* void addLast(E e): 在集合的尾部添加元素。
*/
public static void method1() {
//创建LinkedList对象
LinkedList<String> list = new LinkedList<>();
//添加元素
list.add("达尔文");
list.add("达芬奇");
list.add("达尔优");
//打印这个集合
System.out.println("list:" + list);//[达尔文, 达芬奇, 达尔优]
//调用addFirst添加元素
list.addFirst("曹操");
System.out.println("list:" + list);//[曹操, 达尔文, 达芬奇, 达尔优]
//调用addLast方法添加元素
list.addLast("大乔");
System.out.println("list:" + list);//[曹操, 达尔文, 达芬奇, 达尔优, 大乔]
}
}
小结:
List的子类:
ArrayList类:也称ArrayList集合,存储数据的数据结构是数组,特点:查询快,增删慢,线程不安全
LinkedList类:也称LinkedList集合,存储数据的数据结构是链表,特点:查询慢,增删快
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 E pop():从此列表所表示的堆栈处弹出一个元素。
- public void push(E e):将元素推入此列表所表示的堆栈。
- public boolean isEmpty():如果列表不包含元素,则返回true。忽略,不是特有的