首页 > 编程知识 正文

java新特性,JAVA新特性不需要JDK

时间:2024-04-27 11:08:46 阅读:334824 作者:ZBOW

本文目录一览:

Java8新特性有哪些?

【注意】本文节选自是 DZone 指南#8194;Java 生态系统的专题文章,作者Trisha Gee是Java资深工程师和布道者。在本文中,Trisha Gee阐述了Java 8的重要特性以及使用的原因,由OneAPM工程师翻译。

一、要点速递

1、在很多情况下,Java8 都能提升应用性能,而无需任何改变或性能调优。

2、 Lambda 表达式、 Streams API 以及现有类的新方法都是提高生产力的重要工具。

3、Java8 新推出的 Optional 类型在处理 null 值时,能减少 NullPointerExceptions 的可能性,给开发者极大的灵活度。

二、其他特性:

速度更快

可以取悦老板、满足业务或运营人员的一大卖点是:Java8 运行应用时速度更快。通常,升级至 Java8 的应用都能得到速度上的提升,即便没有做任何改变或调优。对于为了迎合特定 JVM 而做出调整的应用,这或许并不适用。但 Java8 性能更优的理由还有很多:

80%以上的高端企业级应用都使用JAVA平台(电信、银行等)。JAVA是成熟的产品,已经有10年的历史。如果你想在Java行业有所建树,想要系统的进行java的学习,那么你可以来这个群,前面是二三一,中间是三一四,后面是零二八。连起来就可以了。 这里有很多互联网大牛教你学习,还有免费的课程。不是想学习的就不要加了。

常见数据结构的性能提升:对广受欢迎的 HashMap 进行的基准测试表明,它们在 Java8 中的性能更好。这种提升非常吸引人——你无需学习新的 Streams API 或 Lambda 语法,甚至不需要改变现有的代码,就能提升应用的性能。

垃圾回收器提升:通常,Java 应用性能取决于垃圾回收的效率。的确,糟糕的垃圾回收会很大程度上影响应用性能。Java8 对垃圾回收做了很多改变,能有效提升性能并简化调优。最为人熟知的改变是 PermGen 的移除与 Metaspace 的引入。

Fork/Join 速度提升:fork/join 框架是在 Java7 中首次引入的,目的是简化使用 JVM 的并发程序。Java8 中投入了很多努力进一步提升该框架。现在,fork/join 在 Streams API 中用于并发操作。

此外,Java8 中还包含诸多改进以支持并发。Oracle 在 JDK 8 中总结了这些性能提升。

代码行更少

Java 经常被人们诟病其样本代码太多。为此,Java8 新的 API 采用了更具功能性的方式,专注于实现什么而不是如何实现。

Lambda 表达式

Java8 中的 Lambda 表达式不仅是 Java 已有的匿名内部类—— Java8 推出之前传递行为的方法之外的语法糖衣。Lambda 表达式采用了 Java 7 的内部改变,因此运用起来相当流畅。想了解如何使用 Lambda 表达式简化代码,请继续阅读。

集合新方法介绍

Lambda 表达式与 Streams 可能是 Java8 最大的两个卖点,较少为人知的是 Java 现在允许开发者给现有类添加新的方法,而无需为了向后兼容性折中。这样,新的方法,结合 Lambda 表达式,能在很大程序上简化代码。比如,我们常常需要判断 Map 中的某个成员是否已经存在,如果不存在则创建之。在 Java8 之前,你可能会这么做:

private final MapCustomerId, Customer customers = new HashMap();  

 

public void incrementCustomerOrders(CustomerId customerId) {  

Customer customer = customers.get(customerId);  

if (customer == null) {  

    customer = new Customer(customerId);  

    customers.put(customerId, customer);  

}  

customer.incrementOrders();  

}

操作“检查某个成员在 map 中是否存在,若不存在则添加之”是如此常用,Java 现在为 Map 添加了一个新方法 computeIfAbsent 来支持这个操作。该方法的第二个参数是一个 Lambda 表达式,该表达式定义了如何创建缺少的成员。

public void incrementCustomerOrders(CustomerId customerId) {  

Customer customer = customers.computeIfAbsent(customerId,  

       id - new Customer(id));  

customer.incrementOrders();  

}

其实,Java8 还有一个新的特性,称为方法引用(method references),它能使我们用更简洁的代码实现该功能:

public void incrementCustomerOrders(CustomerId customerId) {  

Customer customer = customers.computeIfAbsent(customerId, Customer::new);  

customer.incrementOrders();  

}

Java8 为 Map 与 List 都添加了新方法。你可以了解一下这些新方法,看它们能节省多少行代码。

Streams API

Streams API 为查询、操纵数据提供了更多灵活度。这是一个很强大的功能。阅读这些文章能对 Streams API 有更全面的了解。在大数据时代建立流畅的数据查询会非常有趣,而且也是常用的操作。比如,你有一列书,你希望按照字母表顺序排列这些书的作者名,且不含重复。

public ListAuthor getAllAuthorsAlphabetically(ListBook books) {  

ListAuthor authors = new ArrayList();  

for (Book book : books) {  

    Author author = book.getAuthor();  

    if (!authors.contains(author)) {  

        authors.add(author);  

    }  

}  

Collections.sort(authors, new ComparatorAuthor() {  

    public int compare(Author o1, Author o2) {  

        return o1.getSurname().compareTo(o2.getSurname());  

    }  

});  

return authors;  

}

在上面的代码中,我们首先遍历这列书,如果书的作者从未在作者列表出现,则添加之。之后,我们根据作者的姓氏按字母表顺序对这些作者排序。这种排序操作正是 Streams 擅长解决的领域:

public ListAuthor getAllAuthorsAlphabetically(ListBook books) {  

return books.Streams()  

            .map(book - book.getAuthor())  

            .distinct()  

            .sorted((o1, o2) - o1.getSurname().compareTo(o2.getSurname()))  

            .collect(Collectors.toList());  

}

上面的做法不仅代码行更少,而且描述性更强——后来的开发者读到这段代码能够轻易理解:1、代码从书中获取作者姓名。2、只在意从未出现过的作者。3、返回的列表按照作者姓氏排序。将 Streams API 与其他新特性——方法引用(method references)、比较器(Comparator)的新方法结合使用,可以得到更加简洁的版本:

public ListAuthor getAllAuthorsAlphabetically(ListBook books) {  

return books.Streams()  

            .map(Book::getAuthor)  

            .distinct()  

            .sorted(Comparator.comparing(Author::getSurname))  

            .collect(Collectors.toList());  

}

这里,排序方法按照作者姓氏排序,更加显而易见了。

便于并行

此前我们浅聊过更利于开箱即用的性能,除了前面提到过的特性,Java8 能更好地利用 CPU 内核。将前例中的 Streams 方法替换为 parallelStreams,JVM 会将此运算分解为不同的任务,使用 fork/join 将这些任务运行在多个核上。然而,并行化并不是加速所有运算的魔法。并行化运算总是会带来更多工作——分解运算,整合结果,因此无法总是减少时间。但是,对适合并行化的例子,这么做还是颇有效率的。

最大化减少 Null 指针

Java8 的另一个新特性是全新的 Optional 类型。该类型的含义是“我可能有值,也可能是 null。“这样一来,API 就可以区分可能为 null 的返回值与绝对不会是 null 的返回值,从而最小化 NullPointerException 异常的发生几率。

Optional 最赞的用处是处理 null。例如,假设我们要从一个列表中找一本特定的书,新创建的 findFirst() 方法会返回 Optional 类型的值,表明它无法确保是否找到特定的值。有了这个可选择的值,我们接下来可以决定,如果是 null 值要如何处理。如果想要抛出一个自定义的异常,我们可以使用 orElseThrow:

public Book findBookByTitle(ListBook books, String title) {  

OptionalBook foundBook = books.Streams()  

       .filter(book - book.getTitle().equals(title))  

       .findFirst();  

return foundBook.orElseThrow(() - new BookNotFoundException("Did not find book with title " + title));  

}

或者,你可以返回其他书:

return foundBook.orElseGet(() - getRecommendedAlternativeBook(title));

或者,返回 Optional 类型,这样,该方法的调用者可以自己决定书没找到时要怎么做。

总结:Java8 作为 Java 语言的一次重大发布,包含语法上的更改、新的方法与数据类型,以及一些能默默提升应用性能的隐性改善。Oracle 已经不再支持 Java 7,因此许多公司都被迫向 Java8 转移。好消息是,Java8 对业务、现有的应用以及期望提高生产力的开发者都好好多。

java se8的新特性有哪些

java se8新特性如下:

Java Programming Language

1、lambda expressions,一个新的语言特性,它可以将功能作为方法的参数or代码作为数据,它使你表达单一方法接口的实例更加简洁。

2、对已经有方法名的方法提供一个更加可读的lambda expressions为方法的引用。

3、默认方法使新的功能添加到库的接口,确保与旧版本的接口编写的代码的二进制兼容

4、重复注解提供不止一次应用同样的注解类型

5、类型注解提供应用注解的能力,任何一个类型的使用,不仅在声明上使用。用于一个可插拔式的系统,此功能提高你代码的类型检查。

6、提高类型的推断

7、方法参数的反射

Collections

1、新的java.util.stream包,提供了stream api支持流元素上的功能性操作。stream api集成到collections api中,使用批量操作,如串行or并行 map-reduce 转换。

2、使用key collisions改进HashMap的性能

compact profiles

包含java SE平台预定义的子集和使不需要整个平台被部署和运行在小型设备中的应用

security

1、客户端默认启用TLS1.2

2、新的AccessController.doPrivileged,用代码断言它的privileges的子集,没有防止全栈遍历时检查其他权限

3、更强的基于密码的加密算法

4、SSL/TLS SNI扩展在JSSE服务器中支持

5、支持AEAD算法:SunJCE提供增强的支持AES / GCM / nopadding密码的实现以及GCM算法参数,SunJSSE提供基于密码套件的AEAD模式增强

6、keystore增强,包含新的keystore类型java.security.DomainLoadStoreParameter,和新的命令行选项-importpassword

7、SHA-224 Message Digests

8、NSA Suite B加密支持

9、更好的支持High Entropy 随机数生成

10、新的java.security.cert.PKIXRevocationChecker类为配置撤销X.509证书

11、win下64-bit PKCS11

12、新的rcache 类型在Kerberos 5 Replay Caching

13、支持Kerberos 5协议转换和约束代理

14、默认禁用Kerberos 5弱的加密

15、未绑定SASL为GSS-API/Kerberos 5机制

16、多主机名下SASL服务

17、在Mac OS X上JNI桥接到native JGSS

18、在sunjsse提供更强的实力,EDH键的支持

19、在JSSE支持服务器端密码套件个性设置

JavaFX

1、新Modena theme实现

2、新SwingNode类容许开发者嵌套Swing内容到javaFX应用中

3、新UI Controls 包含DatePicker 和TreeTableView

4、javafx.print包为JavaFX提供公共printing API

5、三维图形特性,目前包含3D shapes、camera、lights、subscene、material、picking和antialiasing

6、WebView类提供的新功能和改进,支持更多关于HTML5的特性,Web Scokets,Web Workers和Web Fonts

7、增强文本的支持

8、支持Hi-DPI 显示

9、css样式类变成公共API

10、新的ScheduledService类允许自动重启服务

11、ARM平台可用JavaFX

tools

1、jjs命令调用Nashorn引擎

2、java命令允许JavaFX应用

3、java man page已经更新

4、jdeps命令行工具提供分析类文件

5、Java Management Extensions (JMX) 提供远程诊断命令

6、jarsiger工具可选,从TSA请求签名时间抽

7、javac tool

7.1、-parameters选项存储正式的参数名和反射API检索正式参数的名称

7.2、JLS 15.21相等操作的类型规则通过javac命令正确的执行

7.3、javac工具现在支持检查javadoc注释的内容,该特性通过-Xdoclint选项

7.4、javac工具现在提供生成native header的能力。移除javah工具,通过javac的-h选项使用

8、javadoc tool

8.1、javadoc工具支持新DocTree API

8.2、javadoc工具支持新的javadoc 访问API,允许在java 应用直接调用javadoc 工具,没有执行新的进程

8.3、javadoc工具现在支持检查javadoc注释的内容,该特性通过-Xdoclint选项

Internationalization

1、unicode增强,支持unicode6.2.0

2、采用unicode CLDR数据和java.locale.providers 系统属性

3、新的Calendar和Locale APIs

4、安装一个自定义的资源包作为一个扩展的能力

Deployment

1、对sandbox applet和 java web start app,URLPermission现在是用来允许连接到服务器从它们启动完成后。SocketPermission不再授权

2、在所有安全级别,在主要jar文件的jar文件的manifest中必须给定权限属性

Date-Time Package

一个新的软件包,提供更加全面的日期-时间模型

Scripting

Nashorn js 引擎

Pack200

1、Pack200支持常量池条目和由JSR 292引入了新的字节码

2、JDK8支持由JSR-292, JSR-308 and JSR-335指定类文件的变化

IO and NIO

1、基于Solaris在Solaris事件端口机制实现新的SelectorProvider。使用系统属性java.nio.channels.spi.Selector设置的值sun.nio.ch.EventPortSelectorProvder运行

2、减少JDK_HOME/jre/lib/charsets.jar文件中数量

3、提高java.lang.String(byte[], *)构造器和java.lang.String.getBytes()方法的性能

java.lang and java.util.Pack ages

1、并发的数组排序

2、标准的编码和解码Base64

3、无符号运算的支持

JDBC

1、移除JDBC-ODBC桥

2、JDBC4.2引入新的功能

Java DB

1、JDK8 包含 Java DB 10.10

Networking

1、添加java.net.URLPermission类

2、在java.net.HttpURLConnection中,如果安装安全管理,请求要求打开一个连接请求的权限

Concurrency

1、在java.util.concurrent包中新增类和接口

2、java.util.concurrent.ConcurrentHashMap类添加方法支持聚合操作,基于新的流设施和lambda expressions

3、java.util.concurrent.atomic包中添加类支持可扩展可更新的变量

4、 java.util.concurrent.ForkJoinPool类中添加方法支持通用池

5、 java.util.concurrent.locks.StampedLock类已经添加使用3种模式控制读/写访问的基于能力的锁

Java XML – JAXP

HotSpot

1、硬件特性增加了AES,UseAES和UseAESIntrinsics标签在打开基于硬件AES可用(Inter 硬件),硬件必须是2010或更新Westmere硬件,如:打开硬件AES,使用下面标记

-XX:+UseAES -XX:+UseAESIntrinsics

关闭硬件AES:

-XX:-UseAES -XX:-UseAESIntrinsics

2、移除PermGen

3、通过为方法调用引入字节码指令支持默认方法

云南北大青鸟java培训告诉你java10编程语言都有哪些新特点?

前一段时间我们曾经给大家简单介绍了关于java10的特性以及发布日期等事情。今天,我们一起来正式了解一下java10编程开发语言的新特性都有哪些,以及针对这些特性的使用方法。

Java10新特性

这次发布的Java10,新带来的特性并不多。

根据官网公开资料,共有12个JEP(JDKEnhancementProposal特性加强提议),带来以下加强功能:

JEP286,var局部变量类型推断。

JEP296,将原来用Mercurial管理的众多JDK仓库代码,合并到一个仓库中,简化开发和管理过程。

JEP304,统一的垃圾回收接口。

JEP307,G1垃圾回收器的并行完整垃圾回收,实现并行性来改善坏情况下的延迟。

JEP310,应用程序类数据(AppCDS)共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。

JEP312,ThreadLocal握手交互。在不进入到全局JVM安全点(Safepoint)的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。

JEP313,移除JDK中附带的javah工具。可以使用javac-h代替。

JEP314,使用附加的Unicode语言标记扩展。

JEP317,能将堆内存占用分配给用户指定的备用内存设备。

JEP317,使用Graal基于Java的编译器,可以预先把Java代码编译成本地代码来提升效能。

JEP318,在OpenJDK中提供一组默认的根证书颁发机构证书。开源目前Oracle提供的的JavaSE的根证书,这样OpenJDK对开发人员使用起来更方便。

JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为$FEATURE.$INTERIM.$UPDATE.$PATCH,分别是大版本,中间版本,升级包和补丁版本。

部分特性说明

1.var类型推断。

这个语言功能在其他一些语言(C#、JavaScript)和基于JRE的一些语言(Scala和Kotlin)中,早已被加入。

在Java语言很早就在考虑,北大青鸟丽江计算机学院发现早在2016年正式提交了JEP286提议。后来举行了一次公开的开发工程师调查,获得多建议的是采用类似Scala的方案,“同时使用val和var”,约占一半;二多的是“只使用var”,约占四分之一。后来Oracle公司经过慎重考虑,采用了只使用var关键字的方案。

北大青鸟java培训:java12相对于java9来说都有哪些新特性?

随着互联网的不断发展,软件编程开发语言也有了多次的更新与升级,而今天电脑培训就通过案例分析来了解和学习一下,java12都有哪些新特性。

SwitchExpressions或者说起相关的PatternMatching特性,为我们提供了勾勒出了Java语法进化的一个趋势,将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。

则是很有现实意义度ShenandoahGC。

它是Redhat主导开发的PauselessGC实现,从大概2013年开始研发,终于取得了重要的阶段性成果,与其他PauselessGC类似,ShenandoahGC主要目标是99.9%的暂停小于10ms,暂停与堆大小无关等。

也许了解ShenandoahGC的人比较少,业界声音比较响亮的是Oracle在JDK11中开源出来的ZGC,或者商业版本的AzulC4(ContinuouslyConcurrentCompactingCollector)。

但是,笔者认为,至少目前,其实际意义大于后两者,因为:使用ZGC的低门槛是升级到JDK11,对很多团队来说,这种版本的跳跃并不是非常低成本的事情,更何况是尚不清楚ZGC在自身业务场景中的实际表现如何。

而C4,毕竟是土豪们的选择,现实情况是,有多少公司连个几十块钱的License都不舍得?而ShenandoahGC可是有稳定的JDK8u版本发布的哦,据我所知已经有个别公司在HBase等高实时性产品中实践许久。

Java8这10个特性你知道多少

下面给你列举Java8的10个特性:

1、default方法

这是Java语言的一个新特性,现在接口类里可以包含方法体(这就是default方法)了。这些方法会隐式的添加到实现这个接口的每个子类中。

2、终止进程

一旦启动外部进程的话,当这个进程崩溃,挂起,或者CPU到达100%的时候,你就得回来擦屁股了。Process类现在增加了两个新的方法,可以来教训下那些不听话的进程了。第一个是isAlive()方法,有了它你可以判断进程是否还活着。第二个方法则更加强大,它叫destroyForcibly(),你可以用它来强制的杀掉一个已经超时或者不再需要的进程。

3、StampedLock

Java 8引入了一个新的读写锁,叫做StampedLock。它不仅更快,同时还提供了一系列强大的API来实现乐观锁,这样如果没有写操作在访问临界区域的话,你只需很低的开销就能获取到一个读锁。访问结束后你可以查询锁来判断这期间是否发生了写操作,如果有的话再选择进行重试,升级锁,或者放弃这个操作。

4、并发计数器

这是多线程程序会用到的另一个小工具。它提供了简单高效的新接口来实现多线程的并发读写计数器的功能,和AtomicInteger比起来,它要更快一些。相当赞的工具。

5、Optional

Java 8借鉴了Scala和Haskell,提供了一个新的Optional模板,可以用它来封装可能为空的引用。这绝不是终结空指针的银弹,更多只是使API的设计者可以在代码层面声明一个方法可能会返回空值,调用方应该注意这种情况。正因为这个,这只对新的API有效,前提是调用方不要让引用逃逸出封装类,否则的话引用可能会在外面被不安全的废弃掉。

6、万物皆可注解

还有一个小的改进就是现在Java注解可以支持任意类型了。之前只有像类和方法声明之类的才能使用注解。在Java 8里面,当类型转化甚至分配新对象的时候,都可以在声明变量或者参数的时候使用注解。这是Java为了更好地支持静态分析及检测工具(比如FireBug)而做的工作中的一部分。这是个很不错的特性,但是和Java 7的invokeDynamic一样,它的真正价值取决于社区以后如何去使用它。

7、数值溢出

这些方法早就该出现在Java的核心类库里了。我有个癖好就是去测试整型超出2^32时溢出的情况,搞出一些恶心的随机BUG来(怎么会得到这么奇怪的一个值?)。

同样的,这也不是什么银弹,只不过是提供了一组函数,这样你在使用+/*操作符进行数值操作的时候,如果出现了溢出,会抛一个异常。如果我可以决定的话,我会把它作为JVM的默认模式,显式的标明函数会出现数值溢出。

8、目录遍历

遍历目录树这种事通常都得上Google搜下怎么实现(你很可能用的是Apache.FileUtils)。Java 8给Files类做了一次整容手术,增加了十个新的方法。我最喜欢的一个是walk()方法,它遍历目录后会创建出一个惰性的流(文件系统很大的情况下非常有用)。

9、增强的随机数生成

现在经常都在讨论密码或者密钥容易遭受攻击的事。程序的安全性是项很复杂的工程,并且很容易出错。这就是我为什么喜欢这个新的SecureRandom.getinstanceStrong()方法的原因,它能自动选择出当前JVM可用的最佳的随机数生成器。这样减少了获取失败的机率,同时也避免了默认的弱随机数生成器可能会导致密钥或者加密值容易被黑客攻破的问题。

10、Date.toInstant()

Java 8引入了一个新的日期API。这不难理解,因为现有的这个实在是太难用了。实际上Joda一直以来都是Java日期API的首选。不过尽管有了新的API,但仍有一个严重的问题——大量的旧代码和库仍然在使用老的API。并且我们还知道这种现状仍将继续存在下去。到底该怎么做呢?

Java 8很优雅的解决了这个问题,它给Date类增加了一个新的方法toInstant(),它可以将Date转化成新的实现。这样你马上就可以切换到新的API,尽管现有的代码还在使用老的日期API(并且在可预见的未来仍将继续这样)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。