(一)jdk8学习心得之遍历

一、遍历 -- 最好和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");
}

 

 

转载于:https://www.cnblogs.com/lennar/p/10752061.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值