面试准备:Java新特性详解

2023-11-01


更多资料,参考 java8 新特性精心整理(全)

Java语言新特性

1.Lambda表达式和函数式接口

比如:

@FunctionalInterface
public interface Comparator<T> {
...
}
# main
Integer[] arr=new Integer[4];
Arrays.sort(arr,(o1,o2)->o2-o1);//Comparator

又比如:

# main
Arrays.asList(1,2,3,4).forEach(System.out::println);//Consumer

不做赘述,参考探索Java8——Lambda表达式

2.接口的默认方法和静态方法

这个之前也介绍过了,也就是jdk8之后接口能够使用default和static方法:

interface Defaulable{
    default String defaultMethod() {
        return "Default implementation";
    }
}
interface DefaulableFactory{
    static Defaulable staticMethod(Supplier<Defaulable> supplier){
        return supplier.get();
    }
}
class Main implements Defaulable{

    public static void main(String[] args) {
        Defaulable defaulable =DefaulableFactory.staticMethod(Main::new);
        System.out.println(defaulable.defaultMethod());
    }
}

当然也可以Override重写:

class Main implements Defaulable{
    @Override
    public String defaultMethod() {
        return null;
    }
    ...
}

3.方法引用

java8方法引用有四种形式:

  • 构造器引用        :   Class :: new
  • 静态方法引用       :   Class :: staticMethodName
  • 类的任意对象的实例方法引用:   Class :: instanceMethodName
  • 特定对象的实例方法引用  :   object :: instanceMethodName

第一种方法引用的类型是构造器引用,语法是Class::new,或者更一般的形式:Class<T>::new。注意:这个构造器没有参数。

class Main {
    public static Main mainFactory(Supplier<Main> supplier){
        return supplier.get();
    }

    public static void main(String[] args) {
        Supplier<Main> supplier=Main::new;
        //等价于  Supplier<Main> supplier=()->new Main();
        Main m=Main.mainFactory(supplier);
    }
}

第二种方法引用的类型是静态或者普通方法引用,语法是Class::staticMethodName

public class Test {
    public static void main(String[] args) {
        //lambda表达式使用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> Test.println(s));
        //静态方法引用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(Test::println);
    }

    public static void println(String s) {
        System.out.println(s);
    }
}

第三种方法引用的类型是某个类的成员方法的引用,语法是Class::instanceMethodName

# main
Arrays.sort(strs, String::compareToIgnoreCase);//Comparator
 
  @FunctionalInterface
  public interface Comparator<T> {
  	  //compare是两个参数,也就是比实际调用的compareToIgnoreCase()多出一个参数。
  	  //第一个参数T o1传的是对象,作用另一个例子会讲到。
      int compare(T o1, T o2);
  }
 
# 而String的compareToIgnoreCase()函数如下:
public int compareToIgnoreCase(String str) {
	//这里实际上使用的是第二个参数T o2
	return CASE_INSENSITIVE_ORDER.compare(this, str);
}

换个例子能更好的理解:

public class Student
{
    
    private String name;
    
    private Integer score;
    
    public void setNameAndScore(String name, Integer score)
    {
        this.name = name;
        this.score = score;
        System.out.println("Student "+  name +"'s score is " + score);
    }
     
    public static void main(String[] args)
    {
        /*lambda表达式的用法:
        TestInterface testInterface = (student, name, score) -> student.setNameAndScore(name, score);*/
        //类的任意对象的实例方法引用的用法:
        TestInterface testInterface = Student::setNameAndScore;
        testInterface.set(new Student(), "DoubleBin", 100);
    }
    
    @FunctionalInterface
    interface TestInterface
    {
        // 注意:入参比Student类的setNameAndScore方法多1个Student对象,除第一个外其它入参类型一致
        public void set(Student d, String name, Integer score);
    }
}

第四种方法引用的类型是某个实例对象的成员方法的引用,语法是object :: instanceMethodName

public class Test
{
    public static void main(String[] args)
    {
        Test test = new Test();
        // lambda表达式使用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> test.println(s));
        // 特定对象的实例方法引用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(test::println);
    }
    
    public void println(String s)
    {
        System.out.println(s);
    }
}

第四种方法其实和第三种差不多,只不多第三个多出了一个参数用来传入了object罢了。

4.重复注解

public class RepeatingAnnotations {
    @Target( ElementType.TYPE )
    @Retention( RetentionPolicy.RUNTIME )
    public @interface Filters {
        Filter[] value();
    }

    @Target( ElementType.TYPE )
    @Retention( RetentionPolicy.RUNTIME )
    @Repeatable( Filters.class )
    public @interface Filter {
        String value();
    };

    @Filter( "filter1" )
    @Filter( "filter2" )
    public interface Filterable {
    }

    public static void main(String[] args) {
        for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) {
            System.out.println( filter.value() );
        }
    }
}
  • @Repeatable( Filters.class )为什么要有后面一段Filters.class
    Filters是保存Filter注解的容器。(可以理解为数组存放了元素)

5.更好的类型推断

Java 8编译器在类型推断方面有很大的提升,在很多场景下编译器可以推导出某个参数的数据类型,从而使得代码更为简洁。例子代码如下:

public class Value< T > {
    public static<T> T defaultValue() {
        return null;
    }

    public T getOrDefault( T value, T defaultValue ) {
        return ( value != null ) ? value : defaultValue;
    }

    public static void main(String[] args) {
        final Value< String > value = new Value<>();
        String s=value.getOrDefault( "22", Value.defaultValue() );
        String s2=value.getOrDefault(null,Value.defaultValue());
    }
}

参数Value.defaultValue()的类型由编译器推导得出,不需要显式指明。在Java 7中这段代码会有编译错误,除非使用Value.<String>defaultValue()

6.拓宽注解的应用场景

之前文章介绍过@Target注解,在JAVA8中,@Target多了这两个类型:

/**
     * Type parameter declaration
     *
     * @since 1.8
     */
     /** 用来标注类型参数 */
    TYPE_PARAMETER,
 
    /**
     * Use of a type
     *
     * @since 1.8
     */
     /** 能标注任何类型名称 */
    TYPE_USE
}
public class TestTypeUse {
 
    @Target(ElementType.TYPE_USE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TypeUseAnnotation {
         
    }
     
    public static @TypeUseAnnotation class TypeUseClass<@TypeUseAnnotation T> extends @TypeUseAnnotation Object {
        public void foo(@TypeUseAnnotation T t) throws @TypeUseAnnotation Exception {
             
        }
    }
     
    // 如下注解的使用都是合法的
    @SuppressWarnings({ "rawtypes", "unused", "resource" })
    public static void main(String[] args) throws Exception {
        TypeUseClass<@TypeUseAnnotation String> typeUseClass = new @TypeUseAnnotation TypeUseClass<>();
        typeUseClass.foo("");
        List<@TypeUseAnnotation Comparable> list1 = new ArrayList<>();
        List<? extends Comparable> list2 = new ArrayList<@TypeUseAnnotation Comparable>();
        @TypeUseAnnotation String text = (@TypeUseAnnotation String)new Object();
        java.util. @TypeUseAnnotation Scanner console = new java.util.@TypeUseAnnotation Scanner(System.in);
    }
}

Java编译器新特性

参数名称

为了在运行时获得Java程序中方法的参数名称,老一辈的Java程序员必须使用不同方法,例如Paranamer liberary。Java 8终于将这个特性规范化,在语言层面(使用反射API和Parameter.getName()方法)和字节码层面(使用新的javac编译器以及-parameters参数)提供支持。

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
 
public class ParameterNames {
    public static void main(String[] args) throws Exception {
        Method method = ParameterNames.class.getMethod( "main", String[].class );
        for( final Parameter parameter: method.getParameters() ) {
            System.out.println( "Parameter: " + parameter.getName() );
        }
    }
}

JVM的新特性

使用Metaspace(JEP 122)代替持久代(PermGen space)。在JVM参数方面,使用-XX:MetaSpaceSize和-XX:MaxMetaspaceSize代替原来的-XX:PermSize和-XX:MaxPermSize。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试准备:Java新特性详解 的相关文章

  • 面试准备

    首行占位 Python相关 1 Python3特性和变化 1 Python3默认编码是UTF 8 xff0c 2为ASCII 2 Python3中只有int xff0c 2中有int跟long xff0c 其中int不能超过sys maxi
  • IT公司智力题(持续跟新中)

    请听题 用赵本山在 买车 的语气 1 有1000瓶药物 但是其中有一瓶是有毒的 小白鼠吃了一个星期以后就会死掉 请问 在一个星期内找出有毒的药物 最少需要多少只小白鼠 解答 用二进制的思路去思考 1000瓶药代表了1000种状态 那么100
  • 编程技术面试的五大要点

    文 何海涛 扎实的基础知识 高质量的代码 清晰的思路 优化代码的能力 优秀的综合能力是编程技术面试的五大要点 找工作一直是一个热门话题 要想找到心仪的工作 难免需要经过多轮面试 编程面试是程序员面试过程中最为重要的一个环节 如果能在编程面试
  • 面试准备:Spring/Spring MVC常见面试题汇总

    文章目录 1 Spring框架有什么优点 2 什么是AOP 3 实现AOP的方式 AOP织入的三种时期 Spring AOP是怎么实现的 4 JDK动态代理实现方式 5 PageHelper实现方式 6 什么是IoC 什么是DI 7 Spr
  • 面试准备:操作系统常见面试题汇总

    文章目录 1 为什么要有用户态和内核态 内核态和用户态的运作方式 2 进程间通信方式介绍 3 Linux查看进程状态 cpu状态 占用端口的进程号的命令 linux top命令VIRT RES SHR DATA的含义 4 什么是Swap 5
  • 面试准备:Mybatis常见面试题汇总

    文章目录 1 和 的区别是什么 2 当实体类中的属性名和表中的字段名不一样 怎么办 3 模糊查询like语句该怎么写 4 Mybatis 一对一 一对多的xml怎么写 5 Dao 接口的工作原理是什么 Dao 接口里的方法 参数不同时 方法
  • 面试总结:测试常见面试题汇总

    文章目录 理论 测试流程 各个测试阶段 单元测试 集成测试 系统测试区别 测试用例设计 什么是好的测试用例 方法 用户登录 实例 App测试和Web测试的区别 典型测试场景 聊天功能测试用例怎么设计 怎么测试微信朋友圈 TODO 怎么测试微
  • 零拷贝的实现原理

    文章目录 引入 DMA PageCache 零拷贝 mmap sendfile SG DMA 使用零拷贝技术的项目 引入 在Java架构直通车 Kafka介绍和高性能原因一节中 介绍了Kafka的Zero Copy技术 本文将深入探究一下Z
  • 面试准备:Java新特性详解

    文章目录 Java语言新特性 1 Lambda表达式和函数式接口 2 接口的默认方法和静态方法 3 方法引用 4 重复注解 5 更好的类型推断 6 拓宽注解的应用场景 Java编译器新特性 参数名称 JVM的新特性 更多资料 参考 java
  • 面试题目总结(CNN)

    CNN权值共享是什么 局部感知 即网络部分连通 每个神经元只与上一层的部分神经元相连 只感知局部 而不是整幅图像 滑窗实现 可行性 局部像素关系紧密 较远像素相关性弱 因此只需要局部感知 在更高层将局部的信息综合起来就得到了全局的信息 权值
  • Java架构直通车——以JDBC为例谈双亲委派模型的破坏

    文章目录 引入 JDBC4 0之前 JDBC4 0之后 引入 java给数据库操作提供了一个Driver接口 public interface Driver Connection connect String url java util P
  • 处理器对原子操作的实现

    文章目录 引入 单核 多核 引入 原子操作对于我们来说 是非常熟悉的概念 从用户角度 可以用原子操作来替换重量级的锁同步 从而提高程序性能 底层实现角度 原子操作可以用于构建各种更重量级的同步操作 比如锁或屏障之类的 对于原子操作的实现来说
  • Java架构直通车——深入理解B+树

    文章目录 引入 AVL树和B树 AVL树 红黑树 B树 B 树 数据库为什么不使用二叉树 为什么使用B 树 与B树的区别 引入 AVL树和B树 AVL树 平衡二叉搜索树是基于二分法的策略提高数据的查找速度的二叉树的数据结构 平衡二叉搜索树的
  • 面试准备:海量数据的处理方式

    文章目录 背景 数据排序 分治 字典树 数据去重 哈希 压缩存储空间 面试题汇总 1 TopK 2 查找中位数 3 随机选择K个数 4 找出出现次数最多的IP 背景 海量数据的处理主要包括三个方面 数据排序 数据统计 数据计算 我们可以简单
  • 招银网络科技电话面试

    1 关于项目的负责内容 还是非常有必要熟悉应急 天基的基础传输模块的 基本面试中都会觉得只界面模块很单薄 应急 基础传输模块 无人机网络协议 速率控制模块 界面模块 天基 基础传输模块 MRUDP 界面模块 2 TCP长连接 问 如何在TC
  • Java中数字的应用

    Java中数字的应用 在java中经常会遇到比较大的数 甚至超过了long型 那么该如何处理这些 大数据 呢 在java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类 从原则上是可以表示 天文单位 一样大的
  • 测开面经总结的经常考察的知识点

    一 算法相关 1 熟悉常见的排序算法 冒泡排序 插入排序 选择排序 归并排序 堆排序 快排 希尔排序 二 计算机网络相关 1 http协议 http 超文本传输协议 是一个在客户端和服务器端之间基于请求与响应模式的 无状态的 应用层的协议
  • 面试准备:MySQL建立索引的原则

    文章目录 建立索引 1 和in可以乱序 2 最左前缀匹配原则 3 尽量选择区分度高的列作为索引 4 索引列不能参与计算 5 尽量的扩展索引 不要新建索引 6 为经常需要排序 分组和联合操作的字段建立索引 7 为常作为查询条件的字段建立索引
  • C++面试题目集合(持续跟新)

    与我前面写的C语言进阶知识点遥相呼应 这才是C 面试 网上的面试题有些太简单了 C 面试题目最多集中在对象的内存模型 记住了 如果用c c 内存都不清楚 还写个屁的程序 1 C 的虚函数是怎样实现的 C 的虚函数使用了一个虚函数表来存放了每
  • C++实现String类

    C 实现String类 还没有完成 待继续 有以下注意的点 1 赋值操作符返回的是一个MyString 而重载的 返回的是一个MyString 其中的原因参看 effective c 主要是返回引用的时候 必须返回必须在此函数之前存在的引用

随机推荐

  • MySQl的基本操作

    前言 MySQL是一种关联数据库管理系统 由于其体积小 速度快的特点 数据库CURD 他和前面的oracel的使用方法差不多 这里就不过多叙述 大概记录一下 创建数据库 创建一个名称为mydb1的数据库 默认为latin1 create d
  • Java-用户自定义异常

    Java 用户自定义异常 1 如何自定义异常 继承现有的异常父类 RuntimeException Exception 提供全局常量 serialVersionUID 提供重载的构造器 2 code举例 定义 package p8excep
  • 使用github生成在线前端项目链接

    作为一个前端小白 一开始是想面试的时候可以让HR直观地看到我的前端项目 然后就在网上找方法可以怎么解决我的这个需求 直至昨天 参考各位大佬的笔记和博客 断断续续 摸索了好几天 总算有个自己的网址 看到的方法大致如下 一 使用花生壳软件进行远
  • H5网页跳转打开微信小程序详解(含完整代码)

    限制条件 目前仅支持在微信内打开H5页面 已认证的服务号 服务号绑定 JS接口安全域名 下的网页可使用此标签跳转任意合法合规的小程序 已认证的非个人主体的小程序 使用小程序云开发的静态网页托管绑定的域名下的网页 可以使用此标签跳转任意合法合
  • csharp: Export DataSet into Excel and import all the Excel sheets to DataSet

  • 红帽Redhat—使用VMware Workstation 16 Pro 安装RHEL8.3登陆

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 环境工具准备 二 VMware Workstation 16 Pro虚拟机创建步骤 三 安装RHEL8 3系统操作步骤 四 操作系统的管理方式 五 SSH远程登
  • [java] mvn 使用笔记

    设置版本号 mvn versions set mvn versions commit
  • C语言结构体

    一 结构体的定义 结构体 Struct 是C语言中的一个重要数据类型 它可以用来存储多个不同类型的变量 结构体类似于一个自定义的数据类型 可以包含多个不同类型的成员变量 每个成员变量可以有自己的数据类型和值 二 结构体存储数据方式 结构体存
  • windows10在资源管理器下右键文件出现无响应解决方案

    1 下载右键菜单管理工具 使用二分查找找到产生问题的原因 我这里是因为qingshellext Class 禁用以后就没有问题了
  • 数组的转置和轴对称(python)

    文章目录 TOC 文章目录 1 什么叫轴 2 什么叫转置 3 转置 3 1简单转置 像二位数组 只有两个轴 再怎么转置也只是两个轴进行位置交换 所以 直接使用T就可以了 例如 3 2transpose 方法进行转置 3 3swapaxes
  • Android SQLite 数据库 存取 BLOB 二进制 文件

    Android开发时用到二进制数据 也可以理解为BYTE数组 的SQLite存取 可能会有人对存取如mp3 图片类文件困惑 其实p3 图片类文件读到内存就可理解为BYTE数组 只要在 下面的基础上增加将文件读到BYTE数组就可以了 其他操作
  • python设置下载源

    我们一般直接用pip下载三方包会很慢 设置以下命令可以加速下载 pip config set global index url Simple Index pip3 9 config set global index url Simple I
  • element Dialog子组件弹框

    父组件 div div
  • 深度学习从入门到精通——基于深度学习的地震数据去噪处理

    传统机器学习 SVM boosting bagging knn 深度学习 CNN 典型 GAN 地震应用方向 叠前地震数据随机噪声去除 实现噪声分离 面波去噪 面波作为很强的干扰波出现在地震勘探中 大大降低了地震记录的分 辨率和信噪比 深度
  • Go语言面试题--基础语法(24)

    文章目录 1 下面这段代码输出什么 2 下面代码输出什么 3 下面这段代码能否编译通过 如果通过 输出什么 1 下面这段代码输出什么 type Direction int const North Direction iota East So
  • 集成测试是接口测试吗_集成测试值得麻烦吗?

    集成测试是接口测试吗 是否编写集成测试可能是一个宗教问题 您相信还是不相信它们 我们甚至所说的集成测试都可能导致无休止的语义争论 单元测试很容易定义 它们可以测试单个单元 单个类 单个方法 对该方法的行为进行单个声明 您可能需要模拟 同样
  • ERROR: No matching distribution found for git

    问题描述 ERROR Could not find a version that satisfies the requirement git from versions none ERROR No matching distribution
  • 【html初识】HTML基础认知

    1 1 1认识网页 1 网页有哪些部分组成 文字 图片 视频 音频 超链接 2 网页背后的本质是什么 前端程序员写的代码 3 前端的代码通过什么软件转换成用户眼中的页面 通过浏览器转化 解析和渲染 成用户看到的网页 4 五大浏览器和渲染引擎
  • python 程序结构

    目录 1 顺序结构 2 分支结构 单分支 双分支 多分支 3 循环结构 for循环 while循环 例 九九乘法表 for 方法 while方法 1 顺序结构 顺序结构是最简单的程序结构 也是最常用的程序结构 只要按照解决问题的顺序写出相应
  • 面试准备:Java新特性详解

    文章目录 Java语言新特性 1 Lambda表达式和函数式接口 2 接口的默认方法和静态方法 3 方法引用 4 重复注解 5 更好的类型推断 6 拓宽注解的应用场景 Java编译器新特性 参数名称 JVM的新特性 更多资料 参考 java