大白话讲面试题,每天更新三题,提倡每日积累而不是临阵磨枪,我的目的不是为了背题,而是通过这种方式来更好的巩固自身所掌握的知识。
题目的星星代表难度等级,五星为满,并且我会列出需要掌握的前置知识。
大家一起,冲鸭!
目的:典中典之典中典,JDK1.8 的新特性不说有多新,但绝对是平时开发中用的最多的,这题也可以体现你对新技术的关注程度
回答这题你还需要:需要一定的 Java 语法基础
我们只需要答出那些常用的新特性即可。
Lambda 表达式:我们可以把一个“值”赋给 Java 变量,比如 int a = 10
;而Lamba 表达式可以把“一块”代码赋值给变量,如 Runnable r = () -> System.out.println("Hello!")
。
函数式编程:为了给Lambda表达式提供更友好的支持,而提出了函数式编程。
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,什么意思呢。
比如我写了一个函数式接口如下:
@FunctionalInterface interface HelloService { void sayHello(String message); }
那我可以如此调用:
HelloService helloService = message -> System.out.println("F**k," + message);
Stream API :也叫做流式编程。
假定有一个集合,里面有元素 a、b、c,我们把它看作是一个数据流,在中间进行各种操作,比如过滤、聚合、排序等等,再由最后的操作进行收尾得到想要的结果。
就像下面的代码,在狗的名字挑出来,放到一个单独的集合中,我称之为「狗的名字」:
List<String> dogNames = dogs.stream.map(dog::getName).collect(Collectors.toList());
方法引用:我们可以使用 ::
+ 方法名的方式去指向一个方法,就像上面例子中的 dog::getName
,我们直接调用了 getName() 方法。
Optional:为了解决空指针异常,JDK1.8 引入了 Optional 类。
新的日期时间 API:为了解决旧版日期时间 API 中存在的问题,如线程不安全、时区处理麻烦、设计糟糕等等,引入了新的包 java.time
。
目的:基础考察
回答这题你还需要:Hash 表的相关原理知识
以 HashMap 插入数据为例,HashMap 会拿到 Key,调用它的 hashCode() 方法,通过得到的值来确定要把这个数据放在数组的哪个位置,假设发生了 hash 冲突,再调用 equal() 方法来判断两个对象是否真的相等,相等的话就会覆盖这个位置的 Value。
默认的 equal 方法,直接使用 == 符号进行比较,对于 == 号,如果是基本数据类型,那么比较的是其具体的值,但对于引用数据类型来说,比较的是其内存中的地址。
所以说,复写了 equal 方法必须复写 hashCode 方法,事实上,再开发中基本是必须复写两个方法,比较简单的是借助 Lombok 的注解 @Data 来帮我们复写。
目的:考察能否正确操作字符串对象。
回答这题你还需要:无
首先 String 对象在 Java 中是不可变的,这意味着我们在进行字符串拼接时,在内存中会创建多个对象。
而 StringBuilder 和 StringBuffer 的出现就是为了解决这个问题的,他们两是可变的字符串对象,另外 StringBuffer 还是线程安全的。
在这里我会放上所有我参考的资料链接