java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解

news/2024/12/22 23:43:44/

String存储结构变更

Motivation

The current implementation of the String class stores characters in a char array, using two bytes (sixteen bits) for each character. Data gathered from many different applications indicates that strings are a major component of heap usage and, moreover, that most String objects contain only Latin-1 characters. Such characters require only one byte of storage, hence half of the space in the internal char arrays of such String objects is going unused.

Description

We propose to change the internal representation of the String class from a UTF-16 char array to a byte array plus an encoding-flag field. The new String class will store characters encoded either as ISO-8859-1/Latin-1 (one byte per character), or as UTF-16 (two bytes per character), based upon the contents of the string. The encoding flag will indicate which encoding is used

结论:String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标记,节约 了一些空间。

public final class String

implements java.io.Serializable, Comparable, CharSequence{

@Stable

private final byte[] value;

}

那StringBuffer 和 StringBuilder 是否仍无动于衷呢?

String-related classes such as AbstractStringBuilder,

StringBuilder, and StringBuffer will be updated to use the same representation,

as will the HotSpot VM‘s intrinsic(固有的、内置的) string operations.

集合工厂方法:快速创建只读集合

要创建一个只读、不可改变的集合,必须构造和分配它,然后添加元素,最后 包装成一个不可修改的集合。

List<String> namesList = new ArrayList <>();
namesList.add("Joe");
namesList.add("Bob");
namesList.add("Bill");
namesList = Collections.unmodifiableList(namesList);
System.out.println(namesList);

缺点:我们一下写了五行。即:它不能表达为单个表达式。

List<String> list = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));
Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", 
"b", "c")));
// 如下操作不适用于jdk 8 及之前版本,适用于jdk 9
Map<String, Integer> map = Collections.unmodifiableMap(new HashMap<>() {
{
put("a", 1);
put("b", 2);
put("c", 3);
}
});
map.forEach((k, v) -> System.out.println(k + ":" + v));

Java 9因此引入了方便的方法,这使得类似的事情更容易表达。

在这里插入图片描述

调用集合中静态方法of(),可以将不同数量的参数传输到此工厂方法中。

此功能可用于Set和List,也可用于Map的类似形式。此时得到的集合,是不可变的:

在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。

由于Java 8中接口方法的实现,可以直接在List,Set和Map的接口内定义这些方法, 便于调用。

List<String> list = List.of("a", "b", "c");
Set<String> set = Set.of("a", "b", "c");
Map<String, Integer> map1 = Map.of("Tom", 12, "Jerry", 21, "Lilei", 33, 
"HanMeimei", 18);
Map<String, Integer> map2 = Map.ofEntries(Map.entry("Tom", 89), 
Map.entry("Jim", 78), Map.entry("Tim", 98));

InputStream 加强

InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接

传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下 示例。

ClassLoader cl = this.getClass().getClassLoader();
try (InputStream is = cl.getResourceAsStream("hello.txt");
OutputStream os = new FileOutputStream("src\\hello1.txt")) {
is.transferTo(os); // 把输入流中的所有数据直接自动地复制到输出流中
} catch (IOException e) {
e.printStackTrace();
}

增强的 Stream API

Java 的 Steam API 是java标准库最好的改进之一,让开发者能够快速运算, 从而能够有效的利用数据并行计算。Java 8 提供的 Steam 能够利用多核架构 实现声明式的数据处理。

在 Java 9 中,Stream API 变得更好,Stream 接口中添加了

4个新的方法:takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以 让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。

现在可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个 (可能是空的) Stream 对象。

takeWhile()的使用

用于从 Stream 中获取一部分数据,接收一个 Predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素。

List<Integer> list = Arrays.asList(45, 43, 76, 87, 42, 77, 90, 73, 67, 88);
list.stream().takeWhile(x -> x < 50).forEach(System.out::println);
System.out.println();
list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
list.stream().takeWhile(x -> x < 5).forEach(System.out::println);

dropWhile()的使用

dropWhile 的行为与 takeWhile 相反,返回剩余的元素。

dropWhile 的行为与 takeWhile 相反,返回剩余的元素。
List<Integer> list = Arrays.asList(45, 43, 76, 87, 42, 77, 90, 73, 67, 88);
list.stream().dropWhile(x -> x < 50).forEach(System.out::println);
System.out.println();
list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
list.stream().dropWhile(x -> x < 5).forEach(System.out::println);

ofNullable()的使用

Java 8 中 Stream 不能完全为null,否则会报空指针异常。而 Java 9 中的 ofNullable 方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空 Stream。

// 报NullPointerException
// Stream<Object> stream1 = Stream.of(null);
// System.out.println(stream1.count());
// 不报异常,允许通过
Stream<String> stringStream = Stream.of("AA", "BB", null);
System.out.println(stringStream.count());// 3
// 不报异常,允许通过
List<String> list = new ArrayList<>();
list.add("AA");
list.add(null);
System.out.println(list.stream().count());// 2
// ofNullable():允许值为null
Stream<Object> stream1 = Stream.ofNullable(null);
System.out.println(stream1.count());// 0
Stream<String> stream = Stream.ofNullable("hello world");
System.out.println(stream.count());// 1

iterate()重载的使用

这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什 么时候结束迭代。

// 原来的控制终止方式:
Stream.iterate(1, i -> i + 1).limit(10).forEach(System.out::println);
// 现在的终止方式:
Stream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

Optional类中stream()的使用

List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Jerry");
list.add("Tim");
Optional<List<String>> optional = Optional.ofNullable(list);
Stream<List<String>> stream = optional.stream();
stream.flatMap(x -> x.stream()).forEach(System.out::println);

Javascript引擎升级:Nashorn (java11废弃)

  1. Nashorn 项目在 JDK 9 中得到改进,它为 Java 提供轻量级的 Javascript 运行时。

  2. Nashorn 项目跟随 Netscape 的 Rhino 项目,目的是为了在 Java 中实现一个高 性能但轻量级的 Javascript 运行时。

  3. Nashorn 项目使得 Java 应用能够嵌入 Javascript。它在 JDK 8 中为 Java 提供一个 Javascript 引擎。

  4. JDK 9 包含一个用来解析 Nashorn 的 ECMAScript 语法树的 API。这个 API 使得 IDE 和服务端框架不需要依赖 Nashorn 项目的内部实现类,就能够分析 ECMAScript 代码。

在这里插入图片描述


http://www.ppmy.cn/news/581447.html

相关文章

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录 前言&#xff1a; 委托构造函数&#xff1a; 类内初始化&#xff1a; 空指针&#xff1a; 枚举类&#xff1a; 总结&#xff1a; 前言&#xff1a; C的学习难度大&#xff0c;内容繁多。因此我们要及时掌握C的各种特性&#xff0c;因此我们更新本篇文章&#xff0c;向…

现在企业都在强调的客户体验,如何从官网帮助文档入手?

在当前激烈的市场竞争中&#xff0c;企业已经逐渐意识到客户体验的重要性。客户体验是指通过产品和服务所提供的一系列互动和接触&#xff0c;客户对企业的全面感受和评价。而在客户体验中&#xff0c;官网帮助文档作为企业与客户之间互动的重要环节&#xff0c;也扮演着重要的…

【iOS开发解决Tableview(CollectionView)上子视图和父试图手势冲突】

我们由于业务需要&#xff0c;经常要在Tableview或者CollectionView的cell上添加一些带有手势的子视图&#xff0c;然后添加后会发现子视图的手势会和Tableview&#xff08;CollectionView&#xff09;的滚动事件发生手势冲突导致各种bug。 那么怎么解决这种冲突呢&#x…

最齐全的宋体字体素材,速来收藏

家人们&#xff0c;最近我找到了一个很好用的宋体字体免费素材网站 资源贼多&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;白嫖一时爽&#xff0c;一直白嫖一直爽&#xff0c;嘿嘿嘿&#xff01;&#xff01;&#xff01;感兴趣的可以进去看看 免费资源最多的…

配电柜(箱)使用防雷浪涌保护器的作用和方案

配电箱是电力系统中的重要组成部分&#xff0c;负责将电力从供电系统输送到各个电器设备。然而&#xff0c;由于天气状况和其他因素的影响&#xff0c;电力系统可能会受到雷击引起的浪涌电压的威胁。为了保护配电箱和其中的设备免受浪涌电压的破坏&#xff0c;我们需要在配电箱…

演示佛系体 - 一款与世无争、别致的免费商用书法字体

字如其名&#xff0c;一看就非常佛系的字体&#xff0c;适用范围非常广的优秀艺术字体。 字体介绍 演示佛系体是一款独具风格的字体&#xff0c;字型源自于酷爱书法的80岁老人家纪国才先生的书写手稿&#xff0c;风格厚重委婉&#xff0c;字如其名&#xff0c;是一款独具风格…

洒脱书法!值得学习的帅气高级手写字体设计

字体在VI / CI的制定和品牌推广中发挥着极其重要的作用。 向客户提案时&#xff0c;应该通过反复试验来展开创意&#xff0c;以达到目标式。 为了不失去文字的认同感&#xff0c;选择手写的书法手法很容易产生共鸣&#xff0c;可以给人一种亲切的印象。 一起来欣赏设计师交流…

文泉驿正黑 font JAVA,字体 | 免费可商用字体~文泉驿正黑体

原标题&#xff1a;字体 | 免费可商用字体~文泉驿正黑体 文泉驿是一个开源汉字字体项目 由旅美学者房骞骞(FangQ) 于2004年10月创建 集中力量解决GNU/Linux 高质量中文字体匮乏的状况 目前&#xff0c;文泉驿已经开发并发布了 第一个完整覆盖GB18030汉字 (包含27000多个汉字) 的…