JDK10新特性

目录

  • 传送门
  • 一、局部变量类型推断
    • 1、概念
      • 1.1、简单局部变量推断
      • 1.2、自定义对象的推断
    • 2、可以使用的场景
    • 3、不能使用的场景
    • 4、注意事项
  • 二、垃圾回收器的优化
    • 1、前置知识
      • 1.1、10种垃圾回收器
      • 1.2、分代与分区
      • 1.3、10种垃圾回收器小总结
    • 2、优化点
  • 三、新增API
    • 1、集合新方法copyOf
    • 2、ByteArrayOutputStream新增toString方法
    • 3、IO流很多类新增带Charset参数的构造方法
    • 4、InputStream和Reader新增transferTo方法
    • 5、Formatter和Scanner新增带Charset参数的构造方法

传送门

JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性

JDK10提供了超过109项新功能特性,并且JDK10的安装不用再额外安装一次jre了,之前JDK9以及之前都需要额外安装一次jre。

一、局部变量类型推断

1、概念

JDK10 可以使用 var 进行 局部变量类型推断。

1.1、简单局部变量推断

var str = "abc"; // 推断为 字符串类型 
var l = 10L; // 推断为long 类型 
var flag = true; // 推断为 boolean 类型 
var list = new ArrayList<String>(); // 推断为 ArrayList<String> 
var stream = list.stream(); // 推断为 Stream<String> 

1.2、自定义对象的推断

package com.zt.jdk10NewFeatures;import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;public class Jdk10NewFeatures {// 局部变量类型推断// 1、只针对局部变量// 2、var是保留类型不是关键字,意味着我们可以用var来定义变量名// 3、var不容许赋值为null,例如  var x = null; 会报错public static void main(String[] args) {var i = 10;System.out.println(i);// 10var str = "zt";System.out.println(str);// ztvar list = new ArrayList<>();list.add(10);list.forEach(System.out::println);// 10var set = new HashSet<>();set.add(10);set.forEach(System.out::println);// 10var map = new HashMap<>();map.put("JDK10",10);map.forEach((k,v) -> {System.out.println("key:" + k + ",value:" + v);// key:JDK10,value:10});var user = new User("zt",18);System.out.println(user);// User{username='zt', age=18}}// 内部类Userstatic class User {private String username;private Integer age;public User() {}public User(String username, Integer age) {this.username = username;this.age = age;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", age=" + age +'}';}}
}

2、可以使用的场景

  • 局部变量
  • 循环内
public class demo01var {// var x = 10; // 成员变量不能使用varpublic static void main(String[] args) {var a = 1;var str = "abc";var flag = true;var list = new ArrayList<String>();list.add("aa");var stream = list.stream();for (var s : list) {System.out.println(s);}for (var i = 0; i < 10; i++) {var x = 5;}}
}

3、不能使用的场景

  • 成员变量
  • 方法参数
  • 方法返回类型
public class demo01var { // var x = 10; // 成员变量不能使用var // 参数不能使用var// public static void test01(var a) {}/* 方法返回类型不能使用var public static var test02() { return true; }*/
}

4、注意事项

var 并不是一个关键字,可以作为标识符,这意味着可以将一个变量、方法、包名写成 var 。不过一般情况下
不会有人这么写的,因为这本身就违反了普遍的命名规范。

// var 并不是一个关键字,而是一个保留的类型名称,这意味着可以将一个变量、方法、包名写成 `var`。 
public static void test03() {var var = 10; System.out.println("var = " + var); 
}

var 声明变量的时候必须赋值、不能用于声明多个变量的情况。

// var 不能用来声明没有赋值的变量、不能用于声明多个变量的情况。 
public static void test04() { // var x = null; // 不行,推断不出到底是什么类型 int x = 1, y = 2; // 可以 // var m = 1, n = 2; // 不行 
}

二、垃圾回收器的优化

1、前置知识

1.1、10种垃圾回收器

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2、分代与分区

在这里插入图片描述

1.3、10种垃圾回收器小总结

  • 1、Serial是串行,现在cpu都多核了,所以一般不用;
  • 2、parNew是多线程,一般用于年轻代,和CMS(老年代)一起搭配使用;
  • 3、CMS只用于老年代收集,它的STW非常短,一般的可达性算法分析,会从gc root 根到末端,它一开始初始标记只标第一段,比如根到引用A,引用A后面其实还有更深更多的引用在第一阶段不去标记,这样会让初始标记的stw非常短,第二阶段再去标记A后面更多更深的引用,但是第二阶段就不用STW了。缺点就是第二阶段剩余标记的时候,实时性没有那么强。第三阶段重新标记,就是重新标记二阶段新产生的对象引用,这阶段也会stw(比第一阶段长一点,这次是完整的根可达性,不过也比第一+第二阶段总时长短很多了),第四阶段就是并发清理,这个不会stw。
    CMS缺点:标记过程中会和用户进程抢资源;无法处理浮动垃圾(第四阶段也会有实时性问题,无法及时清理新产生的);使用的标记清楚算法,会产生大量的内存碎片;会出现CMS一边收集一边回收,没回收完老年代空间不够了触发了新的Full gc,会导致并发模式失败的现象,此时会用其他垃圾回收器了;
  • 4、G1一般用于堆内存10多个G以上的大型公司上,一般公司用的少,年轻代和老年代内存不连续,是堆内存里面一个格子一个格子(见上面G1截图),工作原理和CMS惊人相似,前3阶段标记处理和 CMS一样,4阶段是筛选回收,前3阶段的时候要对每个格子回收时间和成本做计算和排序,4阶段回收的是部分,是成本低的那种先回收了,这个也是G1的王牌标志和牛逼之处。年轻代和老年代都是复制算法。比如E格子和S格子都满了,就会找相近的格子复制有效对象进入形成新的S格子,E格子和S格子就清空了,而且由于格子是一片连续的内存,所以还没有内存碎片问题。而且会发现有多个E格子,所以说一个E格子满了,不会马上年轻代gc,而且会计算设置好的gc时间值,如果小于这个时间,就继续第二个E格子,啥时候E格子满了,gc时间和设置好时间差不多了,就会真正的去年轻代gc。

截图可以看出早期都是配对的。单线程1GB内存以后就效率非常差了。

  • Serial 和Serial Old(单线程的,分代模型);
  • Parallel Scavenge 和 Parallel Old(多线程的,分代模型,jdk8默认的) ;
  • ParNew 和 CMS(前面多线程耗时太多,减少耗时的, ParNew出现也是为了和CMS搭配,分代模型);

上面都是基于分代,分代(年轻代、老年代)的严重缺点还是会随着堆内存增加而stw时间增加;所以后面出了分区模型

  • G1(就是上面格子的那种,一个格子就是一个片区,一块连续的内存空间。标记清除的算法。)
  • ZGC(和其他9种gc不一样,是划时代的gc)
  • Shenandoah
  • Eplison 这个不是真正的去垃圾回收的,只是为了调试用的。

java -XX:+PrintCommandLineFlags -version ---- 查看默认gc,jdk8的默认是 Parallel Scavenge 和 Parallel Old 这一对 , jdk9默认就是g1了

2、优化点

G1 是设计来作为一种低延时的垃圾回收器。G1收集器还可以进行非常精确地对停顿进行控制。从JDK7开始启用G1垃圾回收器,在JDK9中G1成为默认垃圾回收策略。截止到java 9,G1的Full GC采用的是单线程算法。也就是说G1在发生Full GC时会严重影响性能。

JDK10又对G1进行了提升,G1 引入并行 Full GC算法,在发生Full GC时可以使用多个线程进行并行回收。能为用户提供更好的体验。

三、新增API

1、集合新方法copyOf

JDK10 给 java.util 包下的List、Set、Map新增加了一个静态方法 copyOf 。copyof方法将元素放到一个不可修改的集合并返回,是按照之前集合的迭代顺序拷贝的,元素顺序和之前集合一样。

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);List<Integer> temp = List.copyOf(list);temp.forEach(System.out::println);// 1  2  3temp.add(4);// 不能修改,会报错,如下图        
}

在这里插入图片描述
不可修改这个类似JDK9新特性 集合新增的of方法。

2、ByteArrayOutputStream新增toString方法

JDK10给 java.io.ByteArrayOutputStream 新增重载 toString(Charset charset) 方法,通过指定的字符集编码字节,将缓冲区的内容转换为字符串。

通过ByteArrayOutputStream新增的toString(Charset), 可以将字节数组输出流中的数据按照指定的编码转成字符串。可以更灵活的解决乱码问题。

 String str = "蓝影铁哥";ByteArrayInputStream bis = new ByteArrayInputStream(str.getBytes("GBK"));ByteArrayOutputStream bos = new ByteArrayOutputStream();int b;while ((b = bis.read()) != -1) {bos.write(b);}//默认utf-8System.out.println(bos.toString());// ��Ӱ����System.out.println(bos.toString("GBK"));// 蓝影铁哥

在这里插入图片描述

3、IO流很多类新增带Charset参数的构造方法

在JDK10中给IO流中的很多类都添加了带Charset参数的方法,比如PrintStream、PrintWriter。通过Charset可以指定编码来操作文本。Charset是一个抽象类,我们不能直接创建对象,需要使用Charset的静态方法forName(“编码”),返回Charset的子类实例。
例如:PrintStream
在这里插入图片描述

// IO流很多类新增带Charset参数的构造方法
public static void main(String[] args) throws Exception {String str = "蓝影铁哥";var p = new PrintWriter("d:/fe.txt","utf-8");// 将字符串输出到d盘的fe.txt文件中p.println(str);p.flush();p.close();
}

在这里插入图片描述
在这里插入图片描述
这个文本内容的编码就是代码中的utf-8编码,如果代码改成gbk,这文本内容编码也会变成gbk。

4、InputStream和Reader新增transferTo方法

JDK10 给 InputStream 和 Reader 类中新增了 transferTo 方法, transferTo 方法的作用是将输入流读取的数据使用字符输出流写出。可用于复制文件等操作。
例如 Reader:
从这个Reader中读取所有字符串,并按照所读取的顺序将字符串写入给指定的Writer。

// InputStream和Reader新增了transferTo方法
public static void main(String[] args) throws Exception {var reader = new BufferedReader(new InputStreamReader(new FileInputStream("d:/fe.txt")));var p = new PrintWriter(new File("d:/feNew.txt"));reader.transferTo(p);// 从这个Reader中读取所有字符串,并按照所读取的顺序将字符串写入给指定的Writer。p.flush();p.close();reader.close();
}

在这里插入图片描述
在这里插入图片描述

5、Formatter和Scanner新增带Charset参数的构造方法

在JDK10中给java.util.Formatter、java.util.Scanner添加了带Charset参数的构造方法。
例如:Scanner
在这里插入图片描述

 // Formatter和Scanner新增了带Charset参数的构造方法public static void main(String[] args) throws Exception {var scanner = new Scanner(new FileInputStream(new File("d:/fe.txt")),"utf-8");// 之前写入的一行文字: 蓝影铁哥while (scanner.hasNext()){System.out.println(scanner.nextLine());// 蓝影铁哥}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/238023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VBA技术资料MF90:在PowerPoint中完成多重查找替换

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

openbabel 安装 生成指纹方法

今日踩坑小结&#xff1a; openbabel 安装&#xff1a; 可以装&#xff0c;但是得在 Linux 环境下&#xff0c;win 环境装会报错&#xff08;安装不会报错&#xff0c;但是生成指纹的时候会&#xff09; 指纹&#xff1a; 在下面这个链接里&#xff0c;官方给出了命令行调用 o…

优思学院:六西格玛项目中什么是顾客之声?

让客户的声音成就您的成功&#xff01; 顾客之声(Voice of customer-VOC)是六西格玛项目中的一个重要概念&#xff0c;指的是从顾客的角度和需求出发&#xff0c;通过收集和分析顾客的反馈和意见&#xff0c;以了解他们对产品或服务的期望、满意度和不满意之处。顾客之声的目的…

HarmonyOs 4 (一) 认识HarmonyOs

目录 一 HarmonyOs 背景1.1 发展时间线1.2 背景分析1.2.1 新场景1.2.2 新挑战1.2.3 鸿蒙生态迎接挑战 二 HarmonyOS简介2.1 OpenHarmony2.2 HarmonyOS Connect2.3 HarmonyOS Next**2.4 ArkTS &#xff08;重点掌握&#xff09;****2.5 ArkUI** 三 鸿蒙生态应用核心技术理念**3.…

Java数据结构之《循环队列》题目

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我写完…

整体迁移SVN仓库到新的windows服务器

一、背景 公司原有的SVN服务器年代比较久远经常出现重启情况&#xff0c;需要把SVN仓库重新迁移到新的服务器上&#xff0c;在网上也搜到过拷贝Repositories文件直接在新服务器覆盖的迁移方案&#xff0c;但考虑到原有的操作系统和现有的操作系统版本不一致&#xff0c;SVN版本…

Vue+SpringBoot解决session跨域问题

做了一个前后端分离&#xff0c;因为前后端的 session id不一致&#xff0c;导致前端请求时&#xff0c;后端的session读取不到对应的值&#xff0c;造成登录问题。 解决方法&#xff1a; SpringBoot项目: 添加一个跨域配置 代码如下: 或者controller使用CrossOrigin Conf…

观《王牌对王牌:国宝回国》有感 —— AI绘画之古画修复对比图

一、前言 上周《王牌对王牌》节目的主题是《国宝回国》&#xff0c;而今天的AI绘画的灵感&#xff0c;就来源于这期节目。 下面这组图&#xff0c;左侧部分因时间的流逝而显现出褪色和损伤的痕迹&#xff0c;色彩变得暗淡&#xff0c;细节也因年代久远而变得模糊不清。 而右…

Spring---更简单的存储和读取对象

文章目录 存储Bean对象配置扫描路径添加注解存储Bean对象使用类注解为什么需要五个类注解呢&#xff1f;Bean命名规则 使用方法注解重命名Bean 读取Bean对象属性注入Setter注入构造方法注入注入多个相同类型的BeanAutowired vs Resource 存储Bean对象 配置扫描路径 注&#xf…

【开源】基于JAVA的厦门旅游电子商务预订系统

项目编号&#xff1a; S 030 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S030&#xff0c;文末获取源码。} 项目编号&#xff1a;S030&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒…

Collection集合的遍历方式-迭代器,增强for循环,Lambda

集合体系概述 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的 public class Work1 {public static void main(String[] args) {//简单认识一下Collection集合的特点ArrayList<String> list new ArrayList&…

数据挖掘实战:基于 Python 的个人信贷违约预测

本次分享我们 Python 觅圈的一个练手实战项目&#xff1a;个人信贷违约预测&#xff0c;此项目对于想要学习信贷风控模型的同学非常有帮助。 技术交流 技术要学会交流、分享&#xff0c;不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。 好的文章离不开粉丝的分享、…