跳转到内容

Java的集合框架

Java的集合框架有哪些数据结构?

Section titled “Java的集合框架有哪些数据结构?”
  1. List(列表):有序的集合,可以包含重复元素。常用的实现类有ArrayList、LinkedList和Vector。
  2. Set(集):不允许包含重复元素的集合。常用的实现类有HashSet和TreeSet。
  3. Queue(队列):按照一定规则进行插入和删除操作的集合。常用的实现类有LinkedList和PriorityQueue。
  4. Map(映射):存储键值对的集合,每个键只能出现一次。常用的实现类有HashMap、TreeMap和LinkedHashMap。
  5. Stack(栈):后进先出(LIFO)的集合,常用的实现类是Stack。
  6. Deque(双端队列):可以在两端进行插入和删除操作的队列。常用的实现类有ArrayDeque和LinkedList。

学生实体类,包含姓名和年龄属性,比较时先按姓名升序排序,如果姓名相同则按年龄升序排序。

public class Student implements Comparable<Student>{
private String name;
private int age;
@Override
public int compareTo(Student o) {
int flag = this.name.compareTo(o.name);
if(flag == 0) {
flag = this.age - o.age;
}
return flag;
}
}
//Collections.sort(students);
public class Student {
private String name;
private int age;
}
Collections.sort(students, (o1, o2) -> {
int flag = o1.getName().compareTo(o2.getName());
if(flag == 0) {
flag = o1.getAge() - o2.getAge();
}
return flag;
});

借助Stream进行排序,借助Stream的API,底层还是通过Comparable实现的。

public class Student {
private String name;
private int age;
}
// 如果Student实现了Comparable
students.stream().sorted().collect(Collectors.toList());
// 如果Student没有实现Comparable
students.stream().sorted((o1, o2) -> {
int flag = o1.getName().compareTo(o2.getName());
if(flag == 0) {
flag = o1.getAge() - o2.getAge();
}
return flag;
}).collect(Collectors.toList());
public void listRemove() {
List<Student> students = this.getStudents();
for (int i=0; i<students.size(); i++) {
if (students.get(i).getId()%3 == 0) {
Student student = students.get(i);
students.remove(student);
//做一次i--,避免漏删
i--;
}
}
}
public void iteratorRemove() {
List<Student> students = this.getStudents();
Iterator<Student> stuIter = students.iterator();
while (stuIter.hasNext()) {
Student student = stuIter.next();
if (student.getId() % 2 == 0) {
//这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException
stuIter.remove();
}
}
}
public void copyRemove() {
// 注意,这种方法的equals需要重写
List<Student> students = this.getStudents();
List<Student> studentsCopy = deepclone(students);
for(Student stu : students) {
if(needDel(stu)) {
studentsCopy.remove(stu);
}
}
}
public void cowRemove() {
List<String> students = new CopyOnWriteArrayList<>(this.getStudents());
for(Student stu : students) {
if(needDel(stu)) {
students.remove(stu);
}
}
}
public List<String> streamRemove() {
List<String> students = this.getStudents();
return students.stream()
.filter(this::needDel)
.collect(Collectors.toList());
}