一、遍历 -- 最好和stream流连用
使用jdk8提供的forEach进行遍历时,采用的是多线程的操作,理论上讲是会比原来的方法更快。但是注意,系统启动时需要加载lambda框架的内容。因此如果通过main函数这种直接测试新老方法更快,很有可能因为新方法需要加载lambda,导致性能反而不如老方法。但是,对于启动着的项目,就可以避免由于初次加载lambda导致的问题。
1、 list遍历
List对象.forEach((item)->{
循环体要进行的操作;
});
注:item就是每一个list元素
public void forEachInList() {
List<Teacher> list
= new ArrayList<>();
for (int i = 1; i < 1000000; i++) {
Student student = new Student("学生编号" + i, "学生姓名" + i);
Teacher teacher = new Teacher("老师姓名" + i, student);
list.add(teacher);
}
long start2
= System.currentTimeMillis();
for (Teacher teacher : list) {
String teacherName
= teacher.getTeacherName();
Student student = teacher.getStudent();
String stuId
= student.getStuId();
String stuName
= student.getStuName();
for (int i = 0; i < 10000; i++) {
}
}
long end2
= System.currentTimeMillis();
System.out.println("老方法遍历list:" + (end2 - start2) + "ms");
long start1
= System.currentTimeMillis();
list.forEach((item) -> {
String teacherName
= item.getTeacherName();
Student student = item.getStudent();
String stuId
= student.getStuId();
String stuName
= student.getStuName();
for (int i = 0; i < 10000; i++) {
}
});
long end1
= System.currentTimeMillis();
System.out.println("新方法遍历list:" + (end1 - start1) + "ms");
}
2、 Map遍历
Map对象.forEach((key,value)->{
循环体内需要进行的操作;
});
注:key就是每一个map元素的键,value就是每一个map元素的值;key与value是成对的。
public void forEachInMap() {
Map<Integer, Teacher> map = new HashMap<>();
for (int i = 1; i < 1000000; i++) {
Student student = new Student("学生编号" + i, "学生姓名" + i);
Teacher teacher = new Teacher("老师姓名" + i, student);
map.put(i, teacher);
}
long start2 = System.currentTimeMillis();
for (Map.Entry<Integer, Teacher> entry : map.entrySet()) {
Teacher teacher = entry.getValue();
String teacherName = teacher.getTeacherName();
Student student = teacher.getStudent();
String stuId = student.getStuId();
String stuName = student.getStuName();
for (int i = 0; i < 10000; i++) {
}
}
long end2 = System.currentTimeMillis();
System.out.println("老方法遍历map:" + (end2 - start2) + "ms");
long start1 = System.currentTimeMillis();
map.forEach((key, value) -> {
String teacherName = value.getTeacherName();
Student student = value.getStudent();
String stuId = student.getStuId();
String stuName = student.getStuName();
for (int i = 0; i < 10000; i++) {
}
});
long end1 = System.currentTimeMillis();
System.out.println("新方法遍历map:" + (end1 - start1) + "ms");
}
3、 数组遍历
Collections.addAll(list对象,数组);
List对象. .forEach((item)->{
循环体要进行的操作;
});
注:item就是每一个list元素;由于数组没有提供forEach方法,因此需要先转换成list,通过list进行遍历操作。
此外,可以通过Arrays.stream()或者Stream.of()的方式先将数组转换成stream流,进而使用stream流的forEach方法。
public void forEachInArray() {
Teacher[] teachers = new Teacher[1000000];
for (int i = 0; i < 1000000; i++) {
Student student = new Student("学生编号" + i, "学生姓名" + i);
Teacher teacher = new Teacher("老师姓名" + i, student);
teachers[i] = teacher;
}
long start2 = System.currentTimeMillis();
for (Teacher teacher : teachers) {
String teacherName = teacher.getTeacherName();
Student student = teacher.getStudent();
String stuId = student.getStuId();
String stuName = student.getStuName();
for (int i = 0; i < 10000; i++) {
}
}
long end2 = System.currentTimeMillis();
System.out.println("老方法遍历数组:" + (end2 - start2) + "ms");
long start1 = System.currentTimeMillis();
List<Teacher> teacherList = new ArrayList<>();
Collections.addAll(teacherList, teachers);
teacherList.forEach((value) -> {
String teacherName = value.getTeacherName();
Student student = value.getStudent();
String stuId = student.getStuId();
String stuName = student.getStuName();
for (int i = 0; i < 10000; i++) {
}
});
long end1 = System.currentTimeMillis();
System.out.println("新方法遍历数组:" + (end1 - start1) + "ms");
}