接口
1、接口中可以有 default 方法、静态方法,静态方法可通过接口直接调用, default 方法必须通过对象调用。实现接口的类不能继承接口静态方法,接口中可以声明 abstract 方法,此时,abstract 方法跟接口中的普通方法具有相同效果。
2、函数式接口 @FunctionalInterface 作用,当在接口中添加第二个抽象方法时,编译器会报错。
3、方法引用关键字 ::,引用静态方法通过类名引用,引用普通方法要通过对象引用。引用构造方法使用 ::new 方式。
4、Lambda 表达式中使用局部变量需要局部变量为隐式 final。使用成员变量和静态变量,可在匿名类中修改变量值。
5、接口中带有的具有默认实现的方法不能在 lambda 表达式中使用。
6、函数式接口 Supplier 只能使用对象无参构造器。
7、Reduce 接口,通过入参的 Function 对象,能够将 list 归约为一个值,返回类型是 Optional 类型。
Java内存使用
1、运行时数据区域
1、虚拟机栈是方法执行时用于存储局部变量表(基本数据类型、对象引用、方法返回),操作数栈、动态链接、方法出口等信息。
2、堆。所有线程共享的内存区域,在JVM启动时创建。大部分对象及数组在堆上分配内存。堆是垃圾收集器主要管理的内存区域。堆大小通过虚拟机参数:-Xmx 和 -Xms 控制。
3、方法区,虚拟机规范中方法区是堆的一个逻辑部分,但它有个别名叫“非堆”,属于线程间共享内存。方法区用于存储已被虚拟机加载的类信息、常量、静态变量、编译后的代码等。垃圾收集器基本不在方法区内活动。
4、直接内存。JDK1.4 中新加入了 NIO,引入了基于通道(channel)和缓冲区(Buffer)的IO 方式,可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样可以避免 Java 堆和 Native 堆来回复制数据,提高了性能。
对象创建的过程
对象内存布局
HotSpot 虚拟机中,对象在堆内存中的布局可以分为三部分:对象头、实例数据、补齐。
对象头包括两类信息:Mark Word 和类型指针。类型指针用来确定该对象是哪个类的实例。不是所有虚拟机实现都必须在对象数据上保留类型指针。
对象访问定位。主流访问方式主要有使用句柄和直接指针两种