List
如何获取迭代器对象?
获取集合的迭代器对象:通过调用集合的 iterator 方法获取迭代器对象。例如,对于 ArrayList 集合,可以使用 iterator() 方法获取迭代器对象。
代码示例
List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
具体看代码注释
package com.text.entity;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.function.Consumer;
public class A03_ListDemo3 {
public static void main(String[] args) {
// list本身是一个接口 因此需要采用多态的方式创建对象
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 1. 迭代器 采用iterator()方法获取迭代器对象
/*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((String s) -> {
System.out.println(s);
}
);
// 简化
list.forEach(s -> System.out.println(s) );*/
// 4. 普通for循环遍历
// size方法和get方法还有循环结合的方式
/*for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}*/
// 5, 列表迭代器 ListIterator是 iterator的子接口
// 获取一个列表迭代器的对象,里面的指针默认也是指向0索引的
// 额外添加了一个方法,在遍历的过程,可以添加元素
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
String str = it.next();
if ("bbb".equals(str)) {
it.add("qqq");
}
}
/*ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
String str = it.next();
if ("bbb".equals(str)) {
it.remove();
}
}*/
System.out.println(list);
}
}
对于ListIterator的理解
ListIterator是Iterator类的子接口 因此可以使用Iterater的所有方法
它本身多了一个add的方法
package com.text.entity;
import java.util.ArrayList;
import java.util.List;
public class A01_ListDemo1 {
public static void main(String[] args) {
//1. 创建一个集合
List<String> list = new ArrayList<>();
//2. 添加元素
list.add("aaa");
list.add("bbb"); // 1
list.add("ccc");
list.add("ddd");
// void add(int index, E element) 在此集合的特定位置插入指定的元素
// 细节:原来索引上的元素会以此往后移动
// list.add(1, "QQQ");
//E remove(int index) 删除指定索引处的元素,返回被删除的元素
//String remove = list.remove(0);
//System.out.println(remove);
//E set(int index, E element) 修改指定索引处的元素,返回被修改的元素
// String res = list.set(0, "QQQ");
// System.out.println(res);
// E get(int index) 返回指定索引处的元素
String s = list.get(0);
System.out.println(s); // aaa
// 打印集合
System.out.println(list);
}
}
package com.text.entity;
import java.util.ArrayList;
import java.util.List;
public class A02_ListDemo2 {
public static void main(String[] args) {
// List系列集合中两个删除的方法
// 1. 直接删除元素
// 2. 通过索引直接删除
// 1. 创建集合并添加元素
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
// 2. 删除元素
// 请问:此时删除的是1这个元素,还是1索引上的元素?
// 为什么?
// 因为在调用方法的时候,如果方法出现了重载现象
// 优先调用,实参跟形参类型一致的那个方法
// 结论:remove方法不会自动装箱
list.remove(1);
// 手动装箱,手动把基本数据类型的1,变成Integer类型
Integer i = Integer.valueOf(1);
System.out.println(list);
}
}
对于上述代码.remove()方法的理解:
第一个需要把1自动装箱变成Integer类型 才能调用remove。
而第二个不需要任何操作就能直接把1当做索引调用remove。
因此 优先调用,实际参数和形参保持一致的方法
问题:什么是装箱呢?
Java装箱和拆箱是将基本数据类型转换为对应的包装类类型(装箱)和将包装类类型转换为对应的基本数据类型(拆箱)的过程。
装箱(Boxing)是将基本数据类型转换为对应的包装类类型。当需要将基本数据类型赋值给包装类类型或者作为参数传递给方法时,会自动进行装箱操作。例如,将int类型的数据赋值给Integer类型的变量,就会触发装箱操作。
拆箱(Unboxing)是将包装类类型转换为对应的基本数据类型。当需要将包装类类型赋值给基本数据类型或者作为参数传递给方法时,会自动进行拆箱操作。例如,将Integer类型的数据赋值给int类型的变量,就会触发拆箱操作。
装箱和拆箱可以使得基本数据类型和包装类类型之间可以相互转换,方便在需要使用包装类类型的地方使用基本数据类型,并且可以利用包装类提供的方法来操作基本数据类型的值。但是由于装箱和拆箱过程需要进行类型转换,会带来一定的性能开销,所以在性能要求较高的场景下需要注意使用装箱和拆箱的次数。