通过之前对 JAVA基础 —— 集合 的学习,我们对于集合的概念以及ArrayList都有了初步的了解。
Collection单列集合 | JAVA基础(集合进阶) —— Collection单列集合 |
List集合 | JAVA基础(集合进阶) —— List集合 |
泛型 | JAVA基础(集合进阶) —— 泛型 |
Set集合 | JAVA基础(集合进价) —— Set集合 |
并且进一步通过 JAVA基础(集合进阶) —— Collection单列集合 的学习,接下来我们将对List集合开始进一步的学习。
目录
List集合:
特点:
- 有序:存和取的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
一、 List集合的特有方法
- Collection的方法 List都继承了。
- List集合因为有索引,所以多了索引操作的方法。
方法名称 | 说明 |
void add (int index , Element element) | 在此集合中的指定位置插入指定的元素 |
Element remove (int index ) | 删除指定索引处的元素,返回被删除的元素 |
Element set(int index , Element element) | 修改指定索引处的元素,返回被修改的元素 |
Element get (int index ) | 返回指定索引处的元素 |
public class ListTest {
public static void main(String[] args) {
// 1.创建一个集合
// List也是接口 不能直接创建接口对象
// 创建List实现类对象
List<String> list = new ArrayList<>();
// 2.添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list); // [aaa, bbb, ccc]
// 3.指定位置添加元素
list.add(1, "qqq");
// 细节:原来索引上的元素会依次往后移
System.out.println(list); // [aaa, qqq, bbb, ccc]
// 4.删除指定位置元素,并返回删除值
String remove = list.remove(0);
System.out.println(remove); // aaa
System.out.println(list); // [qqq, bbb, ccc]
// 5.修改指定索引上元素,返回被修改元素
String result = list.set(0, "aaa");
System.out.println(result); // qqq
System.out.println(list); // [aaa, bbb, ccc]
// 6.获取指定索引元素
String s = list.get(0);
System.out.println(s); // aaa
}
}
注意:
List集合删除元素有两种:
remove(Object o) 直接删除元素 remove(int index) 通过索引进行删除 public class ListTest { public static void main(String[] args) { // 创建集合 List<String> list = new ArrayList<>(); // 添加元素 list.add("1"); list.add("2"); list.add("3"); // 删除元素 // 请问:此时删除的是1这个元素,还是1索引上的元素? // 为什么? // 因为我们在调用方法 的时候,如果方法出现重载现象 // 优先调用,实参和形参类型一致的那个方法 // 根据索引删除 list.remove(1); // 通过手动装箱:手动把基本数据类型的1 变成Integer类型 // 进行直接删除对象 Integer i = Integer.valueOf(1); list.remove(i); System.out.println(list); } }
二、List集合的遍历方式
- 迭代器遍历
- 列表迭代器遍历
- 增强for遍历
- Lambda表达式遍历
- 普通for循环(因为List集合有索引)
public class ListTest {
public static void main(String[] args) {
// 创建集合对象并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 1.迭代器
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(s -> System.out.println(s));
//4.普通for遍历
//size方法 + get方法 + 循环结合
//利用索引获取到集合中每一个元素
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(str);
}
}
}
1. 重点注意:列表迭代器遍历
查看API帮助文档:
public class ListTest {
public static void main(String[] args) {
// 创建集合对象并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 列表迭代器
// 获取一个列表迭代器的对象,里面的指针默认也是指向0索引的
// 在迭代器基础上:在遍历过程中,额外添加元素
ListIterator<String> lIt = list.listIterator();
while (lIt.hasNext()) {
String s = lIt.next();
if ("bbb".equals(s)) {
// qqq
// 不能使用list.add进行添加
// 但是可以用迭代器本身进行添加
lIt.add("qqq");
}
}
System.out.println(list); // [aaa, bbb, qqq, ccc]
}
}
2. 五种遍历方式对比
迭代器遍历 | 在遍历的过程中需要删除元素,请使用迭代器。 |
列表迭代器 | 在遍历的过程中需要添加元素,请使用列表迭代器。 |
增强for遍历 | 仅仅想遍历,那么使用增强for或Lambda表达式 |
Lambda表达式 | |
普通for遍历 | 如果遍历的时候想要操作索引,可以使用普通for。 |
三、ArrayList集合底层原理
- 利用空参创建创建的集合,在底层创建一个默认长度为0的数组。
- 添加第一个元素时,底层会创建一个新的长度为10的数组。
- 存满时,会扩容1.5倍。
- 如果一次添加多个元素,1.5倍还放不开,则新创建数组的长度以实际为准。
四、LinkedList集合
- 底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。
- LinkedList本身多了很多直接操作首尾元素特有API。
特有方法 说明 public void addFirst (E e) 在该列表开头插入指定的元素 public void addLast (E e) 将指定的元素追加到此列表的末尾 public E getFirst ( ) 返回此列表中的第一个元素 public E getLast ( ) 返回此列表中的最后一个元素 public E removeFirst ( ) 从此列表中删除并返回第一个元素 public E removeLast ( ) 从此列表中删除并返回最后一个元素
添加第一个元素 | |
添加第二个元素 | |
添加第三个元素 |