Java的集合框架
Java的集合框架有哪些数据结构?
- List(列表):有序的集合,可以包含重复元素。常用的实现类有ArrayList、LinkedList和Vector。
- Set(集):不允许包含重复元素的集合。常用的实现类有HashSet和TreeSet。
- Queue(队列):按照一定规则进行插入和删除操作的集合。常用的实现类有LinkedList和PriorityQueue。
- Map(映射):存储键值对的集合,每个键只能出现一次。常用的实现类有HashMap、TreeMap和LinkedHashMap。
- Stack(栈):后进先出(LIFO)的集合,常用的实现类是Stack。
- 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());
}