zoukankan      html  css  js  c++  java
  • Jdk1.7 与 jdk1.8的区别,最新的特征有哪些(美团,360,京东面试题目)

    在jdk7的新特性方面主要有下面几方面的增强:

    1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。

        所有整数int、short、long、byte都可以用二进制表示:

    byte aByte = (byte) 0b00100001;

    延伸阅读:java的8种基础类型 

    一、基础类型

    Java 是一种强类型语言 。 这就意味着必须为每一个变量声明一种类型 : 在 Java 中,一共有 8种基本类型 ( primitive type ) , 其中有 4 种整型 、 2 种浮点类型 、 1 种用于表示 Unicode 编码的字符单元的字符类型 char 和1 种用于表示真值的 boolean 类型

    类型存储需求取值范围默认值
    byte 1字节 -128 ~ 127 0
    short 2字节 -32768 ~ 32767 0
    int 4字节 -2^31 ~ 2^31 - 1(正好超过20亿) 0
    long 8字节 -2^63 ~ 2^63 - 1 0L
    float 4字节 大约 ± 3.402 823 47 E + 38 F ( 有效位数为 6 ~ 7 位 ) +0.0F
    double 8字节 大约 ± 1.797 693 134 862 315 70 E + 308 ( 有效位数为 15 位 ) +0.0D
    char 2字节 使用unicode编码,最大65535 'u0000'
    boolean 取决于虚拟机,1字节或4字节。 true或false。所占字节大小参考:https://www.jianshu.com/p/2f663dc820d0 false

    尽管它们的默认值看起来不一样,但在内存中都是0。

    二、Java语言中的boolean类型

    在Java语言规范中,boolean类型的值只有两种可能,它们分别用true和false来表示,显然这两种符号是不能被虚拟机直接使用的。

    Java虚拟机规范中,boolean类型则被映射成int类型(4字节)。Java 代码中的逻辑运算以及条件跳转,都是用整数相关的字节码来实现得。具体来说,就是

    true -> 1

    false -> 0

    这个编码规则约束了Java字节码的具体实现。

    举个例子,对于存储boolean数组(1字节)的字节码,Java虚拟机需保证直接存入的值是1或0。

    1.2 Switch语句支持String类型。

    1.3 Try-with-resource语句:

      参考博客:try-with-resources语句 

    try-with-resources语句是一种声明了一种或多种资源的try语句。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的资源在语句结束的时候都会被关闭。任何实现了java.lang.AutoCloseable接口的对象,和实现了java.io.Closeable接口的对象,都可以当做资源使用。

     1.4 Catch多个异常:

    在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常。如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度。下面用一个例子来理解。

    catch(IOException | SQLException | Exception ex){
         logger.error(ex);
         throw new MyException(ex.getMessage());
    }

    1.5 数字类型的下划线表示 更友好的表示方式,不过要注意下划线添加的一些标准。

    字面常量数字里加下划线的规则:下划线只能在数字之间,在数字的开始或结束一定不能使用下划线。

    public class UsingUnderscoreInNumericLiterals {
        public static void main(String[] args) {
            int int_num = 1_00_00_000;
            System.out.println("int num:" + int_num);
    
            long long_num = 1_00_00_000;
            System.out.println("long num:" + long_num);
    
            float float_num = 2.10_001F;
            System.out.println("float num:" + float_num);
    
            double double_num = 2.10_12_001;
            System.out.println("double num:" + double_num);
        }
    }

    1.6 泛型实例的创建可以通过类型推断来简化 可以去掉后面new部分的泛型类型,只用<>就可以了。

    1.7 并发工具增强: fork-join框架最大的增强,充分利用多核特性,将大问题分解成各个子问题,由多个cpu可以同时解决多个子问题,最后合并结果,继承RecursiveTask,实现compute方法,然后调用fork计算,最后用join合并结果。

    参考自己写的例子:Java7 Fork-Join 框架:任务切分,并行处理

    JDK1.8的新特性:

     
     2.1 接口的默认和静态方法:

    Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。

    public interface JDK8Interface {  
      
        // static修饰符定义静态方法  
        static void staticMethod() {  
            System.out.println("接口中的静态方法");  
        }  
      
        // default修饰符定义默认方法  
        default void defaultMethod() {  
            System.out.println("接口中的默认方法");  
        }  
    }  

    2.2 Lambda 表达式:(例如: (x, y) -> { return x + y; } ;λ表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。)

    参考博客: lambda表达式详解

    函数式接口和Lambda表达式深入理解

    在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

    Collections.sort(names, (String a, String b) -> {
          return b.compareTo(a);
    });

    2.3 方法与构造函数引用:

    Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:

    converter = something::startsWith;
    String converted = converter.convert("Java");
    System.out.println(converted);

    2.4 函数式接口:

    所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。

    2.5 Annotation 注解:支持多重注解:

    很多时候一个注解需要在某一位置多次使用。

    @YourAnnotation
    @YourAnnotation
    public void test(){
        //TODO
    }

    2.6 新的日期时间 API:

    Java 8新的Date-Time API (JSR 310)受Joda-Time的影响,提供了新的java.time包,可以用来替代

    java.util.Date和java.util.Calendar。一般会用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration这些类,对于时间日期的改进还是非常不错的。

    2.7 Base64编码:

    Base64编码是一种常见的字符编码,可以用来作为电子邮件或Web Service附件的传输编码。

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

    2.8 JavaScript引擎Nashorn:

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

    2.9 Stream的使用:

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

    2.10 Optional:

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

    2.11 扩展注解的支持:

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

    2.12 并行(parallel)数组:

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

    2.13 编译器优化:

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

    新的Java1.8对IO做了升级:

    关于IO/NIO 新IO的对比,请参考:Java NIO:IO与NIO的区别 -阿里面试题

    还对CurrentHashMap做了升级,请参考:ConcurrentHashMap原理分析(1.7与1.8)


    参考:JDK1.7和JDK1.8新特性

    参考:jdk 1.8 和1.7有什么区别

    参考:jdk1.7和jdk1.8区别

  • 相关阅读:
    男人要知道的40条忠告
    利用xtraBackup实现不停master服务做主从同步
    MY SQL 知识
    房价与阶级
    SQL Server数据库级别触发器
    mysql 5.7开启并行复制
    SQL Server 查出未提交事务(长事务)SQL
    开源数据集
    telnet
    Zend Studio使用综述
  • 原文地址:https://www.cnblogs.com/aspirant/p/8617201.html
Copyright © 2011-2022 走看看