Java 8新特性高频面试题及详细答案(实战向)_第1页
Java 8新特性高频面试题及详细答案(实战向)_第2页
Java 8新特性高频面试题及详细答案(实战向)_第3页
Java 8新特性高频面试题及详细答案(实战向)_第4页
Java 8新特性高频面试题及详细答案(实战向)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java8新特性高频面试题及详细答案(实战向)一、基础高频面试题1、Java8主要有哪些核心新特性?Java8是Java里程碑式的版本,日常开发和面试最常用的核心特性主要有以下几点:Lambda表达式:简化匿名内部类写法,支持函数式编程函数式接口:专门适配Lambda的单一抽象方法接口Stream流式编程:集合、数组的链式流式操作,简化遍历、过滤、排序、聚合等操作Optional空值容器:解决频繁的NullPointerException空指针问题接口默认方法、静态方法:打破接口只能定义抽象方法的限制,实现接口功能扩展兼容新的日期时间API(java.time包):替代老旧、线程不安全的Date、Calendar方法引用:进一步简化Lambda表达式写法并行流:基于多线程简化集合并行处理,充分利用多核CPUHashMap底层优化:引入红黑树,优化哈希冲突后的查询效率2、什么是Lambda表达式?基本语法是什么?Lambda表达式是Java8引入的函数式编程语法,核心作用是简化单一抽象方法的匿名内部类代码,让代码更简洁紧凑。它可以把代码块当成参数传递。基础语法:(参数列表)->{方法体}语法简化规则:参数列表只有一个参数时,可省略括号方法体只有一行代码时,可省略大括号和分号方法体只有一行return返回语句时,可省略return关键字对比示例://传统匿名内部类newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("线程执行");}}).start();//Lambda简化写法newThread(()->System.out.println("线程执行")).start();3、Lambda表达式和匿名内部类的区别?这是面试高频对比考点,核心区别有5点:适用范围不同:匿名内部类可以是类、抽象类、任意接口;Lambda只能用于函数式接口(仅有一个抽象方法)编译原理不同:匿名内部类编译后会生成单独的.class文件;Lambda不会生成新文件,运行时通过invokedynamic指令动态生成调用点this指向不同:匿名内部类的this指向当前内部类对象;Lambda的this指向外层调用类对象变量引用不同:匿名内部类可以访问外部非final变量(隐式final);Lambda同样要求外部变量为final或有效final,不能在内部修改外部变量结构简洁度不同:Lambda大幅简化代码,去除冗余模板代码,可读性更高4、什么是函数式接口?常用的内置函数式接口有哪些?定义:有且仅有一个抽象方法的接口,可以包含多个默认方法、静态方法。接口上可添加@FunctionalInterface注解校验,一旦添加,接口存在多个抽象方法会编译报错。四大核心内置函数式接口(面试必考):接口名方法作用Consumer<T>消费型voidaccept(Tt)接收参数,无返回值(消费数据)Supplier<T>供给型Tget()无参数,返回数据(生产数据)Function<T,R>函数型Rapply(Tt)接收参数,返回结果(数据转换)Predicate<T>断言型booleantest(Tt)接收参数,返回布尔值(条件判断、过滤)5、什么是方法引用?有几种类型?方法引用是Lambda表达式的进一步简化,当Lambda方法体只是调用一个已有方法、无额外逻辑时,就可以用方法引用替代,代码更简洁。一共4种类型:对象::实例方法:特定对象的普通方法类::静态方法:类的静态方法类::实例方法:任意对象的实例方法类::new:构造方法引用,用于创建对象二、Stream流式编程核心面试题6、Stream是什么?和集合的区别?Stream是Java8针对集合、数组提供的流式计算API,用于简化数据的查询、过滤、排序、转换、聚合等操作。Stream和集合核心区别:存储方式:集合是存储数据的容器;Stream不存储数据,只是对数据的操作流水线执行特性:集合操作是立即执行;Stream是延迟执行,中间操作不执行,只有触发终止操作才会执行可复用性:集合可重复使用;Stream一次性使用,执行完终止操作后流就会关闭,无法再次使用操作方式:集合是循环迭代遍历;Stream是链式编程、声明式编程,只需定义规则,无需关心遍历过程7、Stream的中间操作和终止操作有什么区别?常用方法有哪些?Stream的所有操作分为两类,核心特点:中间操作延迟、终止操作触发执行。1.中间操作(惰性、返回新流、可链式调用)不会触发实际计算,只是组装操作流水线,可连续链式调用。常用:filter(过滤)、map(转换)、sorted(排序)、distinct(去重)、limit(截取)、skip(跳过)、peek(遍历操作)2.终止操作(触发执行、关闭流、返回结果)触发整个流水线执行,执行完毕后流失效,无法继续调用方法。常用:collect(收集)、forEach(遍历)、count(统计数量)、max/min(最值)、anyMatch/allMatch(匹配判断)、findFirst/findAny(查找)8、map和flatMap的区别?二者都是Stream转换方法,核心区别在于处理嵌套数据:map:一对一转换,将一个元素转换成另一个元素,不会拆解嵌套集合。适合简单数据类型转换、对象属性提取。flatMap:一对多转换,会拆解嵌套流/集合,将多层数据扁平化,合并成一个新流。适合处理List嵌套List、数组嵌套等场景。举例:List<List<String>>嵌套集合,map处理后还是嵌套结构,flatMap可以打散成单层List<String>。9、并行流和串行流的区别?使用场景和注意事项?串行流(stream()):单线程执行,顺序处理数据,线程安全,无并发问题。并行流(parallelStream()):基于Fork/Join框架,多线程并行处理数据,充分利用多核CPU,提升大数据量处理效率。使用注意事项(重点):并行流不保证执行顺序,有顺序要求的场景不能用并行流操作非线程安全容器(ArrayList等)会出现并发异常,必须使用线程安全集合或加锁数据量小的时候,并行流的线程创建、调度开销大于效率提升,反而更慢并行流不适合存在事务、IO、数据库操作的场景,只适合纯内存计算三、Optional、接口新特性、日期API面试题10、Optional的作用是什么?常用方法有哪些?Optional是Java8提供的空值安全容器,专门用来规避空指针异常,替代频繁的if(null!=obj)判空写法,让空值处理更优雅。常用核心方法:Optional.of(Tt):传入非空对象,为空直接抛异常Optional.ofNullable(Tt):支持空对象,最常用isPresent():判断是否非空ifPresent():非空则执行逻辑,避免空指针orElse(Tt):为空返回默认值orElseGet(Supplier):为空通过函数获取默认值,延迟加载,性能更好orElseThrow():为空抛出自定义异常map/flatMap:链式处理空值转换开发规范:禁止直接使用get()方法,容易再次引发空指针,优先使用orElse、ifPresent等方法。11、Java8接口的默认方法和静态方法特点?解决了什么问题?1.默认方法(default)用default修饰,有方法体,不需要子类重写核心作用:解决接口升级兼容问题,旧接口新增方法不需要所有实现类重写,避免大规模代码改动如果类同时实现多个接口,且存在同名默认方法,子类必须手动重写该方法解决冲突2.静态方法(static)接口中可以定义静态方法,有方法体只能通过接口名.方法名调用,不能通过实现类、对象调用用于封装接口相关的公共工具方法12、Java8新日期时间API相比旧Date/Calendar有什么优势?旧的java.util.Date、Calendar存在大量弊端,Java8全新的java.time包彻底解决了这些问题:线程安全:旧API可变,多线程下并发修改会出现线程安全问题;新日期类是不可变类,线程绝对安全设计合理:旧Date年份从1900开始、月份从0开始,极易出错;新API时间、月份、日期规则符合日常认知功能丰富:支持日期加减、时间比较、格式化、时区处理、日期区间计算,无需手动计算格式化安全:旧SimpleDateFormat线程不安全;新DateTimeFormatter线程安全,可全局复用常用核心类:LocalDate(年月日)、LocalTime(时分秒)、LocalDateTime(年月日时分秒)、DateTimeFormatter(格式化)、Duration/Period(时间间隔)四、进阶底层面试题13、Java8HashMap做了哪些优化?底层原理变化?Java8对HashMap底层做了重大优化,主要改动如下:数据结构优化:由JDK7的「数组+链表」改为「数组+链表+红黑树」树化规则:当链表长度超过8,且数组容量大于64时,链表转为红黑树;链表长度小于6时,红黑树退化为链表查询效率提升:链表查询时间复杂度O(n),红黑树查询O(logn),大数据量哈希冲突场景下效率大幅提升哈希算法优化:简化hash扰动算法,减少哈希冲突扩容优化:JDK7扩容会倒置链表,容易出现循环链表死循环;JDK8保留节点原有顺序,规避死循环问题14、Lambda表达式的变量捕获规则是什么?Lambda表达式中引用的外部局部变量,必须是final或有效final。有效final指:变量初始化后,后续没有被重新赋值。即使不写final修饰,只要没有二次赋值,就可以被Lambda捕获。禁止操作:不能在Lambda内部修改外部局部变量,否则编译报错。原因:Lambda底层是匿名实例,局部变量存储在栈中,方法执行结束会销毁,通过final固化变量值,保证线程执行时变量的稳定性。15、Stream的collect收集方法底层原理?常用收集器有哪些?collect是Stream核心终止方法,用于将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论