jdk8

jdk8中接口默认方法,以及在Mybatis中MapperProxy的应用

好久不见. 提交于 2020-01-20 20:52:15
默认方法的介绍 自jdk8开始接口中可以声明default方法。 oracle官网jdk各个版本更新信息的地址: https://docs.oracle.com/en/java/javase/index.html jdk8中对新增的默认方法的介绍: 官网介绍连接 Default methods enable new functionality to be added to the interfaces of libraries and ensure binary compatibility with code written for older versions of those interfaces. 默认方法允许将新功能添加到库的接口,并确保与为这些接口的较早版本编写的代码二进制兼容。 默认方法的原理 default声明的方法编译后实际上是public修饰的非abstract方法 //声明接口 public interface Java8interface { int num = 100 ; void Method ( ) ; default void defaultMethod ( ) { System . out . println ( "I am default method!" ) ; } } //反编译结果 //默认修饰符 //方法:public abstract /

IDEA开发java版本spark程序

こ雲淡風輕ζ 提交于 2020-01-19 18:51:40
如何去创建项目这里就不对讲了,可以参考 : https://www.cnblogs.com/braveym/p/12214367.html 先在pom.xml文件里面添加spark依赖包 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.3.0</version> </dependency> 新建一个java类 编写代码 package com.dtiantai; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.FlatMapFunction; import org.apache.spark.api.java.function.Function2; import org.apache.spark.api.java.function.PairFunction

ConcurrentHashMap源码解析 JDK8

*爱你&永不变心* 提交于 2020-01-14 17:33:54
一、简介 上篇文章 详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理。 首先在看本文之前,希望对HashMap有一个详细的了解。不然看直接看ConcurrentHashMap的源码还是有些费劲的。 相信对HashMap,HashTable有一定了解,应该知道HashMap是不具备线程安全性的,在resize时会丢数据(JDK8),而HashTable虽然保证了线程安全性,但是其是通过给每个方法加Synchronized关键字达到的同步目的。但是都知道Synchronized在竞争激烈的多线程并发环境中,在性能上的表现是非常不如人意的。那在高并发环境中HashMap如何保证线程安全而又不浪费太多性能呢?答案就是Java J.U.C并发包中的ConcurrentHashMap。 依然开局一张图。JDK8中的ConcurrentHashMap数据结构。 呃呵,和HashMap的结构是一样的,没错在数据结构层面,ConcurrentHashMap和HashMap是完全一样的。有了这个基础继续往下看。 二、历史版本 ConcurrentHashMap的历史版本大致分界线在JDK8。也就是可以分为JDK8和JDK8以前版本。 数据结构的区别 在JDK8之前HashMap没有引入红黑树,同样的ConcurrentHashMap也没有引入红黑树

JDK8新特性(四):Optional 类的使用

≡放荡痞女 提交于 2020-01-12 14:48:51
Optional类的使用 JDK8以前,编写代码,通常会出现 NullPointerException (空指针异常),通常情况下我们都是通过 if ... else... 来对对象进行为空判断,然后再进行逻辑处理,代码写起来也比较冗余。 JDK8新增了Optional类,使用该类可以避免我们对空指针的检查,使代码看起来比较优雅。 1.Optional类介绍 JDK8 新增了 Optional 类, Optional 类是一个没有子类的工具类。我们可以把 Optional 类看作是一个容器。这个容器它有两种情况:①要么有值 ②要么为null。如下图所示: 2.以前对 null 的处理方式 public class Demo { public static void main(String[] args) { Person person = new Person("Lucy",18,"BeiJing"); if(person != null){ System.out.println(person); }else{ System.out.println("person为空"); } } } 3.创建 Optional 类对象的方式 //创建 Optional 类,共有如下 3 种方式: //1.创建一个 Optional 实例 Optional.of(T t); //2.创建一个空的

JDK8的新特性——Lambda表达式

天涯浪子 提交于 2020-01-03 16:45:15
  JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”。尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知。   国内的开发环境大家都知道,有各种的老项目,有各种各样的发布风险,让公司以及项目组对新的技术往往望而却步,有公司甚至时至今日还在使用JDK6来进行项目开发,这导致了在很多技术的选择上受到了很大限制,进而不能跟随时代的脚步使得项目甚至公司一步一步走向衰落。   本文简单认识JDK8的重要新特性之一——Lambda表达式。 在JDK8之前,Java是不支持函数式编程的,所谓的函数编程,即可理解是将一个函数(也称为“行为”)作为一个参数进行传递。通常我们提及得更多的是面向对象编程,面向对象编程是对数据的抽象(各种各样的POJO类),而函数式编程则是对行为的抽象(将行为作为一个参数进行传递)。在JavaScript中这是很常见的一个语法特性,但在Java中将一个函数作为参数传递这却行不通,好在JDK8的出现打破了Java的这一限制。 认识Lambda表达式    首先来引入一个示例,不知给是否有在IDEA编写代码的经历,如果在JDK8的环境下如下所示按照Java传统的语法规则编写一个线程。 1 new Thread(new Runnable() { 2 @Override 3

Linux在线安装jdk8,并配置环境变量

折月煮酒 提交于 2019-12-25 05:07:14
1.创建相关目录:下载目录、安装目录 下载目录: cd / 2.下载jdk8到目录 下载前先跳转到下载目录,比如希望最后压缩包下载到 /home/bak/ 下, 则先创建bak目录,命令如下: 注意:如果当前已经处于/home目录下,则可以用相对路径创建 mkdir bak ,也可以使用绝对路径(即始终以根目录为起始位置),命令: mkdir /home/bak 在线下载jdk8,命令如下: wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz 下载完成检测该目录下是否存在我们下载的安装包 ls –la 3.解压缩 把下载的压缩包解压到指定目录/usr/java下面 tar zxvf jdk-8u201-linux-x64.tar.gz -C /usr/java/ 4.配置环境变量 4.1 进入vim编辑模式 命令如下: vim /etc/profile 4.2按键盘e键,代表选择编辑模式 4

基于JDK8的List基本操作方法

旧街凉风 提交于 2019-12-11 11:46:16
//List转换为逗号分隔的字符串 List<Integer> list = Stream.of(1, 2, 3).collect(Collectors.toList());//jdk8 初始化List String result=StringUtils.join(list .toArray(), ",");//list转换为逗号分隔的字符串 System.out.println("【List转换为逗号分隔字符串】:"+result);//1,2,3 //List取交集、差集、合集 List<Integer> list1 = Stream.of(1,2,3,6).collect(Collectors.toList());//jdk8 初始化List List<Integer> list2 = Stream.of(1,2,3,7,9).collect(Collectors.toList());//jdk8 初始化List // List差集 (list1 - list2 取出list1在list2中没有的元素) List<Integer> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList()); System.out.println("【差集 reduce1 (list1 -

学习-jdk8 特性

北城以北 提交于 2019-12-10 12:07:51
jdk8新特性 Lambda 表达式 Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 默认方法 默认方法就是一个在接口里面有了一个实现的方法。 新工具 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。 Stream API 新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。 Date Time API 加强对日期与时间的处理。 Optional 类 Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。 Nashorn, JavaScript 引擎 Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用 #### Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。 lambda表达式的重要特征: 可选类型声明:不需要声明参数类型

JDK8中接口的新特性

风格不统一 提交于 2019-12-10 08:49:49
在JDK8环境中,接口中的方法不再是只能有抽象方法,还可以有静态方法和default方法。实现类只需要实现它的抽象方法即可,JDK8中的接口有愈发向抽象类靠拢的感觉。 关于静态方法和默认方法作如下简述: 1、静态方法:public static 方法名 [throws异常列表] 在接口中直接由接口名调用,不需要由接口的实现类对象来调用。 2、default方法:public default void defaultMethod(){}【default不能省略】 由于Java中是单继承的,但接口可以同时实现多个。所以,若2个接口存在同名,同参数的默认方法,将无法识别到底调用的是哪个接口的方法,此时必须在实现类中 显式重写default方法 ,而关于default的方法的重写,我们在实现类中 不需要继续出现default关键字也不能出现default关键字 。 注意: 重写default方法的访问权限必须是public , 子类重写接口默认方法时必须去掉default 。因为default方法除了没有显式的访问修饰符外,只能用public访问限定符来修饰,而在Java中重写一个方法,访问限定符一定要大于父类或者接口指定的访问限定符范围,而且方法声明处抛出异常也要大于后者。所以访问权限必须是public。 @Override public void defaultMethod(){} /

深入分析 JDK8 中 HashMap 的原理、实现和优化

久未见 提交于 2019-12-10 05:09:16
HashMap 可以说是使用频率最高的处理键值映射的数据结构,它不保证插入顺序,允许插入 null 的键和值。本文采用 JDK8 中的源码,深入分析 HashMap 的原理、实现和优化。首发于微信公众号 顿悟源码 . 1. 基本结构 HashMap 基于散列表实现,使用 拉链法 处理碰撞,在 JDK8 中,当链表长度大于 8 时转为 红黑树 存储,基本结构如下: HashMap 有一个 Node<K,V>[] table 字段,即哈希桶数组,数组元素是 Node 对象,结构定义如下: static class Node<K,V> implements Map.Entry<K,V> { final int hash; // 用于计算数组索引 final K key; V value; Node<K,V> next; // 后继节点,下一个 Node Node(int hash, K key, V value, Node<K,V> next) { ... } ... } 哈希桶数组会在首次使用时初始化,默认大小是 16,并根据需要调整大小,且长度总是 2 的次幂。如果构造函数设置的初始容量不是 2 的次幂,那么使用以下方法返回一个 大于且最靠近 它的 2 的次幂的值: static final int tableSizeFor(int cap) { int n = cap - 1; n