一、导读
本文着重讲解ArrayList的一些基本操作
add,remove,set,indexof....
好文章 记得 收藏+点赞+关注 !!!
二、代码以及运行结果
- ArrayList实现了
RandomAccess
接口,表明ArrayList支持随机访问。 - ArrayList实现了
Cloneable
接口,表明ArrayList是可以clone的。 - ArrayList实现了
Serializable
接口,表明ArrayList是支持序列化的。 - ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择
Vector
或者CopyOnWriteArrayList
。 - ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。
话不多说,直接上代码:
/**
* ArrayList练习
*
* @author JiaMing
* @since 2021/12/8/0008 下午 14:09
**/
public class ArrayListTest {
public static void main(String[] args) {
//新建一个ArrayList
//注意:ArrayList是线程不安全的,多线程可以采用vector或者CopyOnWriteArrayList
ArrayList<Object> list = new ArrayList<>();
//新建一个固定容量为10的ArrayList
ArrayList<Integer> list1 = new ArrayList<>(10);
list1.add(12);
list1.add(11);
//使用另一个Arraylist对新的ArrayList进行初始化
ArrayList<Integer> list2 = new ArrayList<>(list1);
// list2.add("1"); 这样会导致编译失败,List<Integer>已经限定了,list2中只能存储整型元素
//下面这种写法不推荐 避免省略类型,否则任意类型的元素都可以存放,使用时将是一场灾难
List<Object> list3 = new ArrayList<>();
list3.add(1);
list3.add("11");
list3.add("world");
//ArrayList的几种遍历输出方式
//1.for循环遍历 使用下标
for (int i = 0; i < list3.size(); i++) {
System.out.println(list3.get(i));
}
System.out.println("----------------------------------");
//2.增强for循环
for (Object i : list3) {
System.out.println(i);
}
System.out.println("----------------------------------");
//3.迭代器(也可以使用listIterator())
Iterator<Object> iterator = list3.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("----------------------------------");
//4.使用stream的foreach (简单粗暴)
list3.forEach(System.out::println);
System.out.println("----------------------------------");
//arrayList的一些方法
// E remove(int index) -> 删除 index (下标)位置元素
list3.remove(2);
list3.forEach(System.out::println);
System.out.println("----------------------------------");
//想删除指定元素可以这样
Iterator<Object> iterator1 = list3.iterator();
while (iterator1.hasNext()) {
Object next = iterator1.next();
if (next.equals("11")) {
iterator1.remove();
}
}
list3.forEach(System.out::println);
System.out.println("----------------------------------");
//更简单粗暴的方法 使用集合类
list3.removeIf(next -> next.equals(1));
list3.forEach(System.out::println);
System.out.println("----------------------------------");
//将元素插入到list中的指定位置
CopyOnWriteArrayList<Integer> list4 = new CopyOnWriteArrayList<>();
list4.add(1);
list4.add(3);
//下标为1 元素为2
list4.add(1, 2);
list4.forEach(System.out::println);
System.out.println("----------------------------------");
//boolean addAll(Collection<? extends E> c) 尾插 c中的元素
list4.addAll(list1);
list4.forEach(System.out::println);
System.out.println("----------------------------------");
}
//获取某下标位置的元素get()
System.out.println(list4.get(2));
System.out.println("----------------------------------");
//将指定下标位置的元素设置为指定值set()
list4.set(2, 100);
list4.forEach(System.out::println);
System.out.println("----------------------------------");
//判断线性表中是否包含某元素 contains()
boolean b = list4.contains(100);
System.out.println(b);
//返回第一个指定元素所在下标位置 indexOf()
System.out.println("100出现第一次的下标:" + list4.indexOf(100));
list4.add(100);
//返回最后一个元素出现的下标位置 lastIndexOf()
System.out.println("100出现最后一次的下标:" + list4.lastIndexOf(100));
//判断是否为空
System.out.println("list4是否为空:" + list4.isEmpty());
//清空list
list4.clear();
代码参考:https://blog.csdn.net/dddddrrrzz/article/details/121691217
三、ArrayList扩容机制
ArrayList在第一次插入元素add()时分配10(默认)个对象空间。假如有20个数据需要添加,那么会在第11个数据的时候(原始数组容量存满时),按照1.5倍增长;之后扩容会按照1.5倍增长(10、15、22…)。
具体可以参考这篇文章ArrayList扩容机制