JDK1.5、1.7、1.8新特性

JDK1.5
静态导入
1. import:表示去找哪一个类/去哪一个包下找哪些被使用到的类。
在Java语言中,java.lang包下的API,不需要导入,直接可以使用。
导入包的语法: import 被引入类的全限定名;
import 包 . *
2. 静态导入 : 如果我们需要使用某一个类中的静态成员(字段/方法/内部类),此时可以使用静态导入。
import static 被引入类的全限定名 . 静态的成员;
import static 被引入类的全限定名 . *;
3. 静态引入,属于语法糖,仅仅是为了方便程序员操作简单。但是在开发中,不推荐使用静态引用,因为都不知道静态成员到底来源于哪一个类。

可变参数
1. 为了解决同一种类型的参数个数不确定的问题,可以使用可变参数。
2. 方法的可变参数,其本质是数组。
如:getTotalPrice(CartItem … items){ … };
编译之后:
getTotalPrice(CartItem[ ] items){ … };
3. 方法的可变参数也是一个语法糖。
4. 可变参数必须作为方法的最后一个参数而存在,避免参数的歧义。

for-each
1. 增强for循环:可以迭代数组和集合,取出其中的元素。
2. 语法:
for(元素类型 变量:数组/iterable对象){
//TODO
}
3. For-each
针对于数组来说,底层依然使用的for循环迭代数组,使用数组的索引来获取每一个元素。
针对于Iterable对象来说:底层依然使用迭代器Iterator。
4. For-each也是Java5提供的语法糖。
5. For-each和Iterator的选择:
如果仅仅只是迭代出集合中的元素,最简单的方式:for-each
如果在迭代集合元素的时候,需要做删除的操作,只能使用Iterator的remove方法来做删除。

自动装箱和拆箱
1. 装箱:把基本数据类型包装成对应的包装类类型。Int–>Integer
拆箱:把包装类对象转换为对应的基本类型的变量。Iteger–>int
2. 在Java5之前,只能手动完成装箱/拆箱:
Integer num1 = Integer.valueOf(123);
Int num2 = num1.intValue();
从Java5开始,支持自动装箱和拆箱。可以直接把基本类型值赋给对应的包装类对象/把包装类对象直接赋给对应的基本类型变量。
3. 自动装箱和拆箱也是语法糖。
4. 扩展:(不是JDK1.5的新特性)
在包装类中有一个享元设计(缓存):把常用的数存到常量池中。每次使用的时候从常量池去获取,没必要重新创建。(提高效率)
Byte、Short、Integer、Long在[-128,127],共享同一个对象
Character:在[0,127]之间共享同一个对象。

泛型(Generic Type)
1. 为什么需要泛型:
① 保证集合中元素的安全。(TreeSet存储的元素,必须是同一种数据类型的)
② 避免强制类型转换。
2. 语法:
Set set = new TreeSet( );
Java7支持菱形语法:Set set = new TreeSet<>( );
3. 泛型的擦除:在编译之后,泛型就消失了。所以泛型也是一种语法糖。
注意:泛型没有继承的概念:List list = new List;// 错误的
4. 堆污染:在Java中,当一个可变泛型参数指向一个无泛型参数时,堆污染就有可能发生。
① 使用泛型
② 使用可变参数
堆污染有可能导致更严重的后果:ClassCastException

枚举
1. 枚举:是一种特殊的类,用于表示多种固定的状态。
2. 语法:
public enum 名字{
对象1,对象2;
}
3. 枚举类底层继承了java.lang.Enum类。
4. 枚举类的特点:
① 枚举类很安全,不能被实例化对象,甚至使用反射也不能创建对象。
② 可以使用name()和oridnal()方法用于返回枚举对象的实例名称和序数(从0开始)
③ 所有的枚举类都有静态方法values(),可以获取当前枚举类中所有的实例。
④ 所有的枚举都有静态方法valueOf(),可以把String类型的字符串,转换为枚举类型的对象。
⑤ 枚举常量必须最先声明,并且常量之间用逗号隔开,最后一个常量后是分号。
⑥ 枚举类常量之后若使用 { },则表示当前枚举类的匿名内部类。
5. switch(语句){ }:
switch支持的类型:byte、short、int、char(switch支持int类型)。
因为Java5开始有自动拆箱,所以也支持Byte,Short,Character,Integer。
switch也支持枚举类型:枚举对象的ordinal方法返回的就是int类型的序数。

注解
1. JDK1.5,Java开始对元数据的支持,也就是Annotation。
2. 所有的Annotation都是java.lang.annotation.Annotation接口的子接口,所以说注解是一种特殊的接口。
3. JDK自带的注解
@Override 限定覆写父类的方法
@Deprecated 标记已过时,不推荐使用。在JDK1.5之前,使用文档注释来标记过时。
@SuppressWarnings 抑制编译器发出的警告
@SuppressWarnigns(value=“all”)
@SafeVarags 抑制堆污染警告(JDK1.7开始出现的),该注解仅仅是抑制住编译器不要报警告,但是存在的风险依然存在。

JDK1.7

  1. switch可以接受String类型。
    switch支持的是int类型。
    ① byte、short、char可以自动提升为int类型;以及他们对应的包装类(JDK1.5有了自动装箱和拆箱)
    ② 枚举(ordinal方法返回的是int类型的序数)
    ③ Sting(hashCode方法,返回的是int类型)
  2. 二进制数字表达式
    ①增加了二进制字面量的表示
    ②在数字中可以添加"_"分隔符
  3. 菱形语法:使用泛型的时候增加了类型推断机制。
  4. 自动资源关闭:增加了 try-with-resources语句,可以确保在该语句执行完毕之后关闭每个资源.不需要显示调用close()方法
    例:
    try( InputStream fis = new FileInputStream(“input.txt”); ){
    while(fis.read() != null){
    syso(fis.read);
    }
    }catch(Exception e){
    e.printStackTrace();
    }
  5. 捕获组:同时捕获多个异常处理。异常之间使用 |
  6. Objects类(提供了一下方法来操作对象,这些工具方法大多是空指针安全的);
    ThreadLocalRandom类(随机数生成器,解决了Random类在多线程下多个线程竞争内部唯一的原子性种子变量,而导致大量线程自旋重试的不足。)。
  7. 堆污染和@SafeVarargs,抑制堆污染警告的标签。
  8. 增加了fork/join框架用来增强对处理多核并行计算的支持.
    fork把一个大任务切分为若干个小任务,join把合并这些子任务的执行结果.

JDK1.8

  1. 增加了对Lambda表达式的支持
    基本语法: (parameters) -> expression 或 (parameters) -> {statements;}
    例: ArrayList(1, 7, 2) . forEach(i -> System.out.println(i)); // i的类型由编译器推测出来

    Java8之前使用匿名函数的方法来代替Lambda表达式,如:
    Arrays.sort(people,new Comaparator(){
    @Override
    public int compare(Person a,Person b){
    Return a.getAge() - b.getAge();
    }
    });
    采用Lambda表达式之后:
    Arrays.sort(people,(Person a,Person b) -> a.getAge() - b.getAge());

    Arryas.sort(people,(a,b) -> a.getAge() - b.getAge());

  2. 接口增加了方法的默认实现和静态方法.通过使用default关键字可以给接口中的方法添加默认实现.
    Interface Inter8{
    void f();
    default void g(){
    syso(“this is default method in interface”);
    }
    static void h(){
    syso(“this is static method in interface”);
    }
    }

  3. 方法引用:指的是可以直接引用Java类或对象的方法,可以被看成是一种更加简洁易懂的Lambda表达式.
    使用方法引用后,上述排序代码变为:
    Arrays.sort(people,Comparator.comparing(Person::getAge));

    方法引用有4种方式:
    ①引用构造方法: ClassName::new
    ②引用类静态方法: ClassName::methodName
    ③引用特定类的任意对象方法: ClassName::methodName
    ④引用某个对象的方法: instanceName::methodName

  4. 注解(Annotation)
    JDK1.5中引入了注解机制,但是有一个限制:相同的注解在同一位置只能声明一次.
    JDK1.8引入了重复注解机制,相同的注解在同一个地方可以声明多次.
    备注:java内置了三种注解方式:
    @Override – 表示当前方法时覆盖父类的方法
    @Deprecated – 表示当前元素是不赞成使用的
    @SuppressWarnings – 表示关闭一些不当的编译器警告信息
    注意:它们都定义在java.lang包中

  5. 类型推测
    例:
    class List{
    static List test01(){ … };
    static List test02(Z head,List tail){ … };
    E head(){ … }
    }
    List list = List.test01();
    List.test02(5,List.test01()); // 通过方法的第一个参数来推测泛型的参数

  6. 参数名字
    JDK1.8通过在变异的时候增加 -parameters选项,以及增加反射API与Parameters.getName()方法实现了获取方法参数名的功能

  7. 新增Optional类
    JDK1.8引入了Optional类来处理空指针的情况,从而增强代码的可读性.

  8. 新增了Stream类
    stream是流水线操作,内部迭代,对集合的操作更简单

  9. 日期新特性
    JDK1.8之前,处理日期相关的类主要有如下三个:
    ①Calendar:实现日期和时间字段之间转换,它的属性是可变的,线程不安全
    ②DataFormat:格式化和分析日期字符串
    ③Date:用来承载日期和时间信息,属性可变,线程不安全
    JDK1.8新增了API,java.time主要包含了处理日期、时间、日期/时间、时区、时刻和时钟等操作

  10. 增加了调用JavaScript的引擎.
    JDK1.8增加API使得可以通过java程序来调用JavaScript代码
    javax.script.ScriptEngineManager

  11. Base64.
    Base64编码是一种常见的字符编码,可用来作为电子邮件或web service附件的传输编码.

  12. 并行数组 – JDK1.8增加了对数组的并行处理的方法(parallerXxx)

猜你喜欢

转载自blog.csdn.net/qq_41850601/article/details/85528441