1. 介绍

JAVA作为使用的主力语言,掌握下其历史发展也是有必要的。看看从JAVA5开始到现在的JAVA9有哪些变化。借此机会,也可以看看哪些特性我们是已经用到的,哪些是还没有用到的。

如果有程序猿小伙伴们在工作和学习过程中,遇到一些磕磕碰碰的问题,难以解决,这些问题可能会困扰你许久,但是懂得人一下就解决了,为此我特意建了一个java学习群,快来加入我们吧:925050116,里面有大量优质视频资料免费领取喔,让你少走弯路,互相学习交流,一起进步,不负年华!!!

我们在IDEA里面也可以看到language level里面的信息,这里也大致写了下各个版本JDK的新特性。

简单概括下就是:

JAVA1.3:普通的原始的JAVA,基本语法相信大家都见过了

JAVA1.4:assert关键字

JAVA5:枚举类型、泛型、自动拆装箱

JAVA6: @Override注解

JAVA7: <>符号、ARM支持、支持多catch

JAVA8:Lamda表达式,类型注解等

JAVA9: 模块化、接口中的私有方法等

下面我们更加详细的分析下各个版本有哪些新特性。

2. JAVA5

Java5开发代号为Tiger(老虎),于2004-09-30发行

特性列表

  • 泛型
  • 枚举
  • 自动装箱拆箱
  • 可变参数
  • 注解
  • foreach循环(增强for、for/in)
  • 静态导入
  • 格式化(System.out.println 支持%s %d等格式化输出)
  • 线程框架/数据结构 JUC
  • Arrays工具类/StringBuilder/instrument

1、泛型

所谓类型擦除指的就是Java源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息。也就是说,范型信息在编译时将会被全部删除,其中范型类型的类型参数则会被替换为Object类型,并在实际使用时强制转换为指定的目标数据类型。而C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码。

Map<Integer, Integer> squares = new HashMap<Integer, Integer>();

通配符类型:避免unchecked警告,问号表示任何类型都可以接受

public void printList(List<?> list, PrintStream out) throws IOException {for (Iterator<?> i = list.iterator(); i.hasNext(); ) {out.println(i.next().toString());}}

限制类型

public static <A extends Number> double sum(Box<A> box1,Box<A> box2){double total = 0;for (Iterator<A> i = box1.contents.iterator(); i.hasNext(); ) {total = total + i.next().doubleValue();}for (Iterator<A> i = box2.contents.iterator(); i.hasNext(); ) {total = total + i.next().doubleValue();}return total;}

2、枚举

EnumMap

public void testEnumMap(PrintStream out) throws IOException {// Create a map with the key and a String messageEnumMap<AntStatus, String> antMessages =new EnumMap<AntStatus, String>(AntStatus.class);// Initialize the mapantMessages.put(AntStatus.INITIALIZING, "Initializing Ant...");antMessages.put(AntStatus.COMPILING, "Compiling Java classes...");antMessages.put(AntStatus.COPYING, "Copying files...");antMessages.put(AntStatus.JARRING, "JARring up files...");antMessages.put(AntStatus.ZIPPING, "ZIPping up files...");antMessages.put(AntStatus.DONE, "Build complete.");antMessages.put(AntStatus.ERROR, "Error occurred.");// Iterate and print messagesfor (AntStatus status : AntStatus.values() ) {out.println("For status " + status + ", message is: " +antMessages.get(status));}}

switch枚举

public String getDescription() {switch(this) {case ROSEWOOD: return "Rosewood back and sides";case MAHOGANY: return "Mahogany back and sides";case ZIRICOTE: return "Ziricote back and sides";case SPRUCE: return "Sitka Spruce top";case CEDAR: return "Wester Red Cedar top";case AB_ROSETTE: return "Abalone rosette";case AB_TOP_BORDER: return "Abalone top border";case IL_DIAMONDS: return "Diamonds and squares fretboard inlay";case IL_DOTS:return "Small dots fretboard inlay";default: return "Unknown feature";}}

3、自动拆箱/装箱

将primitive类型转换成对应的wrapper类型:Boolean、Byte、Short、Character、Integer、Long、Float、Double

4、可变参数

private String print(Object... values) {StringBuilder sb = new StringBuilder();for (Object o : values) {sb.append(o.toString()).append(" ");}return sb.toString();}

5、注解

Inherited表示该注解是否对类的子类继承的方法等起作用

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface InProgress { }

Target类型

Rentation表示annotation是否保留在编译过的class文件中还是在运行时可读。

6、增强for循环 for/in

for/in循环办不到的事情:

(1)遍历同时获取index

(2)集合逗号拼接时去掉最后一个

(3)遍历的同时删除元素

7、静态导入

import static java.lang.System.err;
import static java.lang.System.out;
err.println(msg); 

8、print输出格式化

 
System.out.println("Line %d: %s%n", i++, line);

9、并发支持(JUC)

线程池

uncaught exception(可以抓住多线程内的异常)

class SimpleThreadExceptionHandler implementsThread.UncaughtExceptionHandler {public void uncaughtException(Thread t, Throwable e) {System.err.printf("%s: %s at line %d of %s%n",t.getName(), e.toString(),e.getStackTrace()[0].getLineNumber(),e.getStackTrace()[0].getFileName());}

blocking queue(BlockingQueue)

JUC类库

10、Arrays、Queue、线程安全StringBuilder

Arrays工具类

Arrays.sort(myArray);
Arrays.toString(myArray)
Arrays.binarySearch(myArray, 98)
Arrays.deepToString(ticTacToe)
Arrays.deepEquals(ticTacToe, ticTacToe3)

Queue

避开集合的add/remove操作,使用offer、poll操作(不抛异常)

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接口。

Queue q = new LinkedList(); //采用它来实现queue

Override返回类型

单线程StringBuilder

java.lang.instrument

3. JAVA6

Java6开发代号为Mustang(野马),于2006-12-11发行。评价:鸡肋的版本,有JDBC4.0更新、Complier API、WebSevice支持的加强等更新。

1、Web Services

优先支持编写 XML web service 客户端程序。你可以用过简单的annotaion将你的API发布成.NET交互的web services. Mustang 添加了新的解析和 XML 在 Java object-mapping APIs中, 之前只在Java EE平台实现或者Java Web Services Pack中提供.

2、Scripting(开启JS的支持,算是比较有用的)

现在你可以在Java源代码中混入JavaScript了,这对开发原型很有有用,你也可以插入自己的脚本引擎。

3、Database

Mustang 将联合绑定 Java DB (Apache Derby). JDBC 4.0 增加了许多特性例如支持XML作为SQL数据类型,更好的集成Binary Large OBjects (BLOBs) 和 Character Large OBjects (CLOBs) .

4、More Desktop APIs

GUI 开发者可以有更多的技巧来使用 SwingWorker utility ,以帮助GUI应用中的多线程。, JTable 分类和过滤,以及添加splash闪屏。很显然,这对于主攻服务器开发的Java来说,并没有太多吸引力

5、Monitoring and Management.

绑定了不是很知名的 memory-heap 分析工具Jhat 来查看内核导出。

6、Compiler Access(这个很厉害)

compiler API提供编程访问javac,可以实现进程内编译,动态产生Java代码。

7、Pluggable Annotation

8、Desktop Deployment.

Swing拥有更好的 look-and-feel , LCD 文本呈现, 整体GUI性能的提升。Java应用程序可以和本地平台更好的集成,例如访问平台的系统托盘和开始菜单。Mustang将Java插件技术和Java Web Start引擎统一了起来。

9、Security

XML-数字签名(XML-DSIG) APIs 用于创建和操纵数字签名); 新的方法来访问本地平台的安全服务

10、The -ilities(很好的习惯)

质量,兼容性,稳定性。 80,000 test cases 和数百万行测试代码(只是测试活动中的一个方面). Mustang 的快照发布已经被下载15个月了,每一步中的Bug都被修复了,表现比J2SE 5还要好。

4. JAVA7

4.1 集合类的语法支持

原来的样子

List list =newArrayList();
list.add("item");
Stringitem = list.get(0);
Setset=newHashSet();
set.add("item");
Map map =newHashMap();
map.put("key",1);
intvalue = map.get("key");

现在的样子:(这些集合是不可变的...)

List list = ["item"];
Stringitem = list[0];
Setset= {"item"};
Map map = {"key":1};
intvalue = map["key"];

4.2 自动资源管理

Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,Sql classes等。这个新的语言特性允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。

以前的写法:

BufferedReader br =newBufferedReader(newFileReader(path));
try{
returnbr.readLine();} finally{
br.close();} 

现在的写法(不需要finally来释放资源了)

try (BufferedReaderbr = new BufferedReader(newFileReader(path)) {return br.readLine();
}

4.3 类型推断

以前的写法:

Map> anagrams =newHashMap>();

现在的写法

Map> anagrams =newHashMap<>();

4.4 数字字面量下划线支持

很长的数字可读性不好,在Java 7中可以使用下划线分隔长int以及long了。如:

intone_million = 1_000_000;

这样子还真看不惯。。。不过的确是可读性好了。

4.5 switch中使用string

String s ="test";
switch(s) {case"test":  System.out.println("test");
case"test1":  System.out.println("test1");
break;
default:  System.out.println("break");break;  }

4.6 新增一些取环境信息的工具方法

FileSystem.getJavaIoTempDir()// IO临时文件夹
FileSystem.getJavaHomeDir()// JRE的安装目录
FileSystem.getUserHomeDir()// 当前用户目录
FileSystem.getUserDir()// 启动java进程时所在的目录5 

5. java8

Java 8可谓是自Java 5以来最具革命性的版本了,她在语言、编译器、类库、开发工具以及Java虚拟机等方面都带来了不少新特性。

一、Lambda表达式

Lambda表达式可以说是Java 8最大的卖点,她将函数式编程引入了Java。Lambda允许把函数作为一个方法的参数,或者把代码看成数据。

一个Lambda表达式可以由用逗号分隔的参数列表、–>符号与函数体三部分表示。例如:

Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );

为了使现有函数更好的支持Lambda表达式,Java 8引入了函数式接口的概念。函数式接口就是只有一个方法的普通接口。java.lang.Runnable与java.util.concurrent.Callable是函数式接口最典型的例子。为此,Java 8增加了一种特殊的注解@FunctionalInterface

二、接口的默认方法与静态方法

我们可以在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。例如:

public interface DefaultFunctionInterface {default String defaultFunction() {return "default function";}}

我们还可以在接口中定义静态方法,使用static关键字,也可以提供实现。例如:

public interface StaticFunctionInterface {static String staticFunction() {return "static function";}}

接口的默认方法和静态方法的引入,其实可以认为引入了C++中抽象类的理念,以后我们再也不用在每个实现类中都写重复的代码了。

三、方法引用(含构造方法引用)

通常与Lambda表达式联合使用,可以直接引用已有Java类或对象的方法。一般有四种不同的方法引用:

构造器引用。语法是Class::new,或者更一般的Class< T >::new,要求构造器方法是没有参数;

静态方法引用。语法是Class::static_method,要求接受一个Class类型的参数;

特定类的任意对象方法引用。它的语法是Class::method。要求方法是没有参数的;

特定对象的方法引用,它的语法是instance::method。要求方法接受一个参数,与3不同的地方在于,3是在列表元素上分别调用方法,而4是在某个对象上调用方法,将列表元素作为参数传入;

四、重复注解

在Java 5中使用注解有一个限制,即相同的注解在同一位置只能声明一次。Java 8引入重复注解,这样相同的注解在同一地方也可以声明多次。重复注解机制本身需要用@Repeatable注解。Java 8在编译器层做了优化,相同注解会以集合的方式保存,因此底层的原理并没有变化。

五、扩展注解的支持(类型注解)

Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。

private @NotNull String name;

六、Optional

Java 8引入Optional类来防止空指针异常,Optional类最先是由Google的Guava项目引入的。Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。

七、Stream

Stream API是把真正的函数式编程风格引入到Java中。其实简单来说可以把Stream理解为MapReduce,当然Google的MapReduce的灵感也是来自函数式编程。她其实是一连串支持连续、并行聚集操作的元素。从语法上看,也很像linux的管道、或者链式编程,代码写起来简洁明了,非常酷帅!

八、Date/Time API (JSR 310)

Java 8新的Date-Time API (JSR 310)受Joda-Time的影响,提供了新的java.time包,可以用来替代 java.util.Date和java.util.Calendar。一般会用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration这些类,对于时间日期的改进还是非常不错的。

九、JavaScript引擎Nashorn

Nashorn允许在JVM上开发运行JavaScript应用,允许Java与JavaScript相互调用。

十、Base64

在Java 8中,Base64编码成为了Java类库的标准。Base64类同时还提供了对URL、MIME友好的编码器与解码器。

十一、 除了这十大特性,还有另外的一些新特性:

更好的类型推测机制:Java 8在类型推测方面有了很大的提高,这就使代码更整洁,不需要太多的强制类型转换了。

编译器优化:Java 8将方法的参数名加入了字节码中,这样在运行时通过反射就能获取到参数名,只需要在编译时使用-parameters参数。

并行(parallel)数组:支持对数组进行并行处理,主要是parallelSort()方法,它可以在多核机器上极大提高数组排序的速度。

并发(Concurrency):在新增Stream机制与Lambda的基础之上,加入了一些新方法来支持聚集操作。

Nashorn引擎jjs:基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。

类依赖分析器jdeps:可以显示Java类的包级别或类级别的依赖。

JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)。

6. java9

经过4次跳票,历经曲折的java 9 终于终于在2017年9月21日发布(距离上个版本足足3年半时间)java 9 提供了超过 150 项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。可以说 Java 9 是一个庞大的系统工程,完全做了一个整体改变。但本博文只介绍最重要的十大新特性

特性列表

  • 平台级modularity(原名:Jigsaw) 模块化系统
  • Java 的 REPL 工具: jShell 命令
  • 多版本兼容 jar 包(这个在处理向下兼容方面,非常好用)
  • 语法改进:接口的私有方法
  • 语法改进:UnderScore(下划线)使用的限制
  • 底层结构:String 存储结构变更(这个很重要)
  • 集合工厂方法:快速创建只读集合
  • 增强的 Stream API
  • 全新的 HTTP 客户端 API
  • 其它特性
  • 它的新特性来自于100于项JEP和40于项JSR

【java基础】快速掌握 Java5、Java6、Java7、Java8、Java9 的新特性!!!相关推荐

  1. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  2. Java基础 快速学习(一)

    注意:本系列博客是在作者已经有一年多的C++经验的基础上学习Java的个人总结,可能并不适合所有看到这篇博客的人. 一.数据类型 1.整数:byte,short,int,long  分别对应1,2,4 ...

  3. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  4. Java基础笔记-Java8及其他新特性

    第十六章 Java8及其他新特性 16.1 Java8新特性简介 16.2 lambda表达式和函数式接口 16.3 方法引用与构造器引用 16.4 StreamAPI的使用 16.5 Optiona ...

  5. Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java9 的新特性

    你好,我是看山. 本文收录在 <从小工到专家的 Java 进阶之旅> 系列专栏中. 从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证 ...

  6. JAVA8 十大新特性详解

    JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm java7和java6比较有什么不同 转载于:https://www.cnblogs.com/y ...

  7. Java8的一些新特性

    Java8的一些新特性 文章目录 Java8的一些新特性 1.函数式接口 2.Lambda表达式 2.1.介绍 2.2.案例 2.3.案例讲解 3.方法引用 3.1.介绍 3.2.案例 4.Strea ...

  8. Java基础学习总结(55)——java8新特性:stream

    java作为开发语言中的元老已经度过了很多年,最新的java8为我们带来了一些新特性,这些特性可以在以后的工作中为我们的开发提供更多的便捷,现在就让我们看看最新的函数式编程风格怎么在实际的开发中使用.

  9. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

最新文章

  1. LeNet5,AlexNet,MobileNet它们的前身你知道吗?
  2. Jenkins创建Maven项目及SSH部署
  3. 人不会一直寂寞,匿名社交也不会一直活跃?
  4. MySQL基础(一)介绍和配置
  5. html5学习新的知识总结(一)
  6. 小程序picker组件中的(普通选择器:mode = selector)
  7. hadoop rpc客户端初始化和调用过程详解
  8. Ubuntu 命令大全
  9. 风控扫盲:巴塞尔下的分池与量化风控岗
  10. Ubuntu设置目录的读写权限(Linux命令chmod 777 dirName)
  11. [译] iPhone X 网页设计
  12. C#反编译工具Reflector.exe教程
  13. 数据库操作(DML,DCL,DQL)
  14. android开发中Wifi功能总结
  15. 解决Server2008 R2 AD服务器 域组策略 XP桌面图标蓝底
  16. 大咖说开源|郑振宇:通过开源手段巩固基础软件供应链
  17. Android根据语言适配货币符,ios – 使用NSLocale根据国家/地区代码或国家/地区名称获取货币符号...
  18. html图片水平镜像翻转
  19. 电脑和手机连接同一个无线,电脑不能上网,手机能上网?
  20. 二维几何变换java代码_基于Batik的SVG应用: 关于几何变换

热门文章

  1. django的CBV与FBV介绍
  2. 【Linux端口大全】
  3. Java语言的十大特性
  4. 边缘检测(Edge Detection)和极值点检测(Blod Detection)相关知识
  5. 揭秘:拥有10倍开发效率的Android程序员都有哪些好习惯?
  6. 读书|优秀作家玄机《新品类战略》
  7. Redis 性能测试工具(redis-benchmark)
  8. STM32——图像显示
  9. 耳穴诊疗长期跟踪0524
  10. 10.29 元宇宙营销 | 新生态图景开拓中