• 花旗面试


    jdk1.8新特性

    速度更快 – 红黑树
    代码更少 – Lambda
    强大的Stream API – Stream
    便于并行 – Parallel
    最大化减少空指针异常 – Optional

    1:HashMap

    有人会在问你HashMap的时候会问你JDK1.7和1.8有什么变化;
    主要还是HashMap中链长度大于8时采取红黑树的结构存储。(1.7的时候是链表结构)
    红黑树,除了添加,效率高于链表结构。

    2:ConcurrentHashMap

    Jdk1.7时隔壁级别CocnurrentLevel(锁分段机制)默认为16。

    JDK1.8采取了CAS算法
    CAS原理主要涉及的有:锁机制、CAS 操作;具体可以参考CAS原理分析

    Jdk1.8没有永久区,取而代之的是MetaSpace元空间,用的是物理内存。
    (当你跟面试官聊到JVM的时候可以聊到1.8后用就去是被取代了,这回事一个加分项)

    3、Lambda表达式

    1、Lambda表达式的基础语法:Java8引入了一个新的操作符“->”,该操作符成为箭头操作符或者Lambda操作符,箭头操作符将Lambda表达式拆分成两部分

    左侧:Lambda表达式的参数列表
    右侧:Lambda表达式中所需执行的功能,即Lambda体。

    语法格式一:无参数,无返回值

    Runnable r2 = () -> System.out.println("hello lambda");
    r2.run();

    语法格式二:有一个参数,并且无返回值

    (x) -> System.out.print(x);

    语法格式三:若只有一个参数,小括号可以省略不写

    x -> System.out.print(x);

    语法格式四:有两个以上的参数,有返回值,并且Lambda体中有多条语句

    Comparator<Integer> c1 = (x, y) -> {
    System.out.print(Integer.compare(x, y)+"函数式接口");
    return Integer.compare(x, y);
    } ;
    c1.compare(1, 2);


    语法格式五:若Lambda体中只有一条语句,return和大括号都可以省略不写

    Comparator c1 = (x,y) -> Integer.compare(x,y);

    语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文进行类型推断出数据类型,既“类型推断”。(Integer x,Integer y) -> Integre.compare(x,y);结:
    左右遇一括号省,左侧推断类型省, 能省则省。

    4、并行流

    Fork/Join框架:
    在必要的情况下,将一个大任务进行必要的拆分Fork成若干个小任务,再将小任务的运算结果进行Join汇总。

    Fork/Join框架和传统线程池的区别:
    采用“工作窃取”模式(Working-stealing),即当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。

    相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态,而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行,那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行,这种方式减少了线程等待的时间,提高了性能。

    并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
    Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。Stream API 可以声明性地通过parallel() 与sequential() 在并行流与顺序流之间进行切换。
    自己实现的ForkJoin

    /**
    * JDK8的并行流实现。
    */
    @Test
    public void test3(){
    Instant start = Instant.now();

    long sum = LongStream.rangeClosed(0, 1000000000L)
    .parallel()//并行流
    //.sequential()//串行流
    .reduce(0, Long::sum);

    Instant end = Instant.now();

    System.out.println(Duration.between(start,end).toMillis());
    }
    //并行流将会充分使用多核的优势,多线程并行执行,基数越大,效果越明显。其底层还是Fork/Join框架。只不过SUN公司优化的更好,比自己实现更高效


    5、Optional类

    Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常。

    常用方法:
    - Optional.of(T t) : 创建一个Optional 实例
    - Optional.empty() : 创建一个空的Optional 实例
    - Optional.ofNullable(T t):若t 不为null,创建Optional 实例,否则创建空实例
    - isPresent() : 判断是否包含值
    - orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
    - orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回s 获取的值
    - map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
    - flatMap(Function mapper):与map 类似,要求返回值必须是Optional

    版权声明:本文为CSDN博主「有糖哥」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/hequan199411/article/details/81713827

    jvm

    bean生命周期

    spring注解

    junit关键字

    如何创建新对象

    list,set,map区别

    抽象类,接口区别

    包装器,封箱,拆箱

     

  • 相关阅读:
    XML案例
    4.6Java数组的遍历
    4.3Java多态(polymorphism)
    XML文档的标准
    4.6Java数组的定义
    4.6Java数组初始化的方式
    XML介绍
    4.6Java对象转型(casting)
    HelloWorld之MyBatis
    Hibernate查询方法比较
  • 原文地址:https://www.cnblogs.com/wangxue1314/p/11972250.html
Copyright © 2020-2023  润新知