Java—List的使用【数据结构】

x33g5p2x  于2021-09-27 转载在 Java  
字(5.5k)|赞(0)|评价(0)|浏览(573)

总览:

List 接口继承于Collection接口
List 特指:线性表这一类数据结构,而List的典型实现有:Vector,ArrayList 和 LinkedList三个
其中 Vector 和 ArrayList 表示顺序表,而 LinkedList 表示链表

List 常用方法

boolean add(E e) — 尾插 e

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Java");
  4. }

void add(int index,E element) — 将 e 插入到 index 位置

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add(1,"Yolo!");
  4. }

boolean addAll(Collection<? extends E> c) — 尾插 c 中的元素

将指定集合中的所有对象添加到该集合中, c 表示是要添加到该列表中的元素的集合

? 表示通配符,extends E,表示插入的元素必须是 E 或 其子类

  1. List<String> list = new ArrayList<>();
  2. Collection<String> collection = new ArrayList<>();
  3. collection.add("Hello");
  4. collection.add("World");
  5. list.addAll(collection);

输出结果:

boolean addAll(int index, Collection<? extends E> c) — 指定位置插入 c 中的元素

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Java");
  4. list.add(1,"Yolo");
  5. Collection<String> collection = new ArrayList<>();
  6. collection.add("Hello");
  7. collection.add("World");
  8. list.addAll(0,collection);
  9. System.out.println(list);
  10. }

输出结果:

E remove(int index) — 删除 index 位置元素

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Java");
  4. list.add(1,"Yolo");
  5. list.remove(0);
  6. System.out.println(list);
  7. }

输出结果:

boolean remove(Object o) — 删除遇到的第一个元素 o

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. list.remove("Yolo");
  8. System.out.println(list);
  9. }

输出结果:

void clear() — 清空

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. System.out.println("清空前:" + list);
  6. list.clear();
  7. System.out.println("清空后:" + list);
  8. }

输出结果:

E set(int index,E element) 将下标 index 位置元素设置为 element

此处注意,下标不能越界

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println("修改前:" + list);
  7. list.set(1,"Codeing");
  8. System.out.println("修改后:" + list);
  9. }

输出结果:

E get(int index) — 获取下标 index 位置元素

此处注意,下标不能越界

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. System.out.println(list.get(0));
  8. }

int indexOf(Object o) — 返回第一个 o 所在下标

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list)
  7. int index = list.indexOf("Yolo");
  8. System.out.println("第一个Yolo所在下标:" + index);
  9. }

输出结果:

int lastIndexOf(Object o) — 返回最后一个 o 的下标

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. int lastIndex = list.lastIndexOf("Yolo");
  8. System.out.println("最后一个Yolo所在下标:" + lastIndex);
  9. }

输出结果:

补充

boolean contains(Object o) — 判断 o 是否在线性表中

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. System.out.println(list.contains("Java"));
  8. }

输出结果:

int size( ) — 获取集合中有多少个元素

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. System.out.println(list.size());
  8. }
  9. 输出结果:3

boolean isEmpty( ) — 判断集合是否为空

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. System.out.println(list.isEmpty());
  8. list.clear();
  9. System.out.println(list.isEmpty());
  10. }

输出结果:

使用 subList 获取子序列

原型:List subList(int fromIndex,int toIndex) — 截取部分 list
.
包含下标为 fraoIndex的元素,不包含下标为toIndex的元素

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. System.out.println(list.subList(0, 2));
  8. }

输出结果:

foreach 访问每个元素

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. for(String s : list){
  8. System.out.println(s);
  9. }
  10. }

输出结果:

传统 for循环 访问每个元素

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Yolo");
  4. list.add("Java");
  5. list.add(2,"Yolo");
  6. System.out.println(list);
  7. for (int i = 0; i < list.size(); i++) {
  8. System.out.println(list.get(i));
  9. }
  10. }

输出结果:

使用构造方法构造出新的 List 对象

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("Cpp");
  4. list.add("Java");
  5. list.add("Python");
  6. list.add("C#");
  7. System.out.println(list);
  8. //拷贝一份 list,即:将list拷贝一份给list2
  9. List<String> list2 = new ArrayList<>(list);
  10. System.out.println(list2);
  11. }

思考: 此处为深拷贝还是浅拷贝?

首先,想到的就是 修改 list 的元素,查看 list2 中是否发生改变

  1. List<String> list2 = new ArrayList<>(list);
  2. System.out.println("拷贝了一份list:");
  3. System.out.println(list2);
  4. list.set(0,"PHP");
  5. System.out.println(list2);

在此处,并不可行,因为在Java中,String类是不可变的

验证是否为深拷贝
需要给 list 泛型参数填一个可变对象的类型才可以,此处也可使用StringBulider

注意:
set 和 get,对于 LinkedList 和 ArrayList均有效
若是ArrayList随机访问比较高效,若是LinkedList这样的操作比较低效

相关文章

最新文章

更多