JDK7新特性学习总结.docx
- 文档编号:3849579
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:22
- 大小:25.61KB
JDK7新特性学习总结.docx
《JDK7新特性学习总结.docx》由会员分享,可在线阅读,更多相关《JDK7新特性学习总结.docx(22页珍藏版)》请在冰豆网上搜索。
JDK7新特性学习总结
一JDK7新特性简单说明
准备
JDK7下载
API文档
可惜还没有中文API,貌似.
1. 虚拟机
支持动态语言
严格的类文件检查
2. 语言
语法方面的更新
core类加载器(class-loader)的架构进行了升级改进
提供关闭URLClassLoader的方法
并发框架和容器的更新
3. 网络
提供更多的newI/OAPI
filesystem支持zip/jar归档
SCTP(StreamControlTransmissionProtocol)
SDP(SocketDirectProtocol)
使用WindowsVista的IPv6stack
TLS1.2
4. 安全相关
Elliptic-curvecryptography(ECC)
5. 国际化
Unicode6.0
Local增强
区别userlocal和user-interfacelocal
6. jdbc
JDBC4.1
7. client
Java2D提供XRenderpipeline
为6u10图形特性提供新的平台api
Swing支持光圈效果(Nimbuslook-and-feel)
SwingJLayer组件
8. web
更新XMLstack
9. mgmt
增强JMXAgent和MBeans
二,特性详解
(1)语法性特性
JDK7对Java语法有少量更新,重点是在易用性和便捷性的改进。
1.二进制字面量
JDK7开始,终于可以用二进制来表示整数(byte,short,int和long)。
使用二进制字面量的好处是,可以是代码更容易被理解。
语法非常简单,只要在二进制数值前面加0b或者0B
Java代码
bytenByte=(byte)0b0001;
shortnShort=(short)0B0010;
intnInt=0b0011;
longnLong=0b0100L;
2.数字字面量可以出现下划线
对于一些比较大的数字,我们定义起来总是不方面,经常缺少或者增加位数。
JDK7为我们提供了一种解决方案,下划线可以出现在数字字面量。
Java代码
inta=10_0000_0000;
longb=0xffff_ffff_ffff_ffffl;
bytec=0b0001_1000;
注意:
你只能将下划线置于数字之间,以下使用方法是错误的,
1.数字的开头或者结尾
2.小数点的前后
3.‘F’或者‘f’的后缀
4.只能用数字的位置
Java代码
interr1=_11,err2=11_;
floaterr3=3._4,err4=3_.4;
longerr5=0x888_f;
3.switch语句可以用字符串了
这个功能千呼万唤,终于出来了
Java代码
privatestaticvoidswitchString(Stringstr){
switch(str){
case"one":
System.err.println("1");
break;
case"two":
System.out.println("2");
break;
default:
System.out.println("err");
}
}
4.泛型实例的创建可以通过类型推断来简化
以后你创建一个泛型实例,不需要再详细说明类型,只需用<>,编译器会自动帮你匹配
Java代码
//例如
Map
//可以简化为
Map
5.在可变参数方法中传递非具体化参数(Non-ReifiableFormalParameters),改进编译警告和错误
有些参数类型,例如ArrayList
Heappollution指一个变量被指向另外一个不是相同类型的变量。
例如
Java代码
Listl=newArrayList
List
l.add(0,newInteger(42));//anotheruncheckedwarning
Strings=ls.get(0); //ClassCastExceptionisthrown
回到我们的主题,在jdk7中,当你定义下面的函数时
Java代码
publicstatic
for(Tx:
elements){
listArg.add(x);
}
}
你会得到一个warning
warning:
[varargs]Possibleheappollutionfromparameterizedvarargtype
在jdk7之前,当你调用一个含有非具体化参数的可变参数方法,你必须自行保证不会发生“heappollution”。
这有一个问题,如果调用者对方法不熟悉,他根本无法判断。
JDK7对此做了改进,在该方法被定义时久发出警告
要消除警告,可以有三种方式
1.加annotation@SafeVarargs
2.加annotation@SuppressWarnings({"unchecked","varargs"})
3.使用编译器参数–Xlint:
varargs;
6.try-with-resources语句
jdk7提供了try-with-resources,可以自动关闭相关的资源(只要该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)
Java代码
staticStringreadFirstLineFromFile(Stringpath)throwsIOException{
try(BufferedReaderbr=newBufferedReader(newFileReader(path))){
returnbr.readLine();
}
}
try语句块中还可以同时处理多个资源,可以跟普通的try语句一样catch异常,有finally语句块
Java代码
try(
java.util.zip.ZipFilezf=newjava.util.zip.ZipFile(zipFileName);
java.io.BufferedWriterwriter=java.nio.file.Files.newBufferedWriter(outputFilePath,charset)
){
}catch(…){
}finally{
}
7.Catch多个Exception,rethrowexception改进了类型检测
很多时候,我们捕获了多个异常,却做了相同的事情,比如记日志,包装成新的异常,然后rethrow。
这时,代码就不那么优雅了,例如
Java代码
catch(IOExceptionex){
logger.log(ex);
throwex;
catch(SQLExceptionex){
logger.log(ex);
throwex;
}
Jdk7允许捕获多个异常
Java代码
catch(IOException|SQLExceptionex){
logger.log(ex);
throwex;
}
注意,catch后面的异常参数是final的,不能重新再复制
RethrowException更具包容性的类型检测
当你重新抛出多个异常时,不再需要详细定义异常类型了,编译器已经知道你具体抛出的是哪个异常了。
你只需在方法定义的时候声明需要抛出的异常即可
Java代码
publicvoidcall()throwsReflectiveOperationException,IOException{
try{
callWithReflection(arg);
}catch(finalExceptione){
logger.trace("Exceptioninreflection",e);
throwe;
}
}
(2)fork/join框架
对于框架的原理,可以阅读DougLea的文章“AJavaFork/JoinFramework”:
了解Fork/Join模式的实现机制和执行性能。
原理解析:
fork分解,join结合。
这个框架的本质是将一个任务分解成多个子任务,每个子任务用单独的线程去处理。
这里用到了递归的思想。
框架的结构图可以参考
使用fork/join框架很简单,
1.实现子问题的一般求解算法
2.如何分解问题
3.继承RecursiveAction,实现compute()方法
伪代码代码
Resultsolve(Problemproblem){
if(problemissmall)
directlysolveproblem
else{
splitproblemintoindependentparts
forknewsubtaskstosolveeachpart
joinallsubtasks
composeresultfromsubresults
}
这里我通过一个改进的二分查找来讲解fork/join的使用。
(后面才发现,选用这个案例是非常失败的,因为二分查找的时间是logn,而创建线程的开销更大,这样并不能体现多线程二分查找的优势,所以这个代码不具有实用性,只是为了说明如何使用框架:
)
代码如下:
BinarySearchProblem.java
Java代码
packagetestjdk7;
importjava.util.Arrays;
/**
*@authorkencs@
*/
publicclassBinarySearchProblem{
privatefinalint[]numbers;
privatefinalintstart;
privatefinalintend;
publicfinalintsize;
publicBinarySearchProblem(int[]numbers,intstart,intend){
this.numbers=numbers;
this.start=start;
this.end=end;
this.size=end-start;
}
publicintsearchSequentially(intnumberToSearch){
//偷懒,不自己写二分查找了
returnArrays.binarySearch(numbers,start,end,numberToSearch);
}
publicBinarySearchProblemsubProblem(intsubStart,intsubEnd){
returnnewBinarySearchProblem(numbers,start+subStart,start+subEnd);
}
}
BiSearchWithForkJoin.java
Java代码
packagetestjdk7;
importjava.util.concurrent.ForkJoinPool;
importjava.util.concurrent.RecursiveAction;
/**
*@authorkencs@
*/
publicclassBiSearchWithForkJoinextendsRecursiveAction{
privatefinalintthreshold;
privatefinalBinarySearchProblemproblem;
publicintresult;
privatefinalintnumberToSearch;
publicBiSearchWithForkJoin(BinarySearchProblemproblem,intthreshold,intnumberToSearch){
this.problem=problem;
this.threshold=threshold;
this.numberToSearch=numberToSearch;
}
@Override
protectedvoidcompute(){
if(problem.size result=problem.searchSequentially(numberToSearch); }else{ //分解子任务 intmidPoint=problem.size/2; BiSearchWithForkJoinleft=newBiSearchWithForkJoin(problem.subProblem(0,midPoint),threshold,numberToSearch); BiSearchWithForkJoinright=newBiSearchWithForkJoin(problem.subProblem(midPoint+1,problem.size),threshold,numberToSearch); invokeAll(left,right); result=Math.max(left.result,right.result); } } //构造数据 privatestaticfinalint[]data=newint[1000_0000]; static{ for(inti=0;i<1000_0000;i++){ data[i]=i; } } publicstaticvoidmain(String[]args){ BinarySearchProblemproblem=newBinarySearchProblem(data,0,data.length); intthreshold=100; intnThreads=10; //查找100_0000所在的下标 BiSearchWithForkJoin bswfj=newBiSearchWithForkJoin(problem,threshold,100_0000); ForkJoinPoolfjPool=newForkJoinPool(nThreads); fjPool.invoke(bswfj); System.out.printf("Resultis: %d%n",bswfj.result); } } RecursiveTask还可以带返回值,这里给出一段代码作为参考(斐波那契函数) Java代码 classFibonacciextendsRecursiveTask finalintn; Fibonacci(intn){ this.n=n; } privateintcompute(intsmall){ finalint[]results={1,1,2,3,5,8,13,21,34,55,89}; returnresults[small]; } publicIntegercompute(){ if(n<=10){ returncompute(n); } Fibonaccif1=newFibonacci(n-1); Fibonaccif2=newFibonacci(n-2); System.out.println("forknewthreadfor"+(n-1)); f1.fork(); System.out.println("forknewthreadfor"+(n-2)); f2.fork(); returnf1.join()+f2.join(); } } 用途 只要问题能够分解成类似子问题的,都可以使用这个框架。 对于大批量的数据尤其合适 (3)NIO2.0文件系统 java.io.File不够完美吧。 Jdk7提供了一套新的文件系统,会让你满意的。 先来聊聊java.io.File的七宗罪吧: ) 1.很多方法失败时候都没有抛出异常,很难查找原因 2.方法rename在不同平台中运行有问题 3.不能真正支持symboliclinks 4.不能读取文件的更详细属性,比如权限,所有者…… 5.访问文件的metadata效率低下 6.很多方法性能不行。 例如处理比较大的目录 7.无法递归查找文件树,以及存在循环的symboliclinks可能造成问题 本次jdk7更新了很多新的api。 方法太多了,我就不一一列举了,感兴趣的可以去查阅api 主要包括: FileSystem提供了许多方法来获得当前文件系统的相关信息。 Path处理路径(文件和目录),包括 创建path,Paths.get(Strings) 获得path的详细信息getName(),getXX()… 删除path的冗余信息toRealPath 转换pathtoAbsolutePath() 合并两个pathresolve() 在两个path之间创建相对路径relativeze() 比较路径equal()startsWith(),endWith() Files支持各种文件操作,包括 移动文件, 复制文件, 删除文件, 更详细的文件属性,包括文件权限,创建者,修改时间…… Walking theFileTree(递归遍历文件树) WatchaDirectoryforChange(监听文件更改) (4)JDBC4.1 JDBC4.1更新了两个新特性 Connection,ResultSet和Statement都实现了Closeable接口,所有在try-with-resources语句中调用,就可以自动关闭相关资源了 Java代码 try(Statementstmt=con.createStatement()){ … } 2.RowSet1.1: 引入RowSetFactory接口和RowSetProvider类,可以创建JDBCdriver支持的各种rowsets Java代码 RowSetFactorymyRowSetFactory=null; JdbcRowSetjdbcRs=null; ResultSetrs=null; Statement
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JDK7 特性 学习 总结