1. 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-rece 转换。
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、新的ScheledService类允许自动重启服务
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、通过为方法调用引入字节码指令支持默认方法
2. Java8新特性有哪些
【注意】本文节选自是 DZone 指南 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 之前,你可能会这么做:
privatefinalMap<CustomerId,Customer>customers=newHashMap<>();
(CustomerIdcustomerId){
Customercustomer=customers.get(customerId);
if(customer==null){
customer=newCustomer(customerId);
customers.put(customerId,customer);
}
customer.incrementOrders();
}
操作“检查某个成员在 map 中是否存在,若不存在则添加之”是如此常用,Java 现在为 Map 添加了一个新方法 computeIfAbsent 来支持这个操作。该方法的第二个参数是一个 Lambda 表达式,该表达式定义了如何创建缺少的成员。
(CustomerIdcustomerId){
Customercustomer=customers.computeIfAbsent(customerId,
id->newCustomer(id));
customer.incrementOrders();
}
其实,Java8 还有一个新的特性,称为方法引用(method references),它能使我们用更简洁的代码实现该功能:
(CustomerIdcustomerId){
Customercustomer=customers.computeIfAbsent(customerId,Customer::new);
customer.incrementOrders();
}
Java8 为 Map 与 List 都添加了新方法。你可以了解一下这些新方法,看它们能节省多少行代码。
Streams API
Streams API 为查询、操纵数据提供了更多灵活度。这是一个很强大的功能。阅读这些文章能对 Streams API 有更全面的了解。在大数据时代建立流畅的数据查询会非常有趣,而且也是常用的操作。比如,你有一列书,你希望按照字母表顺序排列这些书的作者名,且不含重复。
publicList<Author>getAllAuthorsAlphabetically(List<Book>books){
List<Author>authors=newArrayList<>();
for(Bookbook:books){
Authorauthor=book.getAuthor();
if(!authors.contains(author)){
authors.add(author);
}
}
Collections.sort(authors,newComparator<Author>(){
publicintcompare(Authoro1,Authoro2){
returno1.getSurname().compareTo(o2.getSurname());
}
});
returnauthors;
}
在上面的代码中,我们首先遍历这列书,如果书的作者从未在作者列表出现,则添加之。之后,我们根据作者的姓氏按字母表顺序对这些作者排序。这种排序操作正是 Streams 擅长解决的领域:
publicList<Author>getAllAuthorsAlphabetically(List<Book>books){
returnbooks.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)的新方法结合使用,可以得到更加简洁的版本:
publicList<Author>getAllAuthorsAlphabetically(List<Book>books){
returnbooks.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:
publicBookfindBookByTitle(List<Book>books,Stringtitle){
Optional<Book>foundBook=books.Streams()
.filter(book->book.getTitle().equals(title))
.findFirst();
returnfoundBook.orElseThrow(()->newBookNotFoundException("Didnotfindbookwithtitle"+title));
}
或者,你可以返回其他书:
returnfoundBook.orElseGet(()->getRecommendedAlternativeBook(title));
或者,返回 Optional 类型,这样,该方法的调用者可以自己决定书没找到时要怎么做。
总结:Java8 作为 Java 语言的一次重大发布,包含语法上的更改、新的方法与数据类型,以及一些能默默提升应用性能的隐性改善。Oracle 已经不再支持 Java 7,因此许多公司都被迫向 Java8 转移。好消息是,Java8 对业务、现有的应用以及期望提高生产力的开发者都好好多。
3. java nashorm怎么用
从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino。该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调用Java。此外,它还提供了使用jrunscript从命令行运行JavaScript的能力。如果不需要非常好的性能,并且可以接受ECMAScript 3有限的功能集的话,那它相当不错了。
从JDK 8开始,Nashorn取代Rhino成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的invokedynamic,将JavaScript编译成Java字节码。
与先前的Rhino实现相比,这带来了2到10倍的性能提升,虽然它仍然比Chrome和Node.js中的V8引擎要差一些。如果你对实现细节感兴趣,那么可以看看这些来自2013 JVM语言峰会的幻灯片。
相关厂商内容
滴滴出行iOS客户端架构演进之路!
微信客户端如何应对弱网络!
函数式编程中的Swift与Swift中的函数式编程!
AWS Webinar 5月24日在线课堂|利用AWS Lambda创建应用
国际范 最前沿 不容错过的容器技术盛会
相关赞助商
GMTC全球移动技术大会2016年6月24日-25日,北京,点击了解详情!
由于Nashorn随JDK 8而来,它还增加了简洁的函数式接口支持。接下来,我们很快就会看到更多细节。
让我们从一个小例子开始。首先,你可能需要安装JDK 8和NetBeans、IntelliJ IDEA或者Eclipse。对于集成JavaScript开发,它们都至少提供了基本的支持。让我们创建一个简单的Java项目,其中包含下面两个示例文件,并运行它:
(点击图片可以查看大图)
在第12行,我们使用引擎的“eval”方法对任意JavaScript代码求值。在本示例中,我们只是加载了上面的JavaScript文件并对其求值。你可能会发现那个“print”并不熟悉。它不是JavaScript的内建函数,而是Nashorn提供的,它还提供了其它方便的、在脚本环境中大有用武之地的函数。你也可以将 “hello world”的打印代码直接嵌入到传递给“eval”方法的字符串,但将JavaScript放在它自己的文件中为其开启了全新的工具世界。
Eclipse目前还没有对Nashorn提供专门的支持,不过,通过JavaScript开发工具(JSDT)项目,它已经支持JavaScript的基本工具和编辑。
(点击图片可以查看大图)
IntelliJ IDEA 13.1(社区版和旗舰版)提供了出色的JavaScript和Nashorn支持。它有一个全功能的调试器,甚至允许在Java和JavaScript之间保持重构同步,因此举例来说,如果你重命名一个被JavaScript引用的Java类,或者重命名一个用于Java源代码中的JavaScript文件,那么该IDE将跨语言修改相应的引用。
下面是一个例子,展示如何调试从Java调用的JavaScript(请注意,NetBeans也提供了JavaScript调试器,如下截图所示):
(点击图片可以查看大图)
你可能会说,工具看上去不错,而且新实现修复了性能以及一致性问题,但我为什么应该用它呢?一个原因是一般的脚本编写。有时候,能够直接插入任何类型的字符串,并任由它被解释,会很方便。有时候,没有碍事的编译器,或者不用为静态类型担心,可能也是不错的。或者,你可能对Node.js编程模型感兴趣,它也可以和Java一起使用,在本文的末尾我们会看到。另外,还有个情况不得不提一下,与Java相比,使用JavaScript进行JavaFX开发会快很多。
Shell脚本
Nashorn引擎可以使用jjs命令从命令行调用。你可以不带任何参数调用它,这会将你带入一个交互模式,或者你可以传递一个希望执行的JavaScript文件名,或者你可以用它作为shell脚本的替代,像这样:
#!/usr/bin/env jjs
var name = $ARG[0];
print(name ? "Hello, ${name}!" : "Hello, world!");
向jjs传递程序参数,需要加“—”前缀。因此举例来说,你可以这样调用:
./hello-script.js – Joe
如果没有“—”前缀,参数会被解释为文件名。
向Java传递数据或者从Java传出数据
正如上文所说的那样,你可以从Java代码直接调用JavaScript;只需获取一个引擎对象并调用它的“eval”方法。你可以将数据作为字符串显式传递……
ScriptEngineManager scriptEngineManager =
new ScriptEngineManager();
ScriptEngine nashorn =
scriptEngineManager.getEngineByName("nashorn");
String name = "Olli";
nashorn.eval("print('" + name + "')");
……或者你可以在Java中传递绑定,它们是可以从JavaScript引擎内部访问的全局变量:
int valueIn = 10;
SimpleBindings simpleBindings = new SimpleBindings();
simpleBindings.put("globalValue", valueIn);
nashorn.eval("print (globalValue)", simpleBindings);
JavaScript eval的求值结果将会从引擎的“eval”方法返回:
Integer result = (Integer) nashorn.eval("1 + 2");
assert(result == 3);
在Nashorn中使用Java类
前面已经提到,Nashorn最强大的功能之一源于在JavaScript中调用Java类。你不仅能够访问类并创建实例,你还可以继承他们,调用他们的静态方法,几乎可以做任何你能在Java中做的事。
作为一个例子,让我们看下来龙去脉。JavaScript没有任何语言特性是面向并发的,所有常见的运行时环境都是单线程的,或者至少没有任何共享状态。有趣的是,在Nashorn环境中,JavaScript确实可以并发运行,并且有共享状态,就像在Java中一样:
// 访问Java类Thread
var Thread = Java.type("java.lang.Thread");
// 带有run方法的子类
var MyThread = Java.extend(Thread, {
run: function() {
print("Run in separate thread");
}
});
var th = new MyThread();
th.start();
th.join();
请注意,从Nashorn访问类的规范做法是使用Java.type,并且可以使用Java.extend扩展一个类。
令人高兴的函数式
从各方面来说,随着JDK 8的发布,Java——至少在某种程度上——已经变成一种函数式语言。开发人员可以在集合上使用高阶函数,比如,遍历所有的元素。高阶函数是把另一个函数当作参数的函数,它可以用这个函数参数做些有意义的事情。请看下面Java中高阶函数的示例:
List<Integer> list = Arrays.asList(3, 4, 1, 2);
list.forEach(new Consumer() {
@Override
public void accept(Object o) {
System.out.println(o);
}
});
对于这个例子,我们的传统实现方式是使用一个“外部”循环遍历元素,但现在,我们没有那样做,而是将一个“Consumer”函数传递给了“forEach”操作,一个高阶的“内部循环”操作会将集合中的每个元素一个一个地传递给Consumer的“accept”方法并执行它。
如上所述,对于这样的高阶函数,函数式语言的做法是接收一个函数参数,而不是一个对象。虽然在传统上讲,传递函数引用本身超出了Java的范围,但现在,JDK 8有一些语法糖,使它可以使用Lambda表达式(又称为“闭包”)来实现那种表示方式。例如:
List<Integer> list = Arrays.asList(3, 4, 1, 2);
list.forEach(el -> System.out.println(el));
在这种情况下,“forEach”的参数是这样一个函数引用的形式。这是可行的,因为Customer是一个函数式接口(有时称为“单一抽象方法(Single Abstract Method)”类型或“SAM”)。
那么,我们为什么要在讨论Nashorn时谈论Lambda表达式呢?因为在JavaScript中,开发人员也可以这样编写代码,而在这种情况下,Nashorn可以特别好地缩小Java和JavaScript之间的差距。尤其是,它甚至允许开发人员将纯JavaScript函数作为函数式接口(SAM类型)的实现来传递。
让我们来看一些纯JavaScript代码,它们与上述Java代码实现一样的功能。注意,在JavaScript中没有内置的列表类型,只有数组;不过这些数组的大小是动态分配的,而且有与Java列表类似的方法。因此,在这个例子中,我们调用一个JavaScript数组的“for Each”方法:
var jsArray = [4,1,3,2];
jsArray.forEach(function(el) { print(el) } );
4. java8update351有什么用
甲骨文公司OracleJavaDevelopmentKit(JDK)是一款Java开发工具包,包含Java运行环境(java运行库),Java开发套件和Java基础类库源代码.JavaRuntimeEnvironment(JRE)是运行Java程序的运行环境,不管是做Java开发还是从事安卓开发,都必须在系统安装JRE运行环境.Java语言的贡献力量是其他任何技术无可比拟的.
新版变化
2022年10月18日JDK8u351Update发行说明
Java™SEDevelopmentKit8,Update351(JDK8u351)
https://pan..com/s/1ZtDZYZGlz69ikS4vsHAp3Q
[JDK]JavaSEDevelopmentKit稳定版官方下载页面(需注册登陆)
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
[JRE]JavaRuntimeEnvironment稳定版官方下载页面(需注册登陆)
https://java.com/en/download/manual.jsp