文章目录
- 1. Arrays.asList()获取到的ArrayList只能遍历,不能增加或删除元素
- 2. java.util.ArrayList.SubList有实现add()、remove()方法
- 3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素
- 4. 对大集合进行分组,遍历分组后的大集合,各个子集合使用完成后立即将元素删除
1. Arrays.asList()获取到的ArrayList只能遍历,不能增加或删除元素
public static void main(String[] args) {
List<String> list = Arrays.asList("xin", "liu", "shijian");
// 遍历 ok
list.stream().forEach(System.out::println);
for (int i = 0; i < list.size(); i++) {
// 报异常:UnsupportedOperationException
list.add("haha");
// 报异常:UnsupportedOperationException
list.remove(i);
}
}
2. java.util.ArrayList.SubList有实现add()、remove()方法
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
List<PersonDTO> subList = list.subList(0, 2);
int size = subList.size();
for (int i = 0; i < size; i++) {
PersonDTO personDTO = subList.get(i);
if (i == 0) {
// subList.remove(personDTO);
subList.add(personDTO);
break;
}
}
System.out.println(list);
}
3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素
- 对元素重新赋值:各种遍历方式都做不到
- 对元素中的属性赋值:各种遍历方式都能做到
- 对集合新增元素:普通for循环可以做到,其他遍历方式都做不到
- 对集合删除元素:普通for循环和迭代器可以做到,其他方式都做不到
private static List<PersonDTO> getDataList() {
List<PersonDTO> list = new ArrayList<>();
PersonDTO p1 = new PersonDTO();
p1.setPersonName("xiaohua1");
PersonDTO p2 = new PersonDTO();
p2.setPersonName("xiaohua2");
PersonDTO p3 = new PersonDTO();
p3.setPersonName("xiaohua3");
PersonDTO p4 = new PersonDTO();
p4.setPersonName("xiaohua4");
PersonDTO p5 = new PersonDTO();
p5.setPersonName("xiaohua5");
PersonDTO p6 = new PersonDTO();
p6.setPersonName("xiaohua6");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
return list;
}
3.1 普通for循环
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (int i = 0; i < list.size(); i++) {
// 原因是这里personDTO是另一个栈变量,并不会对集合中的栈内容(对象在内存中的地址)进行改变
PersonDTO personDTO = list.get(i);
personDTO = null;
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (int i = 0; i < list.size(); i++) {
// 成功是因为它们虽然是不同的变量,但栈内容相同,都是同一个对象的内存地址,这里会更改到堆中对象的内容
PersonDTO personDTO = list.get(i);
personDTO.setAge(5);
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (int i = 0; i < list.size(); i++) {
PersonDTO personDTO = list.get(i);
list.remove(personDTO);
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (int i = 0; i < list.size(); i++) {
PersonDTO personDTO = list.get(i);
list.add(personDTO);
System.out.println("list.size(): " + list.size());
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
int size = list.size();
for (int i = 0; i < size; i++) {
PersonDTO personDTO = list.get(i);
list.add(personDTO);
System.out.println("list.size(): " + list.size());
}
System.out.println(list);
}
3.2 增强for循环
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (PersonDTO dto : list) {
// 增强for循环内部实现是迭代器,我认为是调用了新方法,进行了值传递,dto是另一个变量了
dto = null;
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (PersonDTO dto : list) {
dto.setAge(7);
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (PersonDTO dto : list) {
list.remove(dto);
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
for (PersonDTO dto : list) {
list.add(dto);
}
System.out.println(list);
}
3.3 forEach循环
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
// forEach循环内部实现是匿名内部类,调用了函数式接口的新方法,进行了值传递,dto是另一个变量了
list.forEach(dto -> dto = null);
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
list.forEach(dto -> dto.setAge(6));
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
list.forEach(dto -> list.remove(dto));
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
list.forEach(dto -> list.add(new PersonDTO()));
System.out.println(list);
}
3.4 stream forEach循环
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
// stream forEach循环内部实现是匿名内部类,调用了函数式接口的新方法,进行了值传递,dto是另一个变量了
list.stream().forEach(dto -> dto = null);
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
list.stream().forEach(dto -> dto.setAge(8));
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
list.stream().forEach(dto -> list.remove(dto));
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
list.stream().forEach(dto -> list.add(new PersonDTO()));
System.out.println(list);
}
3.5 迭代器
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
Iterator<PersonDTO> iterator = list.iterator();
while (iterator.hasNext()) {
// 原因是这里dto是另一个栈变量,并不会对集合中的栈内容(对象在内存中的地址)进行改变
PersonDTO dto = iterator.next();
dto = null;
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
Iterator<PersonDTO> iterator = list.iterator();
while (iterator.hasNext()) {
PersonDTO dto = iterator.next();
dto.setAge(9);
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
Iterator<PersonDTO> iterator = list.iterator();
while (iterator.hasNext()) {
PersonDTO dto = iterator.next();
iterator.remove();
}
System.out.println(list);
}
public static void main(String[] args) {
List<PersonDTO> list = getDataList();
Iterator<PersonDTO> iterator = list.iterator();
while (iterator.hasNext()) {
PersonDTO dto = iterator.next();
list.add(new PersonDTO());
}
System.out.println(list);
}
4. 对大集合进行分组,遍历分组后的大集合,各个子集合使用完成后立即将元素删除
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
public class ArrayListDemo {
private static final int SUBLIST_SIZE = 2;
public static void main(String[] args) {
// 不适合list中有元素减少的场景
// 1.得到总list,这个时候的list接下来还可能会继续扩展
List<PersonDTO> list = getDataList();
System.out.println("刚开始, list.size = " + list.size());
// 2.业务逻辑代码:list还可能会扩展
// 3.处理完子集合,就删除它的元素
deleteSubList(list);
System.out.println("处理一波后, list.size = " + list.size());
// 4.list不再扩展,删除剩下元素,也是一个一个子集合的删除元素
deleteSubList(list, false);
System.out.println("最后处理后, list.size = " + list.size());
}
private static void deleteSubList(List<PersonDTO> list) {
// isNotEnd 代表list集合可能还会增加元素
deleteSubList(list, true);
}
private static void deleteSubList(List<PersonDTO> list, boolean isNotEnd) {
if (Objects.isNull(isNotEnd)) {
isNotEnd = false;
}
if (CollectionUtils.isNotEmpty(list) && ((list.size() > SUBLIST_SIZE) || !isNotEnd)) {
int size = list.size() / SUBLIST_SIZE;
if ((list.size() % SUBLIST_SIZE) > 0) {
size++;
}
for (int i = 0; i < size; i++) {
if (CollectionUtils.isNotEmpty(list)) {
List<PersonDTO> subList = Lists.partition(list, SUBLIST_SIZE).get(0);
// 不再继续处理业务逻辑: list中的数据量小于SUBLIST_SIZE && list中还可能增加元素
if ((list.size() < SUBLIST_SIZE) && isNotEnd) {
break;
}
// 使用subList处理业务逻辑
// 删出list中的subList
Iterator<PersonDTO> iterator = list.iterator();
int j = 0;
while (iterator.hasNext()) {
iterator.next();
j++;
if (j <= SUBLIST_SIZE) {
iterator.remove();
}
if (j > SUBLIST_SIZE) {
break;
}
}
System.out.println("删除subList后, list.size = " + list.size());
}
}
}
}
private static List<PersonDTO> getDataList() {
List<PersonDTO> list = new ArrayList<>();
PersonDTO p1 = new PersonDTO();
p1.setPersonName("xiaohua1");
PersonDTO p2 = new PersonDTO();
p2.setPersonName("xiaohua2");
PersonDTO p3 = new PersonDTO();
p3.setPersonName("xiaohua3");
PersonDTO p4 = new PersonDTO();
p4.setPersonName("xiaohua4");
PersonDTO p5 = new PersonDTO();
p5.setPersonName("xiaohua5");
PersonDTO p6 = new PersonDTO();
p6.setPersonName("xiaohua6");
PersonDTO p7 = new PersonDTO();
p7.setPersonName("xiaohua7");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
return list;
}
}