List
list集合在java.util下使用时需要导包
List集合特点:
- 有序:存和取的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复: 存储的元素可以重复
== List特有== 方法 :list是Collection中的一种,List继承了Collection中的方法,但是List集合有索引,所以多了很多关于索引操作的方法。
方法名称 | 说明 | 备注 |
---|---|---|
void add(int index,E,element) | 在此集合的指定位置插入指定的元素 | int index是指定位置。(增) |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 | (删) |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 | (改) |
E get(int index) | 返回指定索引处的元素 | (查) |
使用步骤
- 创建一个集合
List<String> list = new ArrayList<>();
注:List实际上也是一个接口,不能直接创建接口的对象,所以需要创建实现类的对象。
- 添加元素
list.add("1");
list.add("2");
list.add("3");
- 打印集合:
System.out.println(list);
运行结果:
- 在指定位置添加元素
list.add(1,"4");//在1位置添加元素4
运行结果:
5. 删除指定索引处的元素
注:remove有两个方法,第一个是根据对象删,方法会返回当前的对象是否删除成功。还有已一个重载的方法,是根据索引删除,把被删除的元素做一个返回。
条件:删除数组中的元素,并打印删除的元素。
String remove = list.remove(0);
System.out.println(remove);
System.out.println(list);
运行结果:
小细节:
list删除有两种方式,一种是直接删除元素,另一种是索引删除,如果创建的是int类型集合,删除的时候,要注意选用的方法,比如:
6. 首先创建一个int类型的集合,集合中的元素分别为1、2、3
7. 问题:此时删除的是索引位置1;还是删除的1元素?
答:此时用的方法是remove(int index);根据上表可知,int index是表示索引位置,所以该方法删除的是索引为1的位置,删除的元素是2;
运行结果:
原因:因为在调用方法的时候,如果方法出现了重载的现象,优先调用实参和形参类型完全一致的那个方法。
如果直接删除元素1,需要手动装箱,手动把基本数据类型1变成Integer类型
代码如下:
运行结果:
修改方法:
将1位置的元素修改为4
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
int result = list.set(1,4);//注意元素类型
System.out.println(result);
System.out.println(list);
获取方法:
获取第2个元素的信息
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
int i = list.get(2);
System.out.println(i);
list集合遍历的方式
- 迭代器遍历
- 列表迭代器遍历
- 增强for循环
- lambda表达式遍历
- 普通for循环遍历
迭代器遍历
- 创建一个集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
- 迭代器
获取一个迭代器对象,这个迭代器对象在底层就好比一个指针或者是一个箭头,默认指向集合的0索引处
Iterator<String> iterator = list.iterator();//获取一个迭代器对象,这个迭代器对象在底层就好比一个指针或者是一个箭头,默认指向集合的0索引处
循环遍历,利用while,调用hasNext方法
while(iterator.hasNext()){ //用来判断当前指向的位置是否有元素,如果有则是true,否则是false。
}
使用.next方法。 移动指针获取当前的元素
iterator.next();//移动指针获取当前的元素
完整代码如下:
//创建list集合对象,并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
Iterator<String> iterator = list.iterator();//获取一个迭代器对象,这个迭代器对象在底层就好比一个指针或者是一个箭头,默认指向集合的0索引处
while (iterator.hasNext()){
String string = iterator.next();//移动指针获取当前的元素
System.out.println(string);
}
运行结果如图
增强for循环遍历
//创建list集合对象,并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//下面的变量s,其实就是一个第三方的变量
// 再循环的过程中,一次表示集合中的每一个元素
for (String s : list) {
System.out.println(s);
}
运行结果
lambda表达式遍历
list调用一个forEach方法,在小括号里面先写匿名内部类的方式
forEach方法的底层其实就是一个循环遍历依次得到循环遍历中的每一个元素
并把每一个元素传递给下面的accept方法
accept方法的形参s,就一依次表示集合中的每一个元素
初始样子:
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
}
});
然后把new consumer和方法名删掉(注意删掉括号)
list.forEach((String s) {
}
);
在形参和方法体中间需要加上lambda的固定格式->
list.forEach((String s)->{
System.out.println(s);
}
);
该代码可以简化,数据类型可以省略,如果参数只有一个,小括号可以省略,如果方法体只有一行,大括号和return可以省略,分号也可以省略.。
list.forEach(s->System.out.println(s));
完整代码:
//创建list集合对象,并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.forEach(s->System.out.println(s));
运行结果:
普通for循环遍历
//创建list集合对象,并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
列表迭代器
next方法:是从前往后移动迭代器里面的指针
previo方法:是从后往前移动迭代器里面的指针
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
ListIterator<String> str = list.listIterator();
while (str.hasNext()){
String s = str.next();
//如果想在list 集合中添加元素,不能使用集合的方法
//即不能使用list.add();会报并发修改异常
//可以用迭代器自身的方法去操作
if ("bbb".equals(s)){
str.add("sss");
}
}
System.out.println(list);
小结:
迭代器遍历:
如果在遍历的过程中删除元素,使用迭代器
列表迭代器
在遍历的过程中需要添加元素,使用列表迭代器
增强for循环和Lambda表达式
仅仅想要遍历,那么使用增强for循环或者Lambda表达式
普通for循环
如果遍历的时候向操作索引,那么可以使用普通for循环