java5、java6、java7、java8、java9新特性

  1. 介绍
    JAVA作为使用的主力语言,掌握下其历史发展也是有必要的。看看从JAVA5开始到现在的JAVA9有哪些变化。借此机会,也可以看看哪些特性我们是已经用到的,哪些是还没有用到的。
    我们在IDEA里面也可以看到language level里面的信息,这里也大致写了下各个版本JDK的新特性。图片
    简单概括下就是:
  • JAVA1.3:普通的原始的JAVA,基本语法相信大家都见过了
  • JAVA1.4:assert关键字
  • JAVA5:枚举类型、泛型、自动拆装箱
  • JAVA6: @Override注解
  • JAVA7: <>符号、ARM支持、支持多catch
  • JAVA8:Lamda表达式,类型注解等
  • JAVA9: 模块化、接口中的私有方法等
    下面我们更加详细的分析下各个版本有哪些新特性。
  1. JAVA5新特性

2.1 泛型 Generics

引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。Parameterized Type作为参数和返回值,Generic是vararg、annotation、enumeration、collection的基石。
泛型可以带来如下的好处总结如下:

  1. 类型安全:抛弃List、Map,使用List、Map给它们添加元素或者使用Iterator遍历时,编译期就可以给你检查出类型错误
  2. 方法参数和返回值加上了Type: 抛弃List、Map,使用List、Map
  3. 不需要类型转换:List list=new ArrayList();
  4. 类型通配符“?”: 假设一个打印List中元素的方法printList,我们希望任何类型T的List都可以被打印

2.2 枚举类型

引入了枚举类型

2.3 自动装箱拆箱(自动类型包装和解包)autoboxing & unboxing

简单的说是类型自动转换。自动装包:基本类型自动转为包装类(int ——Integer)自动拆包:包装类自动转为基本类型(Integer——int)

2.4 可变参数varargs(varargs number of arguments)

参数类型相同时,把重载函数合并到一起了。如:

public void test(object... objs){
    for(Object obj:objs){
        System.out.println(obj);
    }
}

2.5 Annotations(重要) 它是java中的metadata(注释)

注解在JAVA5中就引入了。这是非常重要的特性。现在注解的应用已经随处可见。不过JAVA5的注解还不成熟,没法自定义注解。

2.6 新的迭代语句

for(int n:numbers){
//process
}

2.7 静态导入(import static )

导入静态对象,可以省略些代码。不过这个也不常用。

import static java.lang.System.out;//导入java.lang包下的System类的静态方法out;
public class HelloWorld{
    public static void main(String[] args){
        out.print("Hello World!");//既是在这里不用再写成System.out.println("Hello World!")了,因为已经导入了这个静态方法out。
    }
}

2.8 新的格式化方法(java.util.Formatter)

formatter.format("Remaining account balance: $%.2f", balance);

2.9 新的线程模型和并发库Thread Framework(重要)

最主要的就是引入了java.util.concurrent包,这个都是需要重点掌握的。
HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意BlockingQueue、Callable、Executor、Semaphore
3. JAVA6

JAVA6当中

3.1 Web Services

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

3.2 Scripting

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

3.3 JDBC4.0

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

3.4 UI优化

  1. GUI 开发者可以有更多的技巧来使用 SwingWorker utility ,以帮助GUI应用中的多线程。, JTable 分类和过滤,以及添加splash闪屏。
  2. Swing拥有更好的 look-and-feel , LCD 文本呈现, 整体GUI性能的提升。Java应用程序可以和本地平台更好的集成,例如访问平台的系统托盘和开始菜单。Mustang将Java插件技术和Java Web Start引擎统一了起来。

3.5 监控管理增强

添加更多的诊断信息,绑定了不是很知名的 memory-heap 分析工具Jhat 来查看内核导出。

3.6 编译API

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

3.7 自定义注解

Java tool和framework 提供商可以定义自己的 annotations ,并且内核支持自定义annotation的插件和执行处理器

3.8 安全性

XML-数字签名(XML-DSIG) APIs 用于创建和操纵数字签名); 新的方法来访问本地平台的安全服务,例如本地Microsoft Windows for secure authentication and communicationnative 的Public Key Infrastructure (PKI) 和 cryptographic services, Java Generic Security Services (Java GSS) 和 Kerberos services for authentication, 以及访问 LDAP servers 来认证用户.
4. JAVA7

4.1 集合类的语法支持

原来的样子

List<String> list = new ArrayList<String>();
         list.add("item");
         String item = list.get(0);
   
         Set<String> set = new HashSet<String>();
         set.add("item");
         Map<String, Integer> map = new HashMap<String, Integer>();
         map.put("key", 1);
         int value = map.get("key");

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

List<String> list = ["item"];
         String item = list[0];
         
         Set<String> set = {"item"};
         
         Map<String, Integer> map = {"key" : 1};
         int value = map["key"];

4.2 自动资源管理

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

BufferedReader br = new BufferedReader(new FileReader(path));
          try {
          return br.readLine();
                } finally {
                    br.close();
          }

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

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

4.3 类型推断

以前的写法:

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

现在的写法

 Map<String, List<String>> anagrams = new HashMap<>();

4.4 数字字面量下划线支持

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

int one_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 新增一些取环境信息的工具方法

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

5.1 lambda表达式

提供了lambda表达式,增加了很多内置函数式接口。尤其是其中的stream接口提供了

5.2 注解改进

例如支持多重注解,还有新的target等

5.3 更加详细资料

JAVA8的新内容非常多,都有相关的书来说明。需要更多了解可以看下我的另外一篇文章:java8的新特性以及用法简介
6. java9

根据JAVA 9 new features这篇幻灯片博客来总结。

6.1 REPL: jshell

类似效果:图片
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传6.2 javadoc改进
使用了H5的javadoc,优化了搜索功能:图片
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传6.3 编译改进
改变了Javac和Java用法,以便使用模块:

javac -mp modulepath ...
java -mp modulepath -m modulename/moduleclass

javac -release选项支持交叉编译图片
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传6.4 语言级别上的优化图片
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传主要涉及:

  1. 进程控制
  2. 集合改进
  3. 改进@Deprecated注解
  4. 流处理
  5. StacjWalker
  6. Package name
6.4.1 进程控制

能够检查和检测以及杀死Process。

import java.io.IOException;
import static java.lang.System.out;
public class ControlProcess {
    /**
     * 启动一个进程process, 监听进程中断,检查进程细节,杀死进程
     */
    public static void main(String[] args) throws IOException, InterruptedException {
        Process sleeper = Runtime.getRuntime().exec("sleep 1h");
        // 获得 自己的或启动的进行的PIDs 
        out.println("Your pid is " + ProcessHandle.current().getPid());
        out.println("Started process is " + sleeper.getPid());
        ProcessHandle sleeperHandle = ProcessHandle.of(sleeper.getPid())   // Optional
                .orElseThrow(IllegalStateException::new);
        // 在退出进程做些善后
        sleeperHandle.onExit().thenRun(                                    // CompletableFuture
                () -> out.println("Sleeper exited")
        );
        // Get info on process
        out.printf("[%d] %s - %s/n",
                   sleeperHandle.getPid(),
                   sleeperHandle.info().user().orElse("unknown"),
                   sleeperHandle.info().commandLine().orElse("none"));
        // Kill a process
        sleeperHandle.destroy();
        // Give exit handler a chance to see the sleeper onExit()
        Thread.sleep(99);
    }
}

6.4.2 新的Colection——不可变集合

public class ImmutableCollections {
    /**
     * 快速创建一个不可变集合
     * <b>Note:</b> They do not accept {@code null} or duplicate entries (Set/Map)
     */
    public static void main(String args[]) {
        List<Integer> listOfNumbers = List.of(1, 2, 3, 4, 5/*, null*/);
        out.println(listOfNumbers);
        Set<Integer> setOfNumbers = Set.of(1, 2, 3, 4, 5/*, 1*/);
        out.println(setOfNumbers);
        Map<String, String> mapOfString = Map.of("key1", "value1", "key2", "value2");
        out.println(mapOfString);
        Map<String, String> moreMapOfString = Map.ofEntries(
                Map.entry("key1", "value1"),
                Map.entry("key2", "value2")/*,
                Map.entry("key1", "value3")*/
        );
        out.println(moreMapOfString);
    }
}

6.4.3 增强的Deprecated

@Deprecated(since ="1.5", forRemoval = true)

6.4.4 Stream

提供了新的inputStream方法,可以直接重定向输入流到一个输出流上

// All bytes from an InputStream at once
byte[] result = new ByteArrayInputStream(buf)
    .readAllBytes();
// 直接重定向InputStream 到 OutputStream
new ByteArrayInputStream(buf)
    .transferTo(System.out);

6.4.5 StackWalekr类

更加详细可以参考JAVA9 API
这个类,主要是方便对实例本身做一些类似filter、collect的操作。

public class StackWalkerExample {
    /**
     * Easily traverse stackframes.
     */
    public static void main(String[] args) {
        walkAndFilterStackframe().forEach(out::println);
    }
    // return class/method only for our classes.
    private static List<String> walkAndFilterStackframe() {
        return StackWalker.getInstance().walk(s ->
                s.map( frame -> frame.getClassName()+"/"+frame.getMethodName() )
                        .filter(name -> name.startsWith("de.excellent"))
                        .limit(10)
                        .collect(Collectors.toList())
            );
    }
}
  1. http/2的支持

关于HTTP2的优点,可以参考我的文章:HTTP2的优点

/**
 * HTTP API 提供异步和同步功能,在异步模型
 * 任务会在线程threads (ExecutorService)执行
 */
public static void main(String[] args) throws Exception {
  HttpClient.getDefault()
    .request(URI.create("https://www.exxcellent.de"))
    .GET()
    .responseAsync() // CompletableFuture :D
    .thenAccept(httpResponse ->
        out.println(httpResponse.body(HttpResponse.asString()))
    );
  Thread.sleep(999); // Give worker thread some time.
}
  1. JIGSAW

图片
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传要在JDK里面内置模块化。这个就要提起OSGI了。这个不是三言两语能详细说清楚,为啥这个模块化这么重要的。简单来说,无论是JIGSAW还是OSGI都是为了对各模块、包的依赖之间做好隔离。这样还可以解决“JAR/Classpath地狱”的问题,Jigsaw项目的一个关键特性就是依赖管理。这个项目一旦大气来,自然而然有这样的模块、包隔离需求。虽然语言层面有了private这样的关键字,但是还是太弱了。
不过我好奇的是JIGSAW是否赶得上OSGI,毕竟人家这么多年了。还有和MAVEN的关系。按照网友的解释:osgi更偏重运行时多版本隔离,maven只到jar,jigsaw编译管理的到代码级别,运行时没有多版本隔离
关于maven和jigsaw在管理依赖上的区别,我觉得应该是maven层次更高点,jigsaw管理代码级别较低层次的依赖。未来应该是两者共存吧。
还有一点就是OSGI太复杂。。用过的大佬最后都放弃了。不过其思路值得学习。
关于这个问题,可以看下以下文章了解下:

  1. 如何理解Java 9中提到的模块化?它与OSGi是什么关系?
  2. Java 9终于要包含Jigsaw项目了
    下面来简单看下JIGSAW如何生效的:可以看到这里定义了module,module当中引入了其他类的依赖。更像是替换了原来的import图片
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传连编译时候的方法都变了:图片
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传然后使用ServiceLoader来读取modules
public abstract class BillingService {
  public static BillingService getInstance() {
    // Java SPI to find the instance
    ServiceLoader<BillingServiceProvider> sl =
       ServiceLoader.load(BillingServiceProvider.class);
    // Fetch first provider implementation
    Iterator<BillingServiceProvider> it = sl.iterator();
    return it.next().buildBillingService();
  }
  public abstract String takeMoney();
}

再看另外个例子:

  1. 先定义module
module anothermodule {
  exports de.exxcellent.anothermodule;
  requires de.exxcellent.java9;
  // Provide Service instance (SPI with Jigsaw modules)
  provides de.exxcellent.java9.jigsaw.spi.BillingServiceProvider
  with de.exxcellent.anothermodule.spi.MastercardBillingServiceProvider;
}
  1. 使用module
$ mkdir -p target/module/de.exxcellent.java9
$ mkdir -p target/module/anothermodule
$ javac $(find playground/src/main/java -name "*.java") /
        -d target/module/de.exxcellent.java9
$ javac $(find playground-dependent/src/main/java -name "*.java")/
        -d target/module/anothermodule /
        -modulepath target/module
$ java  -modulepath target/module /
        -m anothermodule/de.exxcellent.anothermodule.TestJigsawSPI
Mastercard billed the money!
  1. 工具

#1.列出内建的module 
java –listmods
#2. 找到对应jar的所有依赖
jdeps –jdkinternals app.jar
  1. 其他改进

10.1 性能上

提高了竞争锁的性能隔离代码缓存更智能的Java编译

10.2 http2 client

implements HTTP/2 and WebSocket
参考资料:

  1. java5、java6、java7、java8的新特性
  2. Java 7 的7个新特性
    java/_basic

学习资源

如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你

**读者福利 |** CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 **(安全链接,放心点击)**![](https://i-blog.csdnimg.cn/img_convert/a6502ab41b1a86132b9ebb5aab9a2cdc.jpeg)

知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。

1、知识库价值

深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。

广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。

实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。

2、 部分核心内容展示

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

在这里插入图片描述

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。

1、网络安全意识

img

2、Linux操作系统

img

3、WEB架构基础与HTTP协议

img

4、Web渗透测试

img

5、渗透测试案例分享

img

6、渗透测试实战技巧

图片

7、攻防对战实战

图片

8、CTF之MISC实战讲解

图片

3、适合学习的人群

一、基础适配人群

  1. 零基础转型者‌:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链‌;
  2. 开发/运维人员‌:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展‌或者转行就业;
  3. 应届毕业生‌:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期‌;

二、能力提升适配

1、‌技术爱好者‌:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者‌;

2、安全从业者‌:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力‌;

3、‌合规需求者‌:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员‌;

因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

一、基础适配人群

  1. 零基础转型者‌:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链‌;
  2. 开发/运维人员‌:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展‌或者转行就业;
  3. 应届毕业生‌:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期‌;

二、能力提升适配

1、‌技术爱好者‌:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者‌;

2、安全从业者‌:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力‌;

3、‌合规需求者‌:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员‌;

因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

img

更多推荐