目录
- 专业技能
- 项目经验
专业技能
熟悉 Java
集合
谈谈集合
Java 的集合有 List、Set、Queue、Map 四个接口,其中 List、Set、Queue 三个子接口是由 Collection 派生出来的。
另外,Collection 是一个接口,Collections 是一个工具类。
泛型
为什么使用泛型?
谈谈 <?> 与 Object
谈谈 extends 与 super
可以将 List<String> 传递给 List<Object> 吗?
数组可以使用泛型吗?
谈谈泛型类
谈谈泛型接口
谈谈泛型方法
谈谈泛型擦除
谈谈泛型的常用命名
IO
Exception
谈谈异常的处理机制
如何实现全局异常处理?
Lambda
什么是 Lambda?
一种匿名函数,通常用于函数式接口的实现,即只有一个抽象方法的接口,但是可以有多个非抽象方法。
平时开发时并不需要特意使用 Lambda,一般都是当 IDEA 提示时再根据实际情况进行权衡和选择。
public interface Calculator {
int calculate(int x, int y);
}
public class Adder implements Calculator {
@Override
public int calculate(int x, int y) {
return x + y;
}
}
Calculator adder = new Adder();
int result1 = adder.calculate(1, 2);
Calculator lambdaAdder = (x, y) -> x + y;
int result2 = lambdaAdder.calculate(1, 2);
谈谈使用格式
(int x, int y) -> {
int sum = x + y;
return sum;
}
(参数列表) -> {
方法主体
}
什么是语法糖?
一种简化语法。
Java 有哪些常见的语法糖?
自动装箱和自动拆箱、增强for循环、Lambda表达式、可变参数、泛型、枚举类型、try-with-resources
Stream
LocalDate
为什么不使用 java.util.Date?
设计缺陷,线程不安全,比如 getYear 方法返回的是从 1900 年起经过的年数,而不是实际的年份。
System.out.println(new Date().getYear()); // 2023 - 1900 = 123
为什么不使用 java.util.Calendar?
使用繁琐,线程不安全,比如 Calendar.MONTH 是从 0 开始计算的,而不是 1。
System.out.println(Calendar.getInstance().get(Calendar.MONTH) + 1);
谈谈 java.time 包
设计合理,使用简单,线程安全,支持纳秒级别的时间精度。
LocalDate 表示日期,LocalTime 表示时间
LocalDateTime 表示日期和时间,ZonedDateTime 表示时区的日期和时间
Instant 表示时间戳,Duration 表示时间间隔,Period 表示日期间隔
DateTimeFormatter 用于日期时间的格式化
谈谈 java.time 包的常用 API
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
public class Main {
public static void main(String[] args) {
}
/**
* Date 转 LocalDateTime
*/
public static void dateToLocalDateTime() {
Date date = new Date();
System.out.println("Date: " + date);
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("LocalDateTime: " + localDateTime);
}
/**
* LocalDateTime 转 Date
*/
public static void localDateTimeToDate() {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("LocalDateTime: " + localDateTime);
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("Date: " + date);
}
/**
* String 转 LocalDateTime
*/
public static void stringToLocalDateTime() {
String string = "2020-05-20 21:30:01";
System.out.println("String: " + string);
LocalDateTime localDateTime = LocalDateTime.parse(string, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("LocalDateTime: " + localDateTime);
}
/**
* LocalDateTime 转 String
*/
public static void localDateTimeToString() {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("LocalDateTime: " + localDateTime);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("String: " + localDateTime.format(dateTimeFormatter));
}
/**
* 日期相隔
*/
public static void localDateBetween() {
LocalDate startLocalDate = LocalDate.of(2020, 5, 20);
LocalDate endLocalDate = LocalDate.now();
System.out.println("比较年月日 Days: " + startLocalDate.until(endLocalDate, ChronoUnit.DAYS));
System.out.println("仅仅比较日 Days: " + Period.between(startLocalDate, endLocalDate).getDays());
}
/**
* 时间相隔
*/
public static void localDateTimeBetween() {
LocalDateTime startLocalDateTime = LocalDateTime.of(2020, 5, 20, 21, 30, 1);
LocalDateTime endLocalDateTime = LocalDateTime.now();
Duration duration = Duration.between(startLocalDateTime, endLocalDateTime);
System.out.println("Days: " + duration.toDays() + ", Hours: " + duration.toHours() + ", Minutes: " + duration.toMinutes());
}
/**
* 时间戳
*/
public static void timeStamp() {
Instant instant = LocalDateTime.of(2020, 5, 20, 21, 30, 1).toInstant(ZoneOffset.ofHours(8));
System.out.println("EpochMilli: " + instant.toEpochMilli());
System.out.println("CurrentTimeMillis: " + System.currentTimeMillis());
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(instant.getEpochSecond(), 0, ZoneOffset.ofHours(8));
System.out.println("LocalDateTime: " + localDateTime);
}
public static void otherApi() {
// 创建 LocalDateTime 对象
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime specificDateTime = LocalDateTime.of(2020, 5, 20, 21, 30, 1);
LocalDateTime parsedDateTime = LocalDateTime.parse("2020-05-20T21:30:01");
// 获取日期和时间
int year = dateTime.getYear();
int month = dateTime.getMonthValue();
int day = dateTime.getDayOfMonth();
int hour = dateTime.getHour();
int minute = dateTime.getMinute();
int second = dateTime.getSecond();
int nano = dateTime.getNano();
DayOfWeek dayOfWeek = dateTime.getDayOfWeek();
// 修改日期和时间
LocalDateTime modifiedDateTimeWithYear = dateTime.withYear(2024);
LocalDateTime modifiedDateTimeWithMonth = dateTime.withMonth(6);
LocalDateTime modifiedDateTimeWithDayOfMonth = dateTime.withDayOfMonth(25);
LocalDateTime modifiedDateTimeWithHour = dateTime.withHour(12);
LocalDateTime modifiedDateTimeWithMinute = dateTime.withMinute(15);
LocalDateTime modifiedDateTimeWithSecond = dateTime.withSecond(30);
LocalDateTime modifiedDateTimeWithNano = dateTime.withNano(0);
// 加减日期和时间
LocalDateTime modifiedDateTimePlusYears = dateTime.plusYears(1);
LocalDateTime modifiedDateTimeMinusMonths = dateTime.minusMonths(2);
LocalDateTime modifiedDateTimePlusDays = dateTime.plusDays(7);
LocalDateTime modifiedDateTimeMinusHours = dateTime.minusHours(3);
LocalDateTime modifiedDateTimePlusMinutes = dateTime.plusMinutes(15);
LocalDateTime modifiedDateTimeMinusSeconds = dateTime.minusSeconds(30);
LocalDateTime modifiedDateTimePlusNanos = dateTime.plusNanos(500000000);
// 比较日期和时间
LocalDateTime dateTime1 = LocalDateTime.of(2020, 5, 20, 21, 30, 1);
LocalDateTime dateTime2 = LocalDateTime.of(2025, 5, 20, 21, 30, 1);
boolean isBefore = dateTime1.isBefore(dateTime2);
boolean isAfter = dateTime1.isAfter(dateTime2);
boolean isEqual = dateTime1.isEqual(dateTime2);
}
}