JDK8新特性PPT课件
- 格式:ppt
- 大小:418.50 KB
- 文档页数:31
•课程介绍与预备知识•基础语法与程序结构•面向对象编程基础目•常用类库与工具使用•图形用户界面开发录•网络编程与数据库连接•多线程编程技术•设计模式与架构思想目•课程总结与展望录Java语言概述及发展历程Java语言的起源与特点01Java的发展历程02Java的应用领域03编程环境搭建与工具选择JDK的安装与配置开发工具的选择Maven的使用编写HelloWorld 程序带领学员编写并运行第一个Java 程序,了解Java 程序的基本结构。
程序解析详细讲解HelloWorld 程序的每一行代码,让学员了解Java 程序的执行流程。
常见问题与解决方法针对初学者在编写和运行Java 程序时可能遇到的问题,提供解决方案。
第一个Java 程序示例030201介绍Java 中的基本数据类型(如int 、float 、char 等)和引用数据类型(如类、接口等)。
Java 中的数据类型变量的声明与赋值运算符的使用类型转换讲解如何在Java 中声明变量、为变量赋值以及变量的作用域。
介绍Java 中的算术运算符、关系运算符、逻辑运算符等,以及运算符的优先级和结合性。
详细讲解Java 中的自动类型转换和强制类型转换,以及转换过程中可能遇到的问题。
数据类型、变量和运算符根据特定条件执行不同代码块。
if 条件语句根据表达式的值选择执行多个代码块中的一个。
switch 语句简洁的if-else 结构,用于条件判断并返回结果。
三目运算符分支结构循环结构for循环while循环do-while循环一维数组存储表格形式数据,可通过多个下标访问元素。
多维数组数组排序数组查找01020403在数组中查找指定元素,并返回其下标或位置信息。
存储相同类型数据的线性结构,可通过下标访问元素。
使用排序算法对数组元素进行排序,如冒泡排序、选择排序等。
数组及其应用方法定义指定方法名、参数列表和返回类型,编写方法体实现特定功能。
方法调用通过方法名和参数列表调用已定义的方法,执行其功能并获取返回值。
Java版本:JDK8的⼗⼤新特性介绍JDK8常⽤包及概述java.applet 提供了需要创建⼀个⼩程序和⽤来跟其他⼩程序交流上下⽂的类。
Java.awt 包含⽤于创建⽤户界⾯和绘制图形图像的所有类Java.io 提供与输⼊输出相关的类Java.beans 包含与开发javaBeans相关的类ng 提供java语⾔程序设计的基础类 提供实现⽹络操作相关的类Java.nio 为输⼊输出提供缓冲区的类Java.text 提供处理⽂本、⽇期、数字和消息的类和接⼝Java.util 提供处理⽇期、时间、随机数⽣成等各种使⽤⼯具的类 提供⽤于⽹络应⽤程序的类、⽹络应⽤扩展类Java.swing 提供⼀组与AWT功能相同的纯java的组件类java.sql 该包提供了使⽤Java语⾔访问并处理存储在数据源(通常是⼀个关系型数据库)中的数据API。
java.RMI 该包提供远程⽅法调⽤相关APIJDK8新特性:mbda表达式2.新的⽇期API3.引⼊Optional4.使⽤Base645.接⼝的默认⽅法和静态⽅法6.新增⽅法引⽤格式7.新增Stream类8.注解相关的改变9.⽀持并⾏(parallel)数组10.对并发类(Concurrency)的扩展。
⼀、Lambda表达式Lambda 表达式也可称为闭包,是推动Java 8 发布的最重要新特性。
lambda表达式本质上是⼀个匿名⽅法。
Lambda允许把函数作为⼀个⽅法的参数(函数作为参数传递进⽅法中)或者把代码看成数据。
使⽤Lambda 表达式可以使代码变的更加简洁紧凑。
在最简单的形式中,⼀个lambda可以由:⽤逗号分隔的参数列表、–>符号、函数体三部分表⽰,在某些情况下lambda的函数体会更加复杂,这时可以把函数体放到在⼀对花括号中,就像在Java中定义普通函数⼀样。
Lambda可以引⽤类的成员变量与局部变量(如果这些变量不是final的话,它们会被隐含的转为final,这样效率更⾼)。
JDK8新特性去重对象中重复的字段问题当下互联⽹技术成熟,越来越多的趋向去中⼼化、分布式、流计算,使得很多以前在数据库侧做的事情放到了Java端。
今天有⼈问道,如果数据库字段没有索引,那么应该如何根据该字段去重?⼤家都⼀致认为⽤Java来做,但怎么做呢?解答忽然想起以前写过list去重的⽂章,找出来⼀看。
做法就是将list中对象的hashcode和equals⽅法重写,然后丢到HashSet⾥,然后取出来。
这是最初刚学Java的时候像被字典⼀样背写出来的答案。
就⽐如⾯试,⾯过号称做了3年Java的⼈,问Set和HashMap的区别可以背出来,问如何实现就不知道了。
也就是说,初学者只背特性。
但真正在项⽬中使⽤的时候你需要确保⼀下是不是真的这样。
因为背书没⽤,只能相信结果。
你需要知道HashSet如何帮我做到去重了。
换个思路,不⽤HashSet可以去重吗?最简单,最直接的办法不就是每次都拿着和历史数据⽐较,都不相同则插⼊队尾。
⽽HashSet只是加速了这个过程⽽已。
⾸先,给出我们要排序的对象User@Data@Builder@AllArgsConstructorpublic class User {private Integer id;private String name;}List<User> users = Lists.newArrayList(new User(1, "a"),new User(1, "b"),new User(2, "b"),new User(1, "a"));⽬标是取出id不重复的user,为了防⽌扯⽪,给个规则,只要任意取出id唯⼀的数据即可,不⽤拘泥id相同时算哪个。
⽤最直观的办法这个办法就是⽤⼀个空list存放遍历后的数据。
@Testpublic void dis1() {List<User> result = new LinkedList<>();for (User user : users) {boolean b = result.stream().anyMatch(u -> u.getId().equals(user.getId()));if (!b) {result.add(user);}}System.out.println(result);}⽤HashSet背过特性的都知道HashSet可以去重,那么是如何去重的呢?再深⼊⼀点的背过根据hashcode和equals⽅法。
JDK8到JDK17各个版本的重要特性整理JDK8新特性(2014年初)(LTS版本)1、Lambda表达式2、函数式编程3、接⼝可以添加默认⽅法和静态⽅法,也就是定义不需要实现类实现的⽅法4、⽅法引⽤5、重复注解,同⼀个注解可以使⽤多次6、引⼊Optional来避免空指针7、引⼊Streams相关的API8、引⼊新的Date/Time相关的API9、新增jdeps命令⾏,来分析类、⽬录、jar包的类依赖层级关系10、JVM使⽤MetaSpace代替了永久代(PermGen Space)重要特性:Lambda表达式、函数式接⼝、⽅法引⽤、Stream流式API、采⽤MetaSpace代替了永久代(PermGen Space)JDK9新特性(2017年9⽉)1、接⼝⽅法可以使⽤private来修饰2、设置G1为JVM默认垃圾收集器3、⽀持http2.0和websocket的API重要特性:主要是API的优化,如⽀持HTTP2的Client API、JVM采⽤G1为默认垃圾收集器JDK10新特性(2018年3⽉)1、局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型2、并⾏Full GC,来优化G1的延迟3、允许在不执⾏全局VM安全点的情况下执⾏线程回调,可以停⽌单个线程,⽽不需要停⽌所有线程或不停⽌线程重要特性:通过var关键字实现局部变量类型推断,使Java语⾔变成弱类型语⾔、JVM的G1垃圾回收由单线程改成多线程并⾏处理,降低G1的停顿时间JDK11新特性(2018年9⽉)(LTS版本)1、ZGC,ZGC可以看做是G1之上更细粒度的内存管理策略。
由于内存的不断分配回收会产⽣⼤量的内存碎⽚空间,因此需要整理策略防⽌内存空间碎⽚化,在整理期间需要将对于内存引⽤的线程逻辑暂停,这个过程被称为"Stop the world"。
只有当整理完成后,线程逻辑才可以继续运⾏。
JDK1.8新特性(四):函数式接口只是简单的讲到Lambda表达式的语法、使用,使得你对它产生了好感,而Lambda表达式是如何实现、定义,你可能不太清楚。
本篇将会详细介绍函数式接口,让你在使用JDK新特性时,做到心中有数,自信满满。
一、函数式接口函数式接口(functional Interface),有且仅有一个抽象方法的接口,但可以有多个非抽象的方法。
适用于Lambda表达式使用的接口。
如创建线程:new Thread(() -> System.out.println(Thread.currentThread().getName())).start();其中,Lambda表达式代替了new Runnable(),这里的Runable 接口就属于函数式接口,最直观的体现是使用了@FunctionalInterface注解,而且使用了一个抽象方法(有且仅有一个),如下:package ng;/*** The <code>Runnable</code> interface should be implemented by any* class whose instances are intended to be executed by a thread. The* class must define a method of no arguments called <code>run</code>.* <p>* This interface is designed to provide a common protocol for objects that* wish to execute code while they are active. For example,* <code>Runnable</code> is implemented by class <code>Thread</code>.* Being active simply means that a thread has been started and has not* yet been stopped.* <p>* In addition, <code>Runnable</code> provides the means for a class to be* active while not subclassing <code>Thread</code>. A class that implements* <code>Runnable</code> can run without subclassing <code>Thread</code>* by instantiating a <code>Thread</code> instance and passing itself in* as the target. In most cases, the <code>Runnable</code> interface should* be used if you are only planning to override the <code>run()</code>* method and no other <code>Thread</code> methods.* This is important because classes should not be subclassed * unless the programmer intends on modifying or enhancing the fundamental* behavior of the class.** @author Arthur van Hoff* @see ng.Thread* @see java.util.concurrent.Callable* @since JDK1.0*/@FunctionalInterfacepublic interface Runnable {/*** When an object implementing interface <code>Runnable</code> is used* to create a thread, starting the thread causes the object's* <code>run</code> method to be called in that separately executing* thread.* <p>* The general contract of the method <code>run</code> is that it may* take any action whatsoever.** @see ng.Thread#run()*/public abstract void run();}1. 格式修饰符 interface 接口名 {public abstract 返回值类型方法名(可选参数列表);}注:public abstract可以省略(因为默认修饰为public abstract)如:public interface MyFunctionalInterface {public abstract void method();}2. 注解@FunctionalInterface@FunctionalInterface,是JDK1.8中新引入的一个注解,专门指代函数式接口,用于一个接口的定义上。
利⽤jdk8的新特性将⼀个对象集合转化为其他对象集合的⽅式1 以下代码主要利⽤jdk8中的lambda表达式, 和集合的stream()流2 建⽴Person类和Student类,student继承Personpackage demo;public class Person {private String name;private Long pId;public Person() {}public Person(String name, Long pId) { = name;this.pId = pId;}public String getName() {return name;}public void setName(String name) { = name;}public Long getpId() {return pId;}public void setpId(Long pId) {this.pId = pId;}}package demo;public class Student extends Person {private String schoolName;private Long sId;public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;}public Long getsId() {return sId;}public void setsId(Long sId) {this.sId = sId;}@Overridepublic String toString() {return this.getName()+"-"+this.getpId()+"-"+this.getSchoolName()+"-"+this.getsId();}}3 建⽴主函数,测试package demo;import org.springframework.beans.BeanUtils;import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class demo {public static void main(String[] args) {List<Person> persons = Arrays.asList(new Person("张三", 1L),new Person("李四", 2L));// 将Peson集合转化为String集合List<String> strs=persons.stream().map(person -> person.getName()).collect(Collectors.toList()); System.out.println("strs = " + strs);// 将Person集合转化为Student集合List<Student> students = persons.stream().map(person -> {Student student = new Student();BeanUtils.copyProperties(person, student);if (person.getName() == "张三") {student.setSchoolName("三中");student.setsId(3L);}if (person.getName() == "李四") {student.setSchoolName("四中");student.setsId(4L);}return student;}).collect(Collectors.toList());System.out.println("students = " + students);}}。