jdk7和8的一些新特性介绍

2017-01-05 11:11:18来源:oschina作者:longload人点击


更多ppt内容请查看:http://www.javaarch.net/jiagoushi/927.htm



Java代码
收藏代码

本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容。
官方文档:http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html在jdk7的新特性方面主要有下面几方面的增强:1.jdk7语法上1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。//所有整数int,short,long,byte都可以用二进制表示
//An8-bit'byte'value:
byteaByte=(byte)0b00100001;//A16-bit'short'value:
shortaShort=(short)0b1010000101000101;//Some32-bit'int'values:
intanInt1=0b10100001010001011010000101000101;
intanInt2=0b101;
intanInt3=0B101;//TheBcanbeupperorlowercase.//A64-bit'long'value.Notethe"L"suffix:
longaLong=0b1010000101000101101000010100010110100001010001011010000101000101L;//二进制在数组等的使用
finalint[]phases={0b00110001,0b01100010,0b11000100,0b10001001,
0b00010011,0b00100110,0b01001100,0b10011000};1.2Switch语句支持string类型publicstaticStringgetTypeOfDayWithSwitchStatement(StringdayOfWeekArg){
StringtypeOfDay;
switch(dayOfWeekArg){
case"Monday":
typeOfDay="Startofworkweek";
break;
case"Tuesday":
case"Wednesday":
case"Thursday":
typeOfDay="Midweek";
break;
case"Friday":
typeOfDay="Endofworkweek";
break;
case"Saturday":
case"Sunday":
typeOfDay="Weekend";
break;
default:
thrownewIllegalArgumentException("Invaliddayoftheweek:"+dayOfWeekArg);
}
returntypeOfDay;
}1.3Try-with-resource语句注意:实现java.lang.AutoCloseable接口的资源都可以放到try中,跟final里面的关闭资源类似;按照声明逆序关闭资源;Try块抛出的异常通过Throwable.getSuppressed获取try(java.util.zip.ZipFilezf=newjava.util.zip.ZipFile(zipFileName);
java.io.BufferedWriterwriter=java.nio.file.Files
.newBufferedWriter(outputFilePath,charset)){
//Enumerateeachentry
for(java.util.Enumerationentries=zf.entries();entries
.hasMoreElements();){
//Gettheentrynameandwriteittotheoutputfile
StringnewLine=System.getProperty("line.separator");
StringzipEntryName=((java.util.zip.ZipEntry)entries
.nextElement()).getName()+newLine;
writer.write(zipEntryName,0,zipEntryName.length());
}
}1.4Catch多个异常说明:Catch异常类型为final;生成Bytecode会比多个catch小;Rethrow时保持异常类型publicstaticvoidmain(String[]args)throwsException{
try{
testthrows();
}catch(IOException|SQLExceptionex){
throwex;
}
}
publicstaticvoidtestthrows()throwsIOException,SQLException{
}1.5数字类型的下划线表示更友好的表示方式,不过要注意下划线添加的一些标准,可以参考下面的示例longcreditCardNumber=1234_5678_9012_3456L;
longsocialSecurityNumber=999_99_9999L;
floatpi=3.14_15F;
longhexBytes=0xFF_EC_DE_5E;
longhexWords=0xCAFE_BABE;
longmaxLong=0x7fff_ffff_ffff_ffffL;
bytenybbles=0b0010_0101;
longbytes=0b11010010_01101001_10010100_10010010;
//floatpi1=3_.1415F;//Invalid;cannotputunderscoresadjacenttoadecimalpoint
//floatpi2=3._1415F;//Invalid;cannotputunderscoresadjacenttoadecimalpoint
//longsocialSecurityNumber1=999_99_9999_L;//Invalid;cannotputunderscorespriortoanLsuffix
//intx1=_52;//Thisisanidentifier,notanumericliteral
intx2=5_2;//OK(decimalliteral)
//intx3=52_;//Invalid;cannotputunderscoresattheendofaliteral
intx4=5_______2;//OK(decimalliteral)
//intx5=0_x52;//Invalid;cannotputunderscoresinthe0xradixprefix
//intx6=0x_52;//Invalid;cannotputunderscoresatthebeginningofanumber
intx7=0x5_2;//OK(hexadecimalliteral)
//intx8=0x52_;//Invalid;cannotputunderscoresattheendofanumber
intx9=0_52;//OK(octalliteral)
intx10=05_2;//OK(octalliteral)
//intx11=052_;//Invalid;cannotputunderscoresattheendofanumber
1.6泛型实例的创建可以通过类型推断来简化可以去掉后面new部分的泛型类型,只用<>就可以了。
//使用泛型前
ListstrList=newArrayList();
ListstrList4=newArrayList();
List>>strList5=newArrayList>>();//编译器使用尖括号(<>)推断类型
ListstrList0=newArrayList();
List>>strList1=newArrayList>>();
ListstrList2=newArrayList<>();
List>>strList3=newArrayList<>();
Listlist=newArrayList<>();
list.add("A");
//ThefollowingstatementshouldfailsinceaddAllexpects
//Collection<?extendsString>
//list.addAll(newArrayList<>());1.7在可变参数方法中传递非具体化参数,改进编译警告和错误Heappollution指一个变量被指向另外一个不是相同类型的变量。例如Listl=newArrayList();
Listls=l;//uncheckedwarning
l.add(0,newInteger(42));//anotheruncheckedwarning
Strings=ls.get(0);//ClassCastExceptionisthrown
Jdk7:
publicstaticvoidaddToList(ListlistArg,T...elements){
for(Tx:elements){
listArg.add(x);
}
}
你会得到一个warning
warning:[varargs]Possibleheappollutionfromparameterizedvarargtype
要消除警告,可以有三种方式
1.加annotation@SafeVarargs
2.加annotation@SuppressWarnings({"unchecked","varargs"})
3.使用编译器参数–Xlint:varargs;1.8信息更丰富的回溯追踪就是上面try中try语句和里面的语句同时抛出异常时,异常栈的信息java.io.IOException
§?atSuppress.write(Suppress.java:19)
§?atSuppress.main(Suppress.java:8)
§?Suppressed:java.io.IOException
§?atSuppress.close(Suppress.java:24)
§?atSuppress.main(Suppress.java:9)
§?Suppressed:java.io.IOException
§?atSuppress.close(Suppress.java:24)
§?atSuppress.main(Suppress.java:9)2.NIO2的一些新特性1.java.nio.file和java.nio.file.attribute包支持更详细属性,比如权限,所有者
2.symbolicandhardlinks支持
3.Path访问文件系统,Files支持各种文件操作
4.高效的访问metadata信息
5.递归查找文件树,文件扩展搜索
6.文件系统修改通知机制
7.File类操作API兼容
8.文件随机访问增强mappingaregion,loclaregion,绝对位置读取
9.AIOReactor(基于事件)和Proactor下面列一些示例:2.1IOandNewIO监听文件系统变化通知通 过FileSystems.getDefault().newWatchService()获取watchService,然后将需要监听的path目录 注册到这个watchservice中,对于这个目录的文件修改,新增,删除等实践可以配置,然后就自动能监听到响应的事件。privateWatchServicewatcher;
publicTestWatcherService(Pathpath)throwsIOException{
watcher=FileSystems.getDefault().newWatchService();
path.register(watcher,ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY);
}
publicvoidhandleEvents()throwsInterruptedException{
while(true){
WatchKeykey=watcher.take();
for(WatchEvent<?>event:key.pollEvents()){
WatchEvent.Kindkind=event.kind();
if(kind==OVERFLOW){//事件可能lostordiscarded
continue;
}
WatchEvente=(WatchEvent)event;
PathfileName=e.context();
System.out.printf("Event%shashappened,whichfileNameis%s%n",kind.name(),fileName);
}
if(!key.reset()){
break;
}2.2IOandNewIO 遍历文件树,通过继承SimpleFileVisitor类,实现事件遍历目录树的操作,然后通过 Files.walkFileTree(listDir,opts,Integer.MAX_VALUE,walk);这个API来遍历目录树privatevoidworkFilePath(){
PathlistDir=Paths.get("/tmp");//definethestartingfile
ListTreewalk=newListTree();
…Files.walkFileTree(listDir,walk);…
//遍历的时候跟踪链接
EnumSetopts=EnumSet.of(FileVisitOption.FOLLOW_LINKS);
try{
Files.walkFileTree(listDir,opts,Integer.MAX_VALUE,walk);
}catch(IOExceptione){
System.err.println(e);
}
classListTreeextendsSimpleFileVisitor{//NIO2递归遍历文件目录的接口
@Override
publicFileVisitResultpostVisitDirectory(Pathdir,IOExceptionexc){
System.out.println("Visiteddirectory:"+dir.toString());
returnFileVisitResult.CONTINUE;
}
@Override
publicFileVisitResultvisitFileFailed(Pathfile,IOExceptionexc){
System.out.println(exc);
returnFileVisitResult.CONTINUE;
}
}2.3AIO异步IO文件和网络异步IO在java
NIO2 实现了,都是用AsynchronousFileChannel,AsynchronousSocketChanne等实现,关于同步阻塞IO,同步非阻 塞IO,异步阻塞IO和异步非阻塞IO在ppt的这页上下面备注有说明,有兴趣的可以深入了解下。JavaNIO2中就实现了操作系统的异步非阻塞 IO。//使用AsynchronousFileChannel.open(path,withOptions(),
//taskExecutor))这个API对异步文件IO的处理
publicstaticvoidasyFileChannel2(){
finalintTHREADS=5;
ExecutorServicetaskExecutor=Executors.newFixedThreadPool(THREADS);
Stringencoding=System.getProperty("file.encoding");
List>list=newArrayList<>();
intsheeps=0;
Pathpath=Paths.get("/tmp",
"store.txt");
try(AsynchronousFileChannelasynchronousFileChannel=AsynchronousFileChannel
.open(path,withOptions(),taskExecutor)){
for(inti=0;i<50;i++){
Callableworker=newCallable(){
@Override
publicByteBuffercall()throwsException{
ByteBufferbuffer=ByteBuffer
.allocateDirect(ThreadLocalRandom.current()
.nextInt(100,200));
asynchronousFileChannel.read(buffer,ThreadLocalRandom
……3.JDBC4.13.1.可以使用try-with-resources自动关闭Connection,ResultSet,和Statement资源对象3.2.RowSet1.1:引入RowSetFactory接口和RowSetProvider类,可以创建JDBCdriver支持的各种rowsets,这里的rowset实现其实就是将sql语句上的一些操作转为方法的操作,封装了一些功能。3.3.JDBC-ODBC驱动会在jdk8中删除try(Statementstmt=con.createStatement()){
RowSetFactoryaFactory=RowSetProvider.newFactory();
CachedRowSetcrs=aFactory.createCachedRowSet();RowSetFactoryrsf=RowSetProvider.newFactory("com.sun.rowset.RowSetFactoryImpl",null);
WebRowSetwrs=rsf.createWebRowSet();
createCachedRowSet
createFilteredRowSet
createJdbcRowSet
createJoinRowSet
createWebRowSet4.并发工具增强4.1.fork-join
最大的增强,充分利用多核特性,将大问题分解成各个子问题,由多个cpu可以同时解决多个子问题,最后合并结果,继承RecursiveTask,实现compute方法,然后调用fork计算,最后用join合并结果。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();
}
}4.2.ThreadLocalRandon并发下随机数生成类,保证并发下的随机数生成的线程安全,实际上就是使用threadlocalfinalintMAX=100000;
ThreadLocalRandomthreadLocalRandom=ThreadLocalRandom.current();
longstart=System.nanoTime();
for(inti=0;i threadLocalRandom.nextDouble();
}
longend=System.nanoTime()-start;
System.out.println("usetime1:"+end);
longstart2=System.nanoTime();
for(inti=0;i Math.random();
}
longend2=System.nanoTime()-start2;
System.out.println("usetime2:"+end2);4.3.phaser类似cyclebarrier和countdownlatch,不过可以动态添加资源减少资源voidrunTasks(Listtasks){
finalPhaserphaser=newPhaser(1);//"1"toregisterself
//createandstartthreads
for(finalRunnabletask:tasks){
phaser.register();
newThread(){
publicvoidrun(){
phaser.arriveAndAwaitAdvance();//awaitallcreation
task.run();
}
}.start();
}
//allowthreadstostartandderegisterself
phaser.arriveAndDeregister();
}5.Networking增强新增URLClassLoaderclose方法,可以及时关闭资源,后续重新加载class文件时不会导致资源被占用或者无法释放问题
URLClassLoader.newInstance(newURL[]{}).close();
新增SocketsDirectProtocol
绕过操作系统的数据拷贝,将数据从一台机器的内存数据通过网络直接传输到另外一台机器的内存中6.MultithreadedCustomClassLoaders解决并发下加载class可能导致的死锁问题,这个是jdk1.6的一些新版本就解决了,jdk7也做了一些优化。有兴趣可以仔细从官方文档详细了解jdk7前:ClassHierarchy:
classAextendsB
classCextendsD
ClassLoaderDelegationHierarchy:
CustomClassloaderCL1:
directlyloadsclassA
delegatestocustomClassLoaderCL2forclassB
CustomClassloaderCL2:
directlyloadsclassC
delegatestocustomClassLoaderCL1forclassD
Thread1:
UseCL1toloadclassA(locksCL1)
defineClassAtriggers
loadClassB(trytolockCL2)
Thread2:
UseCL2toloadclassC(locksCL2)
defineClassCtriggers
loadClassD(trytolockCL1)
SynchronizationintheClassLoaderclasswajdk7Thread1:
UseCL1toloadclassA(locksCL1+A)
defineClassAtriggers
loadClassB(locksCL2+B)
Thread2:
UseCL2toloadclassC(locksCL2+C)
defineClassCtriggers
loadClassD(locksCL1+D)7.Security增强7.1.提供几种ECC-basedalgorithms(ECDSA/ECDH)EllipticCurveCryptography(ECC)
7.2.禁用CertPathAlgorithmDisabling
7.3.JSSE(SSL/TLS)的一些增强8.Internationalization增强增加了对一些编码的支持和增加了一些显示方面的编码设置等1.NewScriptsandCharactersfromUnicode6.0.0
2.ExtensibleSupportforISO4217CurrencyCodes
Currency类添加:
getAvailableCurrencies
getNumericCode
getDisplayName
getDisplayName(Locale)
3.CategoryLocaleSupport
getDefault(Locale.Category)FORMATDISPLAY
4.LocaleClassSupportsBCP47andUTR35
UNICODE_LOCALE_EXTENSION
PRIVATE_USE_EXTENSION
Locale.Builder
getExtensionKeys()
getExtension(char)
getUnicodeLocaleType(String
……
5.NewNumericShaperMethods
NumericShaper.Range
getShaper(NumericShaper.Range)
getContextualShaper(Set)……9.jvm方面的一些特性增强,下面这些特性有些在jdk6中已经存在,这里做了一些优化和增强。1.Jvm支持非java的语言invokedynamic指令2.Garbage- FirstCollector适合server端,多处理器下大内存,将heap分成大小相等的多个区域,mark阶段检测每个区域的存活对 象,compress阶段将存活对象最小的先做回收,这样会腾出很多空闲区域,这样并发回收其他区域就能减少停止时间,提高吞吐量。3.HotSpot性能增强
TieredCompilation-XX:+UseTieredCompilation多层编译,对于经常调用的代码会直接编译程本地代码,提高效率
CompressedOops压缩对象指针,减少空间使用
Zero-BasedCompressedOrdinaryObjectPointers(oops)进一步优化零基压缩对象指针,进一步压缩空间4.EscapeAnalysis逃逸分析,对于只是在一个方法使用的一些变量,可以直接将对象分配到栈上,方法执行完自动释放内存,而不用通过栈的对象引用引用堆中的对象,那么对于对象的回收可能不是那么及时。5.NUMACollectorEnhancementsNUMA(NonUniformMemoryAccess),NUMA在多种计算机系统中都得到实现,简而言之,就是将内存分段访问,类似于硬盘的RAID,Oracle中的分簇10.Java2DEnhancements1.XRender-BasedRenderingPipeline-Dsun.java2d.xrender=True
2.SupportforOpenType/CFFFontsGraphicsEnvironment.getAvailableFontFamilyNames
3.TextLayoutSupportforTibetanScript
4.SupportforLinuxFonts11.SwingEnhancements1.JLayer
2.NimbusLook&Feel
3.HeavyweightandLightweightComponents
4.ShapedandTranslucentWindows
5.Hue-Saturation-Luminance(HSL)ColorSelectioninJColorChooserClass
12.Jdk8lambda表达式最大的新增的特性,不过在很多动态语言中都已经原生支持。原来这么写:btn.setOnAction(newEventHandler(){
@Override
publicvoidhandle(ActionEventevent){
System.out.println("HelloWorld!");
}
});jdk8直接可以这么写:btn.setOnAction(
event->System.out.println("HelloWorld!")
);更多示例:publicclassUtils{
publicstaticintcompareByLength(Stringin,Stringout){
returnin.length()-out.length();
}
}publicclassMyClass{
publicvoiddoSomething(){
String[]args=newString[]{"microsoft","apple","linux","oracle"}
Arrays.sort(args,Utils::compareByLength);
}
}13.jdk8的一些其他特性,当然jdk8的增强功能还有很多,大家可以参考http://openjdk.java.net/projects/jdk8/用Metaspace代替PermGen
动态扩展,可以设置最大值,限制于本地内存的大小
Parallelarraysorting新APIArrays#parallelSort.NewDate&TimeAPI
Clockclock=Clock.systemUTC();//returnthecurrenttimebasedonyoursystemclockandsettoUTC.Clockclock=Clock.systemDefaultZone();//returntimebasedonsystemclockzonelongtime=clock.millis();//timeinmillisecondsfromJanuary1st,1970更多内容可以看看附件ppt,示例代码可以参考:https://github.com/zhwj184/jdk7-8demo

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台