安装
1 | # Oracle JDK 下载 |
命令
- 打包jar
1 | # 将当前目录下所有目录/文件及子目录打包成jar |
运算/控制语句
- 常用
1 | // 取余 |
<<左移,乘以2^x。如:3 << 4 = 3 * 2^4 = 48>>右移,除以2^x,被除数比除数小则为0。如:32 >> 3 = 32 / 2^3 = 4; 4 >> 3 = 4 / 2^3 = 0- goto写法
1 | breakFor : for (int i = 0; i < 100; i++) { |
字符串
1 | MessageFormat.format("hello {0}, date {1}", "bob", new Date()); |
类
内部类
Class.this使用
1 | class Outer { |
匿名类及其构造函数
1 | // 此时传入hello是因为父类构造函数需要 |
枚举
1 | // ## 简单使用:Color.BLUE当成常量,亦可以在switch case中使用 |
继承
- 属性覆盖问题
1 |
|
泛型
- 获取
T.class示例,但是前提条件时必须有继承
1 | public class BaseEntityWrapper<E, V> { |
- 方法级别泛型
1 | // 调用者 |
- 泛型传参
1 | List<EnvironmentPostProcessor> loadPostProcessors() { |
注解
1 | (ElementType.METHOD) |
序列化
1 | import java.io.*; |
- 其他说明
- 对象只要实现Serializable接口,即可被序列化,包含可序列化父类的属性(尽管父类实现了Map即可也能序列化父类的其他属性)
- 像fastjson、jackson等工具类,将对象转成json字符串时,如果继承了Map即可,则默认会忽略其他属性,仅会序列化Map的值,貌似可以显示指定
- 如果一个对象集成了Map接口,则在IDEA中debugger的时候只会显示Map中的属性,如果需要类的其他属性,可右键对象 - View as - Object(此处默认选中的是Map)
集合
- 参考容器
- ConcurrentModificationException问题
- 用for循环遍历List删除元素时,需要注意索引会左移(i–)的问题
- 使用foreach遍历List删除元素,不能直接调用list.remove。主要是foreach本质是调用iterator,则只能用iterator.remove移除元素
- 可直接通过list.iterator()获取iterator对象,再遍历时通过iterator.remove移除元素
- 集合的for循环必须判空(NULL),如
for(Object o : list)和list.forEach(o -> {})均需要判空
流
字节字符流 ^2

处理流

BufferedReader#readLinenew BufferedReader(new InputStreamReader(new FileInputStream("c:/test.text"))).readLine()InputStreamReader起到把字节流转换成字符流
- java之从命令行获取数据的三种方式: https://www.cnblogs.com/myhomepages/p/16513807.html
文件
- 获取src和classpath下文件路径(包含springboot jar文件) ^3
1 | /** |
时间
- GMT、UTC、CST ^1
GMT:格林尼治平时(Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间。由于地球自转导致存在误差,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时间(UTC)- 当 Timestamp 为 0,就表示时间(GMT)1970年1月1日0时0分0秒。中国使用北京时间,处于东 8 区,相应就是早上 8 点
UTC:协调世界时间,又称世界标准时间或世界协调时间,简称UTC(Universal Time Coordinated)。以原子钟作为世界标准时间,计算机的时间原点 1970年1月1日 0点0分0秒CSTChina Standard Time 中国标准时间(北京时间)。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8(CST=GMT+8)- 但是CST的缩写还是其他几个时间的缩写:
Central Standard Time (USA) UT-6:00、Central Standard Time (Australia) UT+9:30、China Standard Time UT+8:00、Cuba Standard Time UT-4:00
- 但是CST的缩写还是其他几个时间的缩写:
- 时间字符串
ISO-8061格式- ISO-8601的标准格式是:
YYYY-MM-DDTHH:mm:ss.sssZ- T仅仅为分隔日期和时间
- Z为时区,指定Z时表示UTC时间,不指定时表示的是本地时间,可以取值:
Z(UFC)、Z+HH:mm、Z-HH:mm(“-07:00”表示西七区,”+08:00”表示东八区,时区默认是0时区,可以用Z表示) - UTC时间 2000-01-01T16:00:00.000Z 等同于本地时间(东八区) 2000-01-02 00:00:00
- ISO-8601的标准格式是:
RFC-2822格式- 如:
Thu Jan 01 1970 00:00:00 GMT+0800、Thu Jan 01 1970 00:00:00 GMT+0800 (CST)
- 如:
- Java相关类
| 类型 | 所属包 | 包含信息 | 时区特性 | 线程安全性 | 设计缺陷 / 优势 | 典型使用场景 |
|---|---|---|---|---|---|---|
Date | java.util | 日期 + 时间(精确到毫秒) | 隐含时区(依赖系统默认) | 不安全 | 设计古老,API 混乱(如getYear()返回值偏移 1900),本质是时间戳的包装类 | 历史代码兼容,需与旧 API 交互时使用 |
Timestamp | java.sql | 日期 + 时间(精确到纳秒) | 隐含时区(依赖 JDBC 驱动) | 不安全 | 继承Date,多了纳秒精度,主要用于数据库交互,仍存在Date的设计问题 | 数据库TIMESTAMP类型的映射(如 JDBC 操作) |
LocalDate | java.time | 仅日期(年 - 月 - 日) | 无时区 | 安全 | 纯日期类型(日历日期),无时间信息,需结合上下文时区理解(如 “本地时间”) | 生日、节假日、日程表等纯日期场景 |
LocalTime | java.time | 仅时间(时 - 分 - 秒 - 纳秒) | 无时区 | 安全 | 纯时间类型,无日期信息,适合表示每天重复的时间点 | 闹钟时间、班次时间(如 “每天 9:00 上班”)。 |
LocalDateTime | java.time | 日期 + 时间 | 无时区 | 安全 | 包含完整日期和时间,但无时区 | 不跨时区的本地事件(如 “会议时间:2024-08-16 15:30”) |
ZonedDateTime | java.time | 日期 + 时间 + 时区 | 有时区(含ZoneId) | 安全 | 包含完整时区信息,可精确定位全球唯一时刻,支持时区转换 | 跨时区场景(如国际航班时间、全球会议调度)、需要精确时间戳的场景 |
- 前端展示时的 “日期偏移”
- 前端若将 LocalDate 序列化的字符串(”2024-08-16”)和 LocalDateTime 误当成带时区的日期(如 new Date(“2024-08-16”))处理,会默认结合本地时区(如 UTC+8)转换为时间戳,导致日期偏移
- 可用日期库解析为本地日期, 如 moment(“2024-08-16”).format(“YYYY-MM-DD”)
- 时间转换
1 | // LocalDateTime → Timestamp |
- 时间相关方法
1 | LocalDate startTm = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); // 获取本月开始 |
- 时区转换
1 | // 案例1: 将Asia/Shanghai获取的时间戳设置成Asia/Bangkok的时区,再将其转成Asia/Shanghai的时间戳 => 只有将Asia/Bangkok改成其他时区,就可以实现在Asia/Shanghai的服务器获取不同时区的时间 |
数字计算
- BigDecimal计算绩效基数
1 | LocalDate startTm = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); |
反射
- 简单使用
1 | Class clazz = Class.forName("cn.aezo.test.MyService"); // obj.getClass(); |
- 和spring结合
1 | ("/doPost/{serviceName}/{methodName}") |
- 可通过反射获取运行时对象,减少依赖;如java库依赖的包为编译级别,由用户决定是否引入此依赖,此时在java库中可通过反射调用此依赖对应方法(或抽象成接口,此时只要客户引入了就不会报错找不到方法)
类加载器
- 获取资源
- 获取class资源
- Enumeration
paths = ClassLoader.getSystemResources(“org/slf4j/impl/StaticLoggerBinder.class”); - Enumeration
paths = classLoader.getResources(“org/slf4j/impl/StaticLoggerBinder.class”);
- Enumeration
- 获取class资源
JDBC
- Mysql连接JDBC为例
- 先在Mysql官网下载驱动JDBC(Mysql Drivers提供了很多语言的驱动):mysql-connector-java-5.0.8
- 导包:在项目上右键->Build Path->Add External archives->mysql-connector-java-5.0.8-bin.jar
- 示例如下
1 | package cn.aezo.mysql; |
JNI和JNA
- JNI: Java Native Interface
- JNA: Java Native Access, 提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码
- 参考文章
- 说明JDK的版本和DLL的版本要对应(和操作系统版本没有关系,主机只需要能运行JDK即可),如JDK 64位只能调用64位的DLL
JAR/JVM
JAR相关
METE-INF/MANIFEST.MF文件- 命名继承自UNIX
.manifest文件(清单文件),.MF为Manifest File Format - MANIFEST.MF 文件是 Java 打包工具(如 jar、war、ear 等)中存在的一个文件,用于描述打包文件的元信息
- 指定打包文件中的主类:Main-Class属性
- 存储打包文件的元信息:版本号、作者、描述信息等
- 在 Java 中,MANIFEST.MF 文件通常被 Java 虚拟机(JVM)或相关的工具(如Maven和Gradle等)读取和解析
- 不是所有的 JAR 文件都必须要包含 MANIFEST.MF 文件
- 命名继承自UNIX
JVM相关
- 扩展classpath
-Xbootclasspath: 完全取代基本核心的Java class 搜索路径。不常用,否则要重新写所有Java核心class-Xbootclasspath/a: 后缀,在核心class搜索路径后面,常用-Xbootclasspath/p: 前缀,在核心class搜索路径前面,不常用,避免引起不必要的冲突- 分隔符与classpath参数类似,unix使用
:号,windows使用;号java -Xbootclasspath/a:/home/test/thirdlib/module.jar -jar demo.jar基于jar配置测试成功java -Xbootclasspath/a:/home/test/thirdlib/ -jar demo.jar
- 参考:https://www.cnblogs.com/duanxz/archive/2013/12/19/3482311.html
- 自定义JVM参数
1 | // 自定义JVM参数格式 -D<name>=<value> |
易错点
- 基础语法
1 | // ==> Null问题 |
- 引用问题
1 | public static void main(String[] args) { |
- split
1 | "1,2,,".split(","); // ["1", "2"] |
- final
1 | // final Integer i = 1; |
- mkdir和mkdirs
1 | // 创建此抽象路径名指定的目录。如果父目录不存在不会自动创建,也不会报错,返回false |
AWT
参考文章
