List
1、实现
Java List 实现: ArrayList、LinkedList。
1、ArrayList
- 数组实现,可以随机访问,查找快。
- 物理连续性,增删中间元素需移动后续元素。指定 index 添加数据,就需要拷贝 index 后面的数据后移一位。
- 动态数组,初始化时是一个空数组,在第一次 add 时设置初始容量为 10,每次扩容都增加到原来的 1.5 倍。
2、LinkedList - 链表实现,查找元素需从头访问
- 增删快
2、初始化
public static void initList() {
List<Integer> list = new ArrayList<Integer>(){};
list.add(2);
list.add(3);
// 另一写法
List<Integer> list2 = new ArrayList<Integer>(){{add(5);add(6);}};
// Java9支持,List对象不可修改
// List<Integer> list3 = List.of(23, 44, 15);
}
3、增删
public static void modifyList() {
List<String> list = new ArrayList<>();
list.add("ok");
list.add("no");
list.add("yes");
System.out.println(list); // [ok, no, yes]
// 通过下表移除
list.remove(1);
System.out.println(list); // [ok, yes]
// 通过对象移除
list.remove("ok"); // [yes]
System.out.println(list);
}
4、打印
public static void printList() {
List<Integer> list = new ArrayList<Integer>(){};
// 直接打印
System.out.println(list);
// 转成Array后打印
System.out.println(Arrays.toString(list.toArray()));
// forEach方法
list.forEach(System.out::println);
// 重写class的toString()方法
Student student = new Student(2);
Student student2 = new Student(3);
List<Student> listStudent = new ArrayList<>();
listStudent.add(student);
listStudent.add(student2);
System.out.println(listStudent);
}
5、遍历
public static void getList(List<?> list) {
// 迭代器,通过Iterator遍历List永远是最高效的方式
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
public static class Student{
private int age;
public Student(int age) {
this.age = age;
}
@Override
public String toString() {
return "age = " + age;
}
}
6、排序
public static void sortList(List<String> list) {
list.add(0, "a");
list.add(1, "cc");
list.add(0, "aa");
// Collections排序方法,默认升序排序
Collections.sort(list);
System.out.println(list); // a aa cc
// 降序排序:重写Collections的sort方法
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
System.out.println(list); // cc aa a
// 降序排序:Collections的reverse方法
Collections.reverse(list);
System.out.println(list); // a aa cc
List<Integer> intList = new ArrayList<Integer>(){};
intList.add(2);
intList.add(3);
Collections.sort(intList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(intList); // [3, 2]
}
public static void sortObjectList() {
List<Human> list = new ArrayList<>();
list.add(new Human("F", 4, "fff"));
list.add(new Human("A", 12, "aaa"));
list.add(new Human("N", 1, "nnn"));
Collections.sort(list, new Comparator<Human>() {
@Override
public int compare(Human o1, Human o2) {
// 以升序排序,返回1标识交换位置,返回-1表示顺序不变,返回0表示相等
int ret = o1.getAge() - o2.getAge();
if (ret > 0) {
return 1;
} else if (ret < 0) {
return -1;
} else {
return 0;
}
}
});
System.out.println(list);
}
static class Human {
private String name;
private int age;
private String city;
public Human(String name, int age, String city){
this.name = name;
this.age = age;
this.city = city;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Human{" +
"name='" + name + '\'' +
", age=" + age +
", city='" + city + '\'' +
'}';
}
}
7、完整代码
import java.util.*;
public class ListNotes {
public static void main() {
initList(); // 初始化
modifyList(); // 增删
printList(); // 打印
getList(new ArrayList<String>()); // 遍历
sortList(new ArrayList<>()); // 排序
sortObjectList(); // 对象排序
}
public static void initList() {
List<Integer> list = new ArrayList<Integer>(){};
list.add(2);
list.add(3);
// 另一写法
List<Integer> list2 = new ArrayList<Integer>(){{add(5);add(6);}};
// Java9支持,List对象不可修改
// List<Integer> list3 = List.of(23, 44, 15);
}
public static void modifyList() {
List<String> list = new ArrayList<>();
list.add("ok");
list.add("no");
list.add("yes");
System.out.println(list); // [ok, no, yes]
// 通过下表移除
list.remove(1);
System.out.println(list); // [ok, yes]
// 通过对象移除
list.remove("ok"); // [yes]
System.out.println(list);
}
public static void printList() {
List<Integer> list = new ArrayList<Integer>(){};
// 直接打印
System.out.println(list);
// 转成Array后打印
System.out.println(Arrays.toString(list.toArray()));
// forEach方法
list.forEach(System.out::println);
// 重写class的toString()方法
Student student = new Student(2);
Student student2 = new Student(3);
List<Student> listStudent = new ArrayList<>();
listStudent.add(student);
listStudent.add(student2);
System.out.println(listStudent);
}
public static class Student{
private int age;
public Student(int age) {
this.age = age;
}
@Override
public String toString() {
return "age = " + age;
}
}
public static void getList(List<?> list) {
// 迭代器,通过Iterator遍历List永远是最高效的方式
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
public static void sortList(List<String> list) {
list.add(0, "a");
list.add(1, "cc");
list.add(0, "aa");
// Collections排序方法,默认升序排序
Collections.sort(list); // a aa cc
System.out.println(list);
// 降序排序:重写Collections的sort方法
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
}); // cc aa a
System.out.println(list);
// 降序排序:Collections的reverse方法
Collections.reverse(list); // a aa cc
System.out.println(list);
}
public static void sortObjectList() {
List<Human> list = new ArrayList<>();
list.add(new Human("F", 4, "fff"));
list.add(new Human("A", 12, "aaa"));
list.add(new Human("N", 1, "nnn"));
Collections.sort(list, new Comparator<Human>() {
@Override
public int compare(Human o1, Human o2) {
// 以升序排序,返回1标识交换位置,返回-1表示顺序不变,返回0表示相等
int ret = o1.getAge() - o2.getAge();
if (ret > 0) {
return 1;
} else if (ret < 0) {
return -1;
} else {
return 0;
}
}
});
System.out.println(list);
}
static class Human {
private String name;
private int age;
private String city;
public Human(String name, int age, String city){
this.name = name;
this.age = age;
this.city = city;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Human{" +
"name='" + name + '\'' +
", age=" + age +
", city='" + city + '\'' +
'}';
}
}
}