赞
踩
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
Mybatis面试专题
MySQL面试专题
并发编程面试专题
用于处理对象空指针异常:
public String getDesc(Test test){
return Optional.ofNullable(test)
.map(Test::getDesc).else(“”);
}
JDK9
====
借助Java 9的一项新功能,即集合工厂方法,您可以轻松地使用预定义的数据创建不可变的集合。您只需要在特定集合类型上使用of方法。
List fruits = List.of(“apple”, “banana”, “orange”);
Map<Integer, String> numbers = Map.of(1, “one”, 2,“two”, 3, “three”);
在Java 9之前,您可以使用Collections,但这绝对是一种更复杂的方法。
public List fruits() {
List fruitsTmp = new ArrayList<>();
fruitsTmp.add(“apple”);
fruitsTmp.add(“banana”);
fruitsTmp.add(“orange”);
return Collections.unmodifiableList(fruitsTmp);
}
public Map<Integer, String> numbers() {
Map<Integer, String> numbersTmp = new HashMap<>();
numbersTmp.put(1, “one”);
numbersTmp.put(2, “two”);
numbersTmp.put(3, “three”);
return Collections.unmodifiableMap(numbersTmp);
}
同样,仅从ArrayList对象表创建即可使用Arrays.asList(…)method。
public List fruitsFromArray() {
String[] fruitsArray = {“apple”, “banana”, “orange”};
return Arrays.asList(fruitsArray);
从Java 8开始,您可以在接口内部使用公共默认方法。但是仅从Java 9开始,由于接口中的私有方法,您将能够充分利用此功能。
ublic interface ExampleInterface {
private void printMsg(String methodName) {
System.out.println(“Calling interface”);
System.out.println("Interface method: " + methodName);
}
default void method1() {
printMsg(“method1”);
}
default void method2() {
printMsg(“method2”);
}
}
JDK10
=====
从Java 9和Java 10开始,有几种用于Optional的有用方法。其中最有趣的两个是orElseThrow和ifPresentOrElse。如果没有值,则使用该orElseThrow方法抛出NoSuchElementException。否则,它返回一个值。
public Person getPersonById(Long id) {
Optional personOpt = repository.findById(id);
return personOpt.orElseThrow();
}
因此,您可以避免将带参数的if语句与isPresentmethod一起使用。
public Person getPersonByIdOldWay(Long id) {
Optional personOpt = repository.findById(id);
if (personOpt.isPresent())
return personOpt.get();
else
throw new NoSuchElementException();
}
第二种有趣的方法是ifPresentOrElse。如果存在一个值,它将使用该值执行给定的操作。否则,它将执行给定的基于空的操作。
public void printPersonById(Long id) {
Optional personOpt = repository.findById(id);
personOpt.ifPresentOrElse(
System.out::println,
() -> System.out.println(“Person not found”)
);
}
在Java 8中,我们可以if-else直接与isPresent方法一起使用。
public void printPersonByIdOldWay(Long id) {
Optional personOpt = repository.findById(id);
if (personOpt.isPresent())
System.out.println(personOpt.get());
else
System.out.println(“Person not found”);
}
JDK 10 && JDK 11
================
从Java 10开始,您可以声明没有其类型的局部变量。您只需要定义var关键字而不是类型。从Java 11开始,您还可以将其与lambda表达式一起使用,如下所示。
public String sumOfString() {
BiFunction<String, String, String> func = (var x, var y) -> x + y;
return func.apply(“abc”, “efg”);
}
JDK 12
======
使用Switch表达式,您可以定义多个case标签并使用箭头返回值。此功能自JDK 12起可用。它使Switch表达式真正更易于访问。
public String newMultiSwitch(int day) {
return switch (day) {
case 1, 2, 3, 4, 5 -> “workday”;
case 6, 7 -> “weekend”;
default -> “invalid”;
};
}
对于低于12的Java,相同的示例要复杂得多。
public String oldMultiSwitch(int day) {
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
return “workday”;
case 6:
case 7:
return “weekend”;
default:
return “invalid”;
}
}
JDK 13
======
文本块是多行字符串文字,它避免使用转义序列,并以可预测的方式自动设置字符串格式。它还使开发人员可以控制字符串的格式。从Java 13开始,文本块可用作预览功能。它们以三个双引号(“”")开头。让我们看看我们如何轻松地创建和格式化JSON消息。
public String getNewPrettyPrintJson() {
return “”"
{
“firstName”: “Piotr”,
“lastName”: “Mińkowski”
}
“”";
}
创建Java 13之前的相同JSON字符串要复杂得多。
public String getOldPrettyPrintJson() {
return “{\n” +
" “firstName”: “Piotr”,\n" +
" “lastName”: “Mińkowski”\n" +
“}”;
}
JDK14
=====
使用Records,您可以定义不可变的纯数据类(仅限getter)。它会自动创建toString,equals和hashCode方法。实际上,您只需要定义如下所示的字段即可。
public record Person(String name, int age) {}
具有类似功能的类如record包含字段,构造函数,getter和实施toString,equals以及hashCode方法。
public class PersonOld {
private final String name;
private final int age;
public PersonOld(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonOld personOld = (PersonOld) o;
return age == personOld.age && name.equals(personOld.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return “PersonOld{” +
“name='” + name + ‘’’ +
“, age=” + age +
‘}’;
}
}
JDK15
=====
使用密封类功能,您可以限制超类的使用。使用new关键字,sealed您可以定义哪些其他类或接口可以扩展或实现当前类。
public abstract sealed class Pet permits Cat, Dog {}
允许的子类必须定义一个修饰符。如果您不想允许任何其他扩展名,则需要使用final关键字。
public final class Cat extends Pet {}
另一方面,您可以打开扩展类。在这种情况下,应使用non-sealed修饰符。
public non-sealed class Dog extends Pet {}
当然,下面的可见声明是不允许的。
public final class Tiger extends Pet {}
引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。
总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。
[外链图片转存中…(img-nbwUIgBf-1715427867621)]
[外链图片转存中…(img-l87N5rlv-1715427867622)]
[外链图片转存中…(img-FQfmmXDx-1715427867622)]
[外链图片转存中…(img-FdR5X8uS-1715427867622)]
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。