廖雪峰Java教程学习笔记
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了廖雪峰Java教程学习笔记相关的知识,希望对你有一定的参考价值。
一、Java 快速入门
Java 简介
- Java 特点
- Java 是基于 JVM 虚拟机的跨平台语言,一次编写到处运行
- Java 程序易于编写且有垃圾回收机制,不必考虑内存管理
- Java 虚拟机拥有工业级的稳定性和高度优化的性能,经受了长时间的考验
- Java 拥有最广泛的开源社区支持,各种高质量组件随时可用
- Java 应用领域
- 互联网和企业应用,这是 Java EE 的长期优势和市场地位
- 大数据平台,主要有 Hadoop、Spark、Flink 等
- android 移动平台
- JDK、JRE、JVM 之间的关系
- JSR(Java Specification Request):规范
- JCP(Java Community Process):组织
- RI(Reference Implementation):基于 JSR 的参考实现
- TCK(Technology Compatibility Kit):兼容性测试套件
安装 JDK
JAVA_HOME -
D:\\Java\\jdk1.8.0_131
Path -
%JAVA_HOME%\\bin
CLASSPATH -
.;%JAVA_HOME%\\lib\\dt.jar;%JAVA_HOME%\\lib\\tools.jar;
- jdb.exe:Java调试器,用于开发阶段的运行调试
第一个 Java 程序
- java Hello.java - Java 11 新特性,可以直接运行一个单文件源码
Java 代码助手
使用 IDE
使用 IDE 练习插件
Java 程序基础
Java 程序基本结构
变量和数据类型
- Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要 1 bit,但是通常 JVM 内部会把 boolean 表示为4字节整数
- 省略变量类型声明
var sb = new StringBuilder();
整数运算
- 对 byte 和 short 类型进行移位时,会首先转换为 int 再进行移位
浮点数运算
- 浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算
- 整数运算在除数为 0 时会报错,而浮点数运算在除数为 0 时,不会报错,但会返回以下几个特殊值
NaN - Not a Number
Infinity - 无穷大
-Infinity - 负无穷大
- 如果强制类型转换后超过了整型能表示的最大范围,将返回整型的最大值
- 如果要进行四舍五入,可以对浮点数加上 0.5 再强制转型
布尔运算
字符和字符串
- Java 在内存中总是使用 Unicode 表示字符,所以,一个英文字符和一个中文字符都用一个 char 类型表示,它们都占用两个字节
- Java 13开始,字符串可以用"""…"""表示多行字符串。多行字符串的排版不规则,则总是以最短的行首空格为基准
String s = """
SELECT * FROM
users
WHERE id > 100
ORDER BY name DESC
""";
- 注意要区分空值 null 和空字符串 “”,空字符串是一个有效的字符串对象,它不等于 null
数组类型
- 数组所有元素初始化为默认值
流程控制
输入和输出
- 使用 System.out.printf("%%"); 输出 %
if 判断
switch 多重选择
- 从 Java 12开始,switch 语句升级为更简洁的表达式语法,使用类似模式匹配(Pattern Matching)的方法,保证只有一种路径会被执行,并且不需要 break 语句
- 大多数时候,在 switch 表达式内部,我们会返回简单的值。但是,如果需要复杂的语句,我们也可以写很多语句,放到 … 里,然后,用 yield 返回一个值作为 switch 语句的返回值
public class Main
public static void main(String[] args)
String fruit = "orange";
int opt = switch (fruit)
case "apple" -> 1;
case "pear", "mango" -> 2;
default ->
int code = fruit.hashCode();
yield code; // switch语句返回值
;
System.out.println("opt = " + opt);
do while 循环
for 循环
- 使用 for 循环避免在循环体中去修改 i
break 和 continue
数组操作
遍历数组
数组排序
多维数组
- Java 多维数组每一维元素的个数可以不相同
- 遍历多维数组
int[][] array =new int[][]
1, 2, 3,
2, 3,
54, 234, 3, 131, 34
;
System.out.println(Arrays.deepToString(array));
命令行参数
二、面向对象编程
面向对象基础
方法
构造方法
- 没有在构造方法中初始化字段时,引用类型的字段默认是 null,数值类型的字段用默认值,int类型默认值是 0,布尔类型默认值是 false
方法重载
继承
- 子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的
- 从 Java 15开始,允许使用 sealed 关键字修饰 class,并通过 permits 明确写出能够从该 class 继承的子类名称
public sealed class Shape permits Rect, Circle, Triangle
- instanceof 实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类
- 从 Java 14开始,判断 instanceof 后,可以直接转型为指定变量,避免再次强制转型
Object obj = "hello";
if (obj instanceof String s)
System.out.println(s.toUpperCase());
多态
- 多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法
抽象类
接口
- Java 的接口特指 interface 的定义,表示一个接口类型和一组方法签名,而编程接口泛指接口规范,如方法签名,数据格式,网络协议等
静态字段和静态方法
- 因为静态方法属于 class 而不属于实例,因此,静态方法内部,无法访问 this 变量,也无法访问实例字段,它只能访问静态字段
包
- 导入System类的所有静态字段和静态方法:
import static java.lang.System.*;
- 简单类名的查找顺序
- 查找当前 package 是否存在此类
- 查找 import 的包中是否存在此类
- 查找 java.lang 包中是否存在此类
- 自动导入的是 java.lang 包,但类似 java.lang.reflect 这些包仍需要手动导入
作用域
内部类
- 内部类与普通类有个最大的不同,就是内部类的实例不能单独存在,必须依附于一个外部类的实例
- 内部类除了有一个 this 指向它自己,还隐含地持有一个外部类实例,可以用 Outer.this 访问这个实例
- map1 是一个普通的 HashMap 实例,map2 是一个匿名类实例,该匿名类继承自HashMap。map3 也是一个继承自 HashMap 的匿名类实例,并且添加了 static 代码块来初始化数据。编译输出可发现 Main$1.class 和 Main$2.class 两个匿名类文件
import java.util.HashMap;
public class Main
public static void main(String[] args)
HashMap<String, String> map1 = new HashMap<>();
HashMap<String, String> map2 = new HashMap<>() ;
HashMap<String, String> map3 = new HashMap<>()
put("A", "1");
put("B", "2");
;
System.out.println(map3.get("A"));
classpath 和 jar
- classpath 是 JVM 用到的一个环境变量,它用来指示 JVM 如何搜索 class
- 假设 classpath 是
.;C:\\work\\project1\\bin;C:\\shared
,当JVM在加载abc.xyz.Hello这个类时,会依次查找
- <当前目录>\\abc\\xyz\\Hello.class
- C:\\work\\project1\\bin\\abc\\xyz\\Hello.class
- C:\\shared\\abc\\xyz\\Hello.class
- 启动 JVM 时 设置 classpath
java -classpath .;C:\\work\\project1\\bin;C:\\shared abc.xyz.Hello
模块
Java 核心类
字符串和编码
StringBuilder
StringJoiner
包装类型
JavaBean
枚举类
纪录类
BigInteger
BigDecimal
常用工具类
三、异常处理
Java 的异常
捕获异常
抛出异常
自定义异常
NullPointerException
使用断言
使用 JDK Logging
使用 Commons Logging
使用 Logs4j
使用 SQLF4J 和Logback
四、反射
Class 类
访问字段
调用方法
调用构造器
获取继承关系
动态代理
五、注解
使用注解
定义注解
处理注解
六、泛型
什么是泛型
使用泛型
编写泛型
擦拭法
extends 通配符
super 通配符
泛型和反射
七、集合
Java 集合简介
使用 List
编写 equals 方法
使用 Map
编写 equals 和 hashCode
使用 EnumMap
使用 TreeMap
使用 Properties
使用 Set
使用 Queue
使用 PriorityQueue
使用 Deque
使用 Stack
使用 Iterator
使用 Collections
八、IO
File 对象
InputStream
OutputStream
Filter 模式
操作 Zip
读取 classpath 资源
序列化
Reader
Writer
PrintStream 和 PrintWriter
使用 Files
九、日期与时间
基本概念
Date 和 Calendar
LocalDateTime
ZonedDateTime
DateTimeFormatter
Instant
最佳实践
十、单元测试
编写 JUnit 测试
使用 Fixure
异常测试
条件测试
参数化测试
十一、正则表达式
正则表达式简介
匹配规则
复杂匹配规则
分组匹配
非贪婪匹配
搜索和替换
十二、加密与安全
编码算法
哈希算法
BouncyCastle
Hmac 算法
对称加密算法
口令加密算法
密钥交换算法
非对称加密算法
签名算法
数字证书
十三、多线程
多线程基础
创建新线程
线程的状态
中断线程
守护线程
线程同步
同步方法
死锁
使用 wait 和 notify
使用 ReentrantLock
使用 Condition
使用 ReadWriteLock
使用 StampedLock
使用 Concurrent 集合
使用 Atomic
使用线程池
使用 Future
使用 CompletableFuture
使用 ForkJoin
使用 ThreadLocal
十四、Maven基础
Maven 介绍
依赖管理
构建流程
使用插件
模块管理
使用 mvnw
发布 Artifact
十五、网络编程
网络编程基础
TCP 编程
UDP 编程
发送 Email
接收 Email
HTTP 编程
RMI 远程调用
十六、XML 与 JSON
XML 简介
使用 DOM
使用 SAX
使用 Jackson
使用 JSON
十七、JDBC 编程
JDBC 简介
JDBC 查询
JDBC 更新
JDBC 事务
JDBC Batch
JDBC 连接池
十八、函数式编程
Lambda 基础
方法引用
使用 Stream
创建 Stream
使用 map
使用 filter
使用 reduce
输出集合
其它操作
十九、设计模式
创建型模式
工厂方法
抽象工厂
生成器
原型
单例
结构型模式
适配器
桥接
组合
装饰器
外观
享元
代理
行为型模式
责任链
命令
解释器
迭代器
中介
备忘录
观察者
状态
策略
模板方法
访问者
二十、Web 开发
Web 基础
Servlet 入门
Servlet 开发
Servlet 进阶
重定向与转发
使用 Session 和 Cookie
JSP 开发
MVC 开发
MVC 高级开发
使用Filter
修改请求
修改响应
使用 Listener
部署
二十一、Spring 开发
IoC 容器
IoC 原理
装配 Bean
使用 Annotation 配置
定制 Bean
使用 Resource
注入配置
使用条件装配
使用 AOP
装配 AOP
使用注解装配 AOP
AOP 避坑指南
访问数据库
使用 JDBC
使用声明式事务
使用 DAO
集成 Hibernate
集成 JPA
集成 MyBatis
设计 ORM
开发 Web 应用
使用 Spring MVC
使用 REST
集成 Filter
使用 Interceptor
处理 CORS
国际化
异步处理
使用 WebSocket
集成第三方组件
集成 JavaMail
集成 JMS
使用 Scheduler
集成 JMX
二十二、Spring Boot 开发
第一个 Spring Boot 应用
使用开发者工具
打包 Spring Boot 应用
瘦身 Spring Boot 应用
使用 Actuator
使用 Profiles
使用 Conditional
加载配置文件
禁用自动配置
添加 Filter
集成第三方组件
集成 Open API
访问 Redis
集成 Artemis
集成 RabbitMQ
集成 kafka
以上是关于廖雪峰Java教程学习笔记的主要内容,如果未能解决你的问题,请参考以下文章