跳至主要內容

Java的集合框架

ZnyoungJava集合

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。

集合的几种排序方式

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

实现Comparable

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);

借助Comparator

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进行排序,借助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());

遍历的同时如何修改一个List

普通的fori循环

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();
        } 
    }
} 

副本(fail-safe)

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);
        }
    }
}

Stream

public List<String> streamRemove() { 
    List<String> students = this.getStudents();
    return students.stream()
        .filter(this::needDel)
        .collect(Collectors.toList());
}
上次编辑于:
贡献者: 麦正阳