Java : List集合接口

在实际的开发过程中, List集合接口的使用比率可以达到 Collection 系列的 80%, 在进行集合处理的时候, 优先考虑 List 集合接口.

在这个List接口里面有两个重要的扩充方法:

public E get(int index) // 根据索引取得保存数据
public E set(int index, E element) // 修改数据

List 子接口与 Collection 接口相比最大的特点在于, 其有一个 get() 方法, 可以根据索引取得内容. 但是 List 本身还属于一个接口, 要想取得接口的实例化对象, 就必须有子类, 在 List 接口下有 三个常用子类:

  1. ArrayList
  2. Vector
  3. LinkedList
    在这里插入图片描述
    最终的操作还是应该以接口为主, 那么既然要以接口为主则只参考接口的定义即可.

ArrayList 子类 (90% 使用)

ArrayList 是一个针对于 list 接口的数组操作实现, 那么下面首先利用 ArrayList 做基本操作

范例: 观察List 基本操作

package com.beyond.dhl;

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
    
    
	public static void main(String[] args) {
    
    

		List<String> all = new ArrayList<String>(); // 此时的集合里面只允许保存 String数据类型
		all.add("Hello");
		all.add("Hello"); // 重复数据
		all.add("Hello");
		System.out.println(all);
	}

}

通过此时的观察可以得到证实: List 允许保存有重复数据

package com.beyond.dhl;

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
    
    
	public static void main(String[] args) {
    
    

		List<String> all = new ArrayList<String>(); // 此时的集合里面只允许保存 String数据类型
		System.out.println(all.size() + ", " + all.isEmpty());
		all.add("Hello");
		all.add("Hello"); // 重复数据
		all.add("World");
		all.remove("Hello");
		System.out.println(all.size() + ", " + all.isEmpty());
		System.out.println(all.contains("heoo") + "," + all.contains("World"));
		System.out.println(all);
		System.out.println(Math.round(-15.61));
	}

}

在这里插入图片描述

范例: 观察 List 的 get() 操作

package com.beyond.dhl;

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
    
    
	public static void main(String[] args) {
    
    

		List<String> all = new ArrayList<String>(); // 此时的集合里面只允许保存 String数据类型
		all.add("Hello");
		all.add("Hello"); // 重复数据
		all.add("World");
		for (int x = 0; x < all.size() ; x++) {
    
    
			System.out.println(all.get(x));
		}
	}

}

注意:

get() 方法是 List子接口的, 如果现在你使用的不是 List 而是Collection(虽然这种情况大多数不会发生), 那么对于此时的数据取出你只能够将集合变成对象数组来操作了.

操作结果以 Object形式返回, 那么就有可能需要向下转型, 那么就有可能造成 ClassCastException 安全隐患

范例: 通过 Collection 进行输出处理 (Collection 可没有 get() 方法 )

package com.beyond.dhl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class TestDemo {
    
    
	public static void main(String[] args) {
    
    

		Collection<String> all = new ArrayList<String>(); // 此时的集合里面只允许保存 String数据类型
		all.add("Hello");
		all.add("Hello"); // 重复数据
		all.add("World");
		
		// 操作以 Object形式返回, 那么就有可能需要向下转型 (不转的话可以通过反射实现), 那么就有可能造成 ClassCastException 安全隐患
		Object[] result = all.toArray();  // 变为Object 对象数组
		System.out.println(Arrays.toString(result));
		
		
	}

}

此类型的操作在开发中尽量回避, 所写的代码不到万不得已(一半不会出现), 不要使用 Collection.

List 与 简单Java 类

Integer 可以操作空, 而 int只有 0 和数字
在实际的开发之中, 集合中保存最多的数据类型就是简单 Java 类. 所以下面针对简单java类的操作做一个说明.

范例: 向集合保存简单 java类对象

package com.beyond.dhl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;


class Persion{
    
    
	private String name;
	private Integer age;   // Integer 可以操作空, 而 int只有 0 和数字
	public Persion(String name, Integer age) {
    
    
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
    
    
		if (obj == this) {
    
    
			return true;
		}
		if (obj == null) {
    
    
			return false;
		}
		if (!(obj instanceof Persion)) {
    
    
			return false;
		}
		Persion per = (Persion) obj;  // 这个地方可以向下转型
		return this.name.equals(per.name) && this.age.equals(per.age);
		
	}
	public String getName() {
    
    
		return name;
	}
	public void setName(String name) {
    
    
		this.name = name;
	}
	public Integer getAge() {
    
    
		return age;
	}
	public void setAge(Integer age) {
    
    
		this.age = age;
	}
	@Override
	public String toString() {
    
    
		return "Persion [name=" + name + ", age=" + age + "]";
	}
	
}
public class TestDemo {
    
    
	public static void main(String[] args) {
    
    
		List<Persion> all = new ArrayList<Persion>();
		all.add(new Persion("张三", 10));
		all.add(new Persion("张四", 11));
		all.add(new Persion("张五", 12));
		
		// 对于集合中的 contains(), remove() 必须在该类中有 equals() 的支持
		System.out.println(all.contains(new Persion("张五", 12)));
		System.out.println(all.remove(new Persion("张五", 12)));
		for (int x = 0; x < all.size(); x++) {
    
    
			System.out.println(all.get(x));
		}
	}

}

注意: 对于集合中的 contains(), remove() 必须在该类中有 equals() 的支持

在这里插入图片描述
在这里插入图片描述
从理论上讲 contains(), remove() 需要 equals() 支持, 但是实际上我们很少有人真去这么做, 也就是说 简单java 类中出现 equals() 方法的机率是很低的

猜你喜欢

转载自blog.csdn.net/Beyond_Nothing/article/details/112692579