JavaJDK8新特性相关知识整理
1、新增接口默认方法和接口静态方法
接口默认方法用default关键字修饰,与抽象方法不同之处在于抽象方法必须要求实现,而默认方法没有这个要求,默认方法本身已经有具体的实现,所有的接口实现类将会默认继承它,也可以覆盖这个默认实现。
private interface Defaulable { // Interfaces now allow default methods, the implementer may or // may not implement (override) them. default String notRequired() { return "Default implementation"; } } private static class DefaultableImpl implements Defaulable { } private static class OverridableImpl implements Defaulable { @Override public String notRequired() { return "Overridden implementation"; } }
接口静态方法用static关键字修饰,有具体的方法实现。
public interface StaticInterface { static void method() { System.out.println("这是Java8接口中的静态方法!"); } } public class Main { public static void main(String[] args) { StaticInterface.method(); // 输出 这是Java8接口中的静态方法! } }
2、Lambda表达式
Lambda表达式允许把函数作为方法的参数,由逗号分隔的参数列表、->符号和函数体三部分组成
对比使用非Lambda与使用Lambda实现
public class Test2 { public static void main(String[] args) { List<String> names = Arrays.asList("张三","李四","王五","赵六"); //非Lambda表达式实现排序 Collections.sort(names,new Comparator<String>() { @Override public int compare(String a, String b) { return b.compareTo(a); } }); //Lambda表达式实现排序 Collections.sort(names,(a,b)->b.compareTo(a)); System.out.println(names.toString()); } }
3、函数式接口
函数式接口指只有一个函数的接口,使用@FunctionallInterface注解来表明该接口是一个函数式接口。java.lang.Runable和java.util.concurrent.Callable就是函数式接口的例子
使用非Lambda创建线程:
//通过匿名内部类来创建线程 Thread thread1 = new Thread(new Runnable() { @Override public void run() { int a = 0; for(long i = 0; i < count; i++) { a += 1; } } });
使用Lambda表达式创建线程
//通过Lambda表达式创建线程 Thread thread2 = new Thread(()->{ int a = 0; for(long i = 0; i < count; i++) { a += 1; }} );
4、HashMap的底层实现由原来的数组+链表实现改为数组+链表+红黑树实现
5、JVM内存管理方面,由元空间代替了永久代
6、新增java.time包
包含了所有关于日期、时间、时区、持续时间和时钟操作的类,这些类都是不可变的,线程安全
7、引入重复注解@Repeatable