一、List接口简介
- List 接口继承自Collection接口,是单列集合的一个重要分支,习惯性会将实现了List接口的对象称为List集合
- 在List集合中允许出现重复的元素,所有的元素都是以一种线性方式进行存储的,在程序中可以通过索引来访问指定元素
- List集合中元素有序,即元素的存入顺序和取出顺序一致
- List集合作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且增加了一些根据元素索引来操作集合的特有方法
二、ArrayList集合
package cn.itcast.chapter06.example01;
import java.util.ArrayList;
/**
* ArrayList集合存取元素
* boolean add(E e)
* int size()
* E get(int index)
*
*/
public class Example01 {
public static void main(String[] args) {
ArrayList list = new ArrayList(); // 创建ArrayList集合
System.out.println(list);
list.add("stu1"); // 向集合中添加元素
list.add("stu2");
list.add("stu3");
list.add("stu4");
System.out.println(list);
System.out.println("集合的长度:" + list.size()); // 获取集合中元素的个数
System.out.println("第2个元素是:" + list.get(1)); // 取出并打印指定位置的元素
}
}
输出
[]
[stu1, stu2, stu3, stu4]
集合的长度:4
第2个元素是:stu2
三、LinkedList集合
- ArrayList 集合在查询元素时速度很快,但是在增删元素的效率较低,LinkList克服了这个局限。
- 集合内部维护了一个双向循环列表,链表的没一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。
- 当插入一个新元素时,只需要修改元素之间的这种引用关系即可;删除一个节点也是如此。
package cn.itcast.myTest06.example06;
import java.util.LinkedList;
/**
* @author wangyue
* @version 1.0
* @date 2019/6/24 16:35
* @describe: 测试 LinkedList集合类
* boolean add(E e) Inserts the specified element into the queue represented by this deque (in other words, at the tail of this deque)
* void add(int index,E element)
* void addFirst(E e)
* E getFirst()
* E remove(int index)
* E removeFirst()
*/
public class Example06 {
public static void main(String[] args) {
//创建LinkedList集合
LinkedList link = new LinkedList();
link.add("stu1");
link.add("stu2");
link.add("stu3");
System.out.println(link); //产看集合元素
link.add(3, "student");
System.out.println(link);
System.out.println("集合中第一个元素: " + link.getFirst());
link.remove();
System.out.println("删除首元素之后" + link);
link.remove();
System.out.println("再次删除首元素之后" + link);
link.remove(1);
System.out.println("删除第二个元素之后" + link);
}
}
输出
[stu1, stu2, stu3]
[stu1, stu2, stu3, student]
集合中第一个元素: stu1
删除首元素之后[stu2, stu3, student]
再次删除首元素之后[stu3, student]
删除第二个元素之后[stu3]
四、Iterator接口
- 开发中经常需要遍历集合中的所有元素,针对这种需求,JDK专门提供了一个接口Iterator
- Iterator接口也是Java集合中的一员,但是和Collection 、Map接口有所不同,Collection接口和Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。
package cn.itcast.myTest03.example03;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author wangyue
* @version 1.0
* @date 2019/6/24 16:35
* @describe: 测试 Iterator集合类
* Collection接口中的方法
* Iterator<E> iterator 获取用来遍历集合元素的迭代器对象Iterator
*
* iterator接口中的方法
* boolean hasNext() 判断集合中 指针当前位置 是否有下一个元素
* object next() 获取 指针当前位置 下一个元素
*/
public class Example03 {
public static void main(String[] args) {
//创建ArrayList集合
ArrayList list = new ArrayList();
//向集合中添加元素
list.add("data1");
list.add("data3");
list.add("data4");
System.out.println(list);
//获取用来遍历集合元素的迭代器对象Iterator
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
五、JDK5.0新特性---foreach循环
- 虽然Iterator可以用来遍历集合中的元素,但写法较为繁琐,为了简化书写,JDK5.0开始,提供了foreach循环,也称增强for循环
- foreach循环用于遍历数组元素或集合中的元素,其语法格式如下:
for (容器中元素类型 临时变量:容器变量){
执行语句;
}
package cn.itcast.chapter06.example04;
import java.util.*;
/**
* foreach循环
*/
public class Example04 {
public static void main(String[] args) {
ArrayList list = new ArrayList(); // 创建ArrayList集合
list.add("Jack"); // 向ArrayList集合中添加字符串元素
list.add("Rose");
list.add("Tom");
for (Object obj : list) { // 使用foreach循环遍历ArrayList对象
System.out.println(obj); // 取出并打印ArrayList集合中的元素
}
}
}
输出
Jack
Rose
Tom
1、foreach 和 for 的区别(数组中修改元素)
foreach在循环过程中,无法改变数组元素值
package cn.itcast.myTest05.example05;
import java.util.ArrayList;
import java.util.Arrays;
/**
* @author wangyue
* @version 1.0
* @date 2019/6/25 15:27
* @describe: foreach 和 for 的区别
* foreach在循环过程中,无法改变数组元素值
*/
public class Example05 {
public static void main(String[] args){
String[] strs={"aaa","bbb","ccc"};
//foreach循环遍历数组
for(String temp: strs){
temp="ddd";
}
System.out.println("foreach修改之后的数组"+ Arrays.toString(strs));
for(int i=0; i<strs.length;i++){
strs[i]="ddd";
}
System.out.println("for 修改之后的数组"+ Arrays.toString(strs));
}
}
输出
foreach修改之后的数组[aaa, bbb, ccc]
for 修改之后的数组[ddd, ddd, ddd]
2、Iterator 迭代器删除集合中元素的方式
在迭代器中用集合的remove方法 直接删除元素,会发生并发错误
(但是我在实际使用的时候,并没有报错,不知道是不是JDK版本的原因?)
解决办法:
(1)删除对象之后,就跳出循环不再迭代
package cn.itcast.myTest06.example06;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author wangyue
* @version 1.0
* @date 2019/6/25 16:01
* @describe: 迭代器 删除集合中元素的方式
*/
public class Example06 {
public static void main(String[] args){
ArrayList list = new ArrayList();
list.add("jack");
list.add("anna");
list.add("Annie");
list.add("lucy");
//使用Iterator迭代器进行迭代
Iterator it = list.iterator();
while(it.hasNext()){
Object obj= it.next();
if ("Annie".equals(obj)){
//教程上说会报错,但是我在实际使用过程中,没有报错
// list.remove(obj);
//解决方法1、删除对象之后,就跳出循环不再迭代
list.remove(obj);
break;
}
}
System.out.println(list);
}
}
输出
[jack, anna, lucy]
(2)使用 Iterator 本身的的remove()
//解决方法2、使用 Iterator本身的的remove()
it.remove();