Java 8 的改变及新特性(未完成版)

一、HashMap底层结构的改变

jdk1.7 HashMap : 数组+单向链表

jdk1.8 HashMap : 数组+(单向链表/红黑树)

jdk1.8中多了下图中3个参数

在hashmap中,当hash碰撞大于8(数组单个下标中链表存储大于8个数据),并且总容量大于64(整个 hashmap中总大小大于64)时,hashmap的链表结构会转变为红黑树结构进行存储

改变原因:链表结构数据量过大时查询效率会降低,而转变为红黑树后除了添意外其他效率都会大大增加

二、删除永久区变为元空间

1、PermGen(永久代)

“方法区”是JVM的规范,而“永久代”是方法区的一种实现,并且只有HotSpot才有“PermGen space”,而对于其他类型的虚拟机并没有“PermGen space”。

在JDK1.8中,HotSpot已经没有“PermGen space”这个区间了,取而代之是Metaspace(元空间)

2、Metaspace(元空间)

在JDK1.8中,永久代已经不存在,存储的类信息、编译后的代码数据等已经移动到了MetaSpace(元空间)中,元空间并没有处于堆内存上,而是直接占用的本地内存(NativeMemory)。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。

不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存(物理内存)

3、堆内存划分

JDK1.7以及其前期的JDK版本中,堆内存通常被分为三块区域:Young Generation、Old Generation、Permanent Generation for VM Matedata

JDK1.8中把存放元数据中的永久内存从堆内存中移到了本地内存中,JDK1.8中JVM堆内存结构就变成了如下: 

三、Lambda表达式 

Lambda表达式专门针对只有一个方法的接口(即函数式接口

Java 8 内部Lambda 表达式的实现方式在本质是以匿名内部类的形式的实现的

lambda表达式的基本格式为 (x,y...)->{表达式...};

  1. 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  2. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  3. 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  4. 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

语法:

(parameters) -> expression
(parameters) -> statement
(parameters) -> { statements; }

举例:

() -> Math.PI * 2.0
(int i) -> i * 2
(String s) -> s.length()
(int i0, int i1) -> i0 + i1
(int x, int y) -> { return x + y; }

函数式接口

  • 只有函数式接口,才可以转换为lambda表达式,什么是函数式接口呢?
  • 有且只有一个抽象方法的接口被成为函数式接口!
  • 函数式接口可以显式的被 @FunctionalInterface 所表示,当被标识的接口不满足规定时,编译器会提示报错

Runnable接口就是一个函数式接口

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

转换方式

1、当函数式接口内的唯一抽象方法没有参数时,可以使用如下方式

//如果方法体内只有一条语句
//无返回值
() -> System.out.println("test");
//有返回值,不需要显示的return
() -> new Student();

//如果有多条语句,需要用{}包围
//无返回值
() -> {
    int a = 1;
    int b = 2;
    System.out.println(a * b);
};
//有返回值
() -> {
    int a = 1;
    int b = 2;
    return a * b;
};

2、当函数式接口内的唯一抽象方法含有参数时,写法与上面基本相同,只是需要把对应参数写到()里面

//不需要指明参数类型,会根据实际方法中的类型自动推测
//只有一个参数可以省略括号
(arg1, arg2, arg3) -> System.out.println(arg1 * arg2 * arg3);

3、举个例子

//自定义一个函数式接口
@FunctionalInterface
public interface MyInterface {
    void method(int a, int b);
}
    //使用lambda表达式
    public static void main(String[] args) {
        MyInterface myInterface = (a, b) -> System.out.println(a + b);
        myInterface.method(1, 2);//3
    }
发布了69 篇原创文章 · 获赞 43 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/fox_bert/article/details/102827695
今日推荐