ArrayList知识点总结

一、简介

ArrayList 是Java 集合框架中比较常用的数据结构了。
继承自 AbstractList,实现了 List 接口
底层基于数组实现容量大小动态变化。

/**
* The size of the ArrayList (the number of elements it contains).
*/
private int size;  // 实际元素个数
transient Object[] elementData; 
//上面的 size 是指 elementData 中实际有多少个元素,
// 而 elementData.length 为集合容量,表示最多可以容纳多少个元素。

private static final int DEFAULT_CAPACITY = 10;//默认初始容量大小为 10

允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。
扩容机制为首先扩容为原始容量的 1.5 倍。如果1.5倍太小的话,则将我们所需的容量大小赋值给 newCapacity,如果1.5倍太大或者我们需要的容量太大,那就直接拿 newCapacity = (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE 来扩容。

二、遍历List集合的三种方式

普通的for循环
foreach循环(增强的for循环)
迭代器Iterator

三、遍历删除元素

普通for循环删除,会报错

        ArrayList<String> list = new ArrayList<String>(3);
			list.add("A");
			list.add("B");
			list.add("C");
			list.add("C");
			list.add("D");
			list.add("E");
			
		//普通for循环删除元素	
		for (String s : list) {
		    if(s.equals("C")){
			   list.remove(s);//会报错java.util.ConcurrentModificationException
			}
		}		

在这里插入图片描述
解决方案


		//方式一:每次删除后,后面的元素都要往前移动一位
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
			list.remove(list.get(i));
			i--;
		}
		
			
    	//方式二:索引从大到小,这样remove方法的删除元素导致的后面的元素往前移动一位		
		for (int i=list.size()-1; i>-1; i--) {
			System.out.println(list.get(i));
			list.remove(list.get(i));
		}
		
		//方式三:Iterator内部也是调用remove(index)方法,只不过是通过cursor控制了索引,在删除元素后cursor不变,不会造成漏删的情况。
		Iterator iterator = list.iterator(); 
		while(iterator.hasNext()) {//remove 之前必须先 next,next 之后只能用一次 remove
			String s = (String) iterator.next();
			//list.remove(s);//使用list的remove方法同样会报错java.util.ConcurrentModificationException
			iterator.remove();//使用iterator的remove方法不会报错
		}

参考文章
https://blog.csdn.net/qq_29545781/article/details/83448957
https://blog.csdn.net/sihai12345/article/details/79382649
https://blog.csdn.net/u013325266/article/details/83352263

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值