月 亮 照 回 湖 心 野 鹤 奔 向 闲 云 我 步 入 你
目录
5. 获取元素位置:indexOf()和lastIndexOf()
一、简介
List集合下共有ArrayList、LinkedList、Vector三种实现方法,但是ArrayList 是 java 集合框架中比较常用的数据结构。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。
每一个ArrayList都有一个初始化的容量(10),该容量代表了数组的大小,随着容器中容量的不断增加,容器的大小也会随着增加。在每次向容器中增加元素时,会进行容量检查,当快溢出时,会进行扩容操作。
ArrayList的特点:
- 允许插入的元素重复
- 插入的元素是有序的
- 动态扩容
- 非线程安全,异步
- 基于动态数组的数据结构
- 擅长随机访问(get set)
- 每个元素都有对应的顺序索引,可通过索引访问指定位置的集合元素,默认按元素添 加顺序设置索引。
二、操作方法
1. 定义一个ArrayList集合
//方法1
List<Object> list = new ArrayList<Object>();
//方法2
ArrayList<Object> list = new ArrayList<Object>();
这两种方法都能成功定义一个ArrayList列表,但是存在一定的差异,具体可以阅读:【Java】集合概述
2. 添加:add()和addAll()
add()和addAll()都是向列表中添加数据。add()是向列表中添加单个元素,即运行一次add()只能添加一个元素,而addAll()是向列表中插入另一个列表,即运行一次addAll()可以添加多个元素。此外add()和addAll()两种方法还可以向指定位置添加元素。
List<Object> list = new ArrayList<Object>();
list.add(1);
list.add(3);
list.add(2);
list.add(2);
System.out.println("list:"+list);
//向指定位置添加元素
list.add(2, "A");
System.out.println(list);
由上述代码的输出结果可以看到list集合中元素是按照输入的顺序排列的,并且可以有重复值;通过第二个add()可以看出list可以向指定位置添加元素,该位置及之后的元素顺次后移。
List<Object> list = new ArrayList<Object>();
list.add(1);
list.add(3);
list.add(2);
list.add(2);
System.out.println("list:"+list);
List<Object> l = new ArrayList<Object>();
l.add(1.0);
l.add(3.0);
l.add(2.0);
//添加一个集合
list.addAll(l);
System.out.println(list);
//向指定位置添加一个集合
list.addAll(2,l);
System.out.println(list);
由输出结果可以看出,在列表中插入另一个列表时默认从尾部开始插入;如果指定了插入位置,则从指定位置开始插入,原列表元素顺次后移。
3. 移除:remove()
//移除
list.remove(1);
System.out.println(list);
4. 获取指定下标元素:get()
//获取指定下标对应的元素
System.out.println(list.get(1));
5. 获取元素位置:indexOf()和lastIndexOf()
indexOf()和lastIndexOf()获取元素在列表中的位置为其索引下标,indexOf()是获取指定元素在列表中第一次出现的位置,lastIndexOf()获取的是指定元素在列表中最后一次出现的位置,如果该元素不存在则返回-1。
//获取指定元素在集合中第一次出现的索引下标
System.out.println(list.indexOf(2));
//获取指定元素在集合中最后一次出现的索引下标
System.out.println(list.lastIndexOf(2));
//若该元素在列表中不存在
System.out.println(list.indexOf(3.0));
6. 修改:set()
set()方法用来修改指定位置的数据,可以理解为将原数据替换为新数据,第一个参数为替换的位置,第二个参数为替换的数据,例如下面将第0个位置的数据替换为3.
//根据指定下标修改数据
list.set(0, 3);
System.out.println(list);
7.获取指定范围数据:subList()
subList()返回的为集合中的某一段数据,通过前后两个下标指定截取范围,注意为前开后闭区间,即截取的[x,y)区间内的数据。
//截取[x,y)的数据
System.out.println(list.subList(0, 3));
8. 判空:isEmpty()
//判断集合是否为空
System.out.println(list.isEmpty());
9. 判断是否存在某元素:contains()
//判断是否存在某元素
System.out.println(list.contains(3));
10. 复制:clone()
//克隆
Object l = list.clone();
System.out.println(l);
11. 清除:clear()
//清除
list.clear();
System.out.println(list);
12. 获取元素个数:size()
//获取列表元素个数
System.out.println(list.size());
注意:size()获得的结果是列表中元素的个数,并不是列表的长度,因为列表是一个动态数组,当当前长度即将被用尽时就会自动扩容,但并不一定会占满,因此元素个数不一定等于列表长度。
13. 集合的遍历
13.1 常规遍历
//for循环遍历列表
for(int i=0; i<list.size();i++) {
System.out.println(list.get(i));
}
13.2 iterator 遍历
利用iterator遍历时有两种迭代器:常规的iterator和ListIterator。这两种迭代器的使用方法都一样,但是ListIterator是一个功能更加强大的迭代器,它继承于 Iterator 接口,只能用于各种 List 集合类型及其子类的访问。
//Iterator遍历
Iterator<Object> iterator = list.iterator();
System.out.println("Iterator遍历:");
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
//强大的ListIterator
ListIterator<Object> Iterator = list.listIterator();
System.out.println("ListIterator遍历:");
while (Iterator.hasNext()) {
System.out.println(Iterator.next());
}
13.3 for-each 遍历
//for-each遍历
for(Object obj : list) {
System.out.println(obj);
}