JDK7和JDK8的区别
文章目录
- 1. 接口中的default方法
- 2. lambda表达式
- 3. 函数式接口
- 4. StreamAPI
- 5. 移出永久代,元空间替换
- 6. HashMap中的优化
- 7. currentHashMap的优化
面试总是遇到这个问题,做一个小总结,可能总结的不全
1. 接口中的default方法
一般来说接口中的方法都是不实现的,基本通过实现类来实现方法。但是jdk8中提供了一种被default修饰的方法,可以直接在接口中进行实现。
2. lambda表达式
jdk8引入了lambda表达式,也可称为closure(闭包),通常是在需要一个函数,但又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
由于其几乎被所有主流开发语言支持。是java8新引入的一种语法,是一种紧凑的传递代码的方式。使用lambda表达式可以使代码变的更加简洁紧凑。
3. 函数式接口
函数式接口的引入是为了函数式编程的,函数式编程往往依赖于lambda表达式。
定义函数式接口有两个步骤:
1)确保接口中有且仅有一个抽象方法:
2)使用注解@FunctionalInterface修饰接口
4. StreamAPI
JDK8中引入了StreamAPI,对于学过Flink或Spark的学者应该对此比较熟悉,其实就是类似于一种流式的数据处理,从dataSource到中间的operator操作,再到最后的dataSink。
Stream的中间操作有map,filter等操作。而流式的数据处理往往就是通过函数式编程实现的。
5. 移出永久代,元空间替换
JDK7使用永久代存储类的元数据,JDK8使用元空间存储类的元数据。元空间和永久代都是用来存储class相关信息,包括class对象的Method,Field等,元空间和永久代其实都是方法区的实现,只是实现有所不同,所以说方法区其实只是一种JVM的规范。
区别:
两者最大的区别是元空间使用本地内存,而永久代使用的是JVM的内存。
元空间优势:
优势就是元数据分配只受本地内存大小的限制。本地内存剩余多少理论上metaspace就可以有多大,这解决了空间不足的问题,不过也不可能任其无限壮大,JVM默认在运行时会根据需要动态的设置其大小
6. HashMap中的优化
1)增加红黑树
2)解决jdk1.7多线程下的死循环:
扩容使用尾插法,抛弃头插法
3)rehash的优化:
jdk7扩容的rehash是重新计算桶的位置,而jdk8则进行了优化,不需要进行重新计算。
7. currentHashMap的优化
jdk7是使用分段锁实现线程安全,jdk则使用sy关键字和大量的CAS操作实现。
ETAYO: 实测有效,好评!
菜Cai^-^*: 是在class CIFAR100(CIFAR10)这个里面修改而不是class CIFAR10,我之前改错地方了就出现了这个问题
甜崽团子: 终于明白了
m0_56918183: 说的对。主要想说先操作数据库窗口期会短很多,如果先搞缓存也没有别的方案做保障,然后被写入脏数据了可能是永久性不一致。阿里云给的解决方案单体数据库情况下用了一个异步删除缓存的binlog,也就是这里的,它整体还是先操作了数据库。这个跟你说的一样普适大部分,数据一致性要求严格自然舍弃一些性能以及分区容错。一切取决于业务
晓~: 其实你想想加锁的意义和 redis 的功能性,其实就知道,加锁肯定损耗性能,redis 又是为了提高性能,怎样都会有影响,还是那句话,有舍才有得。一切以完成业务的目的为出发点。