廖雪峰Java教程学习笔记

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了廖雪峰Java教程学习笔记相关的知识,希望对你有一定的参考价值。

一、Java 快速入门

Java 简介

  • Java 特点
  1. Java 是基于 JVM 虚拟机的跨平台语言,一次编写到处运行
  2. Java 程序易于编写且有垃圾回收机制,不必考虑内存管理
  3. Java 虚拟机拥有工业级的稳定性和高度优化的性能,经受了长时间的考验
  4. Java 拥有最广泛的开源社区支持,各种高质量组件随时可用
  • Java 应用领域
  1. 互联网和企业应用,这是 Java EE 的长期优势和市场地位
  2. 大数据平台,主要有 Hadoop、Spark、Flink 等
  3. 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.*;
  • 简单类名的查找顺序
  1. 查找当前 package 是否存在此类
  2. 查找 import 的包中是否存在此类
  3. 查找 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这个类时,会依次查找
  1. <当前目录>\\abc\\xyz\\Hello.class
  2. C:\\work\\project1\\bin\\abc\\xyz\\Hello.class
  3. 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教程学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

廖雪峰Git教程学习笔记

廖雪峰Git教程学习笔记

python廖雪峰教程 学习笔记

廖雪峰SQL教程学习笔记

廖雪峰SQL教程学习笔记

廖雪峰Git教程学习笔记