List集合的特点
- 有序: 存和取的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
List集合的特有方法
- Collection的方法List都继承了
- List集合因为有索引,所以有了很多操作索引的方法
java
ublic static void main(String[] args) {
/*
List系列集合独有的方法:
void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
*/
//1.创建一个集合
List<String> list = new ArrayList<>();
//2.添加元素
list.add("aaa");
list.add("bbb");//1
list.add("ccc");
//void add(int index,E element) 在此集合中的指定位置插入指定的元素
//细节:原来索引上的元素会依次往后移
list.add(1,"QQQ");
//E remove(int index) 删除指定索引处的元素,返回被删除的元素
String remove = list.remove(1);
System.out.println(remove);//aaa
//E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
String result = list.set(0, "QQQ");
System.out.println(result);
// E get(int index) 返回指定索引处的元素
String s = list.get(0);
System.out.println(s);
//3.打印集合
System.out.println(list);
}
当我们调用List.remove方法时,回发现有两个参数类型不一样的同名方法:
tips:方法重载调用优先级,优先调用实参和形参类型一致的那个方法。
java
public static void main(String[] args) {
//List系列集合中的两个删除的方法
//1.直接删除元素
//2.通过索引进行删除
//1.创建集合并添加元素
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//2.删除元素
//请问:此时删除的是1这个元素,还是1索引上的元素?
//为什么?
//因为在调用方法的时候,如果方法出现了重载现象
//优先调用,实参跟形参类型一致的那个方法。
//默认int类型,所有是删除的index
list.remove(1);
System.out.println(list);
//手动装箱,手动把基本数据类型的1,变成Integer类型
Integer i = Integer.valueOf(1);
//如果需要使用重载的方法remove(Object o)那需要传入Integer
list.remove(i);
System.out.println(list);
}
List集合的遍历方式
- 迭代器遍历
- 列表迭代器遍历
- 增强for遍历
- lambda表达式遍历
- 普通for循环(存在索引)
java
public static void main(String[] args) {
/*
List系列集合的五种遍历方式:
1.迭代器 遍历过程中需要删除元素,用迭代器
2.列表迭代器 在遍历过程中需要添加元素,用列表迭代器
3.增强for 仅想遍历,使用增强for或Lambda
4.Lambda表达式 仅想遍历,使用增强for或Lambda
5.普通for循环 遍历的时候需要操作索引,使用普通for
*/
//创建集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//1.迭代器
/*Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}*/
//2.增强for
//下面的变量s,其实就是一个第三方的变量而已。
//在循环的过程中,依次表示集合中的每一个元素
/* for (String s : list) {
System.out.println(s);
}*/
//3.Lambda表达式
//forEach方法的底层其实就是一个循环遍历,依次得到集合中的每一个元素
//并把每一个元素传递给下面的accept方法
//accept方法的形参s,依次表示集合中的每一个元素
//list.forEach(s->System.out.println(s) );
//4.普通for循环
//size方法跟get方法还有循环结合的方式,利用索引获取到集合中的每一个元素
/*for (int i = 0; i < list.size(); i++) {
//i:依次表示集合中的每一个索引
String s = list.get(i);
System.out.println(s);
}*/
// 5.列表迭代器
//获取一个列表迭代器的对象,里面的指针默认也是指向0索引的
ListIterator<String> it = list.listIterator();
//额外添加了一个方法:在遍历的过程中,可以添加元素
while(it.hasNext()){
String s = it.next();
if("bbb".equals(s)){
//不能使用集合添加,已经被占用了,会报出并发修改异常
//这个时候应该用列表迭代器添加(额外新增的方法)
it.add("qqq");
}
System.out.println(s);
}
System.out.println(list);
}
五种遍历方式对比: