JDK7新特性学习总结文档格式.docx
- 文档编号:16755828
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:22
- 大小:25.61KB
JDK7新特性学习总结文档格式.docx
《JDK7新特性学习总结文档格式.docx》由会员分享,可在线阅读,更多相关《JDK7新特性学习总结文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
区别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为我们提供了一种解决方案,下划线可以出现在数字字面量。
inta=10_0000_0000;
longb=0xffff_ffff_ffff_ffffl;
bytec=0b0001_1000;
注意:
你只能将下划线置于数字之间,以下使用方法是错误的,
1.数字的开头或者结尾
2.小数点的前后
3.‘F’或者‘f’的后缀
4.只能用数字的位置
interr1=_11,err2=11_;
floaterr3=3._4,err4=3_.4;
longerr5=0x888_f;
3.switch语句可以用字符串了
这个功能千呼万唤,终于出来了
privatestaticvoidswitchString(Stringstr){
switch(str){
case"
one"
:
System.err.println("
1"
);
break;
two"
System.out.println("
2"
default:
err"
}
}
4.泛型实例的创建可以通过类型推断来简化
以后你创建一个泛型实例,不需要再详细说明类型,只需用<
>
编译器会自动帮你匹配
//例如
Map<
String,List<
String>
myMap=newHashMap<
();
//可以简化为
5.在可变参数方法中传递非具体化参数(Non-ReifiableFormalParameters),改进编译警告和错误
有些参数类型,例如ArrayList<
Number>
和List<
是非具体化的(non-reifiable).在编译阶段,编译器会擦除该类型信息。
Heappollution指一个变量被指向另外一个不是相同类型的变量。
例如
Listl=newArrayList<
List<
ls=l;
//uncheckedwarning
l.add(0,newInteger(42));
//anotheruncheckedwarning
Strings=ls.get(0);
//ClassCastExceptionisthrown
回到我们的主题,在jdk7中,当你定义下面的函数时
publicstatic<
T>
voidaddToList(List<
listArg,T...elements){
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为绝大部分资源对象都实现了这个接口)
staticStringreadFirstLineFromFile(Stringpath)throwsIOException{
try(BufferedReaderbr=newBufferedReader(newFileReader(path))){
returnbr.readLine();
try语句块中还可以同时处理多个资源,可以跟普通的try语句一样catch异常,有finally语句块
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。
这时,代码就不那么优雅了,例如
catch(IOExceptionex){
logger.log(ex);
throwex;
catch(SQLExceptionex){
Jdk7允许捕获多个异常
catch(IOException|SQLExceptionex){
注意,catch后面的异常参数是final的,不能重新再复制
RethrowException更具包容性的类型检测
当你重新抛出多个异常时,不再需要详细定义异常类型了,编译器已经知道你具体抛出的是哪个异常了。
你只需在方法定义的时候声明需要抛出的异常即可
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
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
importjava.util.concurrent.ForkJoinPool;
importjava.util.concurrent.RecursiveAction;
publicclassBiSearchWithForkJoinextendsRecursiveAction{
privatefinalintthreshold;
privatefinalBinarySearchProblemproblem;
publicintresult;
privatefinalintnumberToSearch;
publicBiSearchWithForkJoin(BinarySearchProblemproblem,intthreshold,intnumberToSearch){
this.problem=problem;
this.threshold=threshold;
this.numberToSearch=numberToSearch;
@Override
protectedvoidcompute(){
if(problem.size<
threshold){//小于阀值,就直接用普通的二分查找
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还可以带返回值,这里给出一段代码作为参考(斐波那契函数)
classFibonacciextendsRecursiveTask<
Integer>
{
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);
forknewthreadfor"
+(n-1));
f1.fork();
+(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语句中调用,就可以自动关闭相关资源了
try(Statementstmt=con.createStatement()){
…
2.RowSet1.1:
引入RowSetFactory接口和RowSetProvider类,可以创建JDBCdriver支持的各种rowsets
RowSetFactorymyRowSetFactory=null;
JdbcRowSetjdbcRs=null;
ResultSetrs=null;
Statement
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JDK7 特性 学习 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)