画布 1
Java编程语言
  安装
    版本选择&下载
      jdk11
        2018/9
      jdk17
        2021/9
    验证
      环境变量配置
        JAVA_HOME
          Java安装路径/Contents/Home
        CLASSPATH
          $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
        PATH
          $JAVA_HOME/bin:$PATH:.
      命令行验证
        java - version
        javac
          Java编译器
          将Java源代码（.java文件）编译成Java字节码（.class文件）
  基础知识
    基本语法
      语句后加;
      类、方法都需要{}
    数据类型
      八大基本数据类型
        整数
          int
            包装类：Integer
          long
            包装类：Long
        小数
          double
            包装类：Double
          short
            包装类：Short
        布尔值
          boolean
            包装类：Boolean
        char
          2个字节
        byte
          1个字节
      String
        创建
          public String()
            创建一个空白字符串对象，不含有任何内容
            String s1 = new String();
          public String(char[] chs)
            根据字符数组的内容，来创建字符串对象
            char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
          public String(byte[] bys)
            根据字节数组的内容，来创建字符串对象
            byte[] bys = {97, 98, 99};
String s3 = new String(bys);
          String s = “abc”;
            直接赋值的方式创建字符串对象
            String s4 = "abc";
            字符串内容就是abc
        字符串对比
          ==
            内存地址比较
          equals()
            内容比较
        字符串拼接
          "+"
          concat()
        转换
          String类型转换成数字时可直接使用 包装类.valueOf()
          Long.valueOf()
          Integer.valueOf()
    运算符
      三目运算符
        condition ? value1 : value2
          condition是一个布尔表达式，用于确定选择哪个值。
          condition为true，那么选择value1，否则选择value2。
    控制语句
      if
        if (condition1) {
// condition1为真时执行的代码块
} else if (condition2) {
// condition1为假，condition2为真时执行的代码块
} else {
// condition1和condition2都为假时执行的代码块
}
          condition是一个布尔表达式
          值为true时，执行花括号内的代码块
          值为false时，跳过代码块继续执行后续代码
      while
        重复执行一段代码，直到给定的条件不再满足为止
        while (condition) {
// code to be executed
}
          condition是一个布尔表达式，表示循环条件，即判断循环是否应该继续。
          如果condition为true，那么将会执行花括号内的代码块，直到condition变成false。
          确保循环在合适的时候终止，否则可能会陷入无限循环
      do..while
      switch
        switch (expression) {
case value1:
// code block 1
break;
case value2:
// code block 2
break;
...
default:
// default code block
}
          expression是一个表达式，通常是一个变量或表达式的值，用于确定要执行哪个代码块。
          根据expression的值，选择匹配的case标签执行对应的代码块。
          每个case标签后面是一个代码块，如果匹配到该标签，那么就会执行相应的代码块，直到遇到break语句或switch语句结束。
          如果expression的值与任何case标签都不匹配，则执行default标签后的代码块。
          如果没有default标签，那么就什么也不会执行。
      for循环
        增强for循环 - foreach
          for (元素类型 变量名 : 集合名) {
// 循环体语句
}
            元素类型是集合中元素的数据类型
            变量名是代表每个元素的变量名
            集合名是要遍历的集合
        for循环 - fori
          for (int i = 0; i < 数组长度; i++) {
// 循环体语句
}
            int i = 0是初始化语句
            i < 数组长度是判断条件
            i++是更新语句
            循环体语句是要执行的循环体语句
            每次循环中，变量i会自动加1，直到i等于数组长度时，循环停止。
    关键字
      break
        终止for、while、do-while等循环语句的执行
        程序跳出当前循环体并继续执行循环语句后面的代码
        提前结束循环
      continue
        跳过当前循环的剩余代码，进入下一次循环
        跳过当前循环，不结束循环
  面向对象（OOP）
    类和对象
      类的构造方法
      成员变量
      成员方法
    封装
      使用控制修饰符实现类的封装
      控制修饰符
        public
        private
        protected
    继承
      实现类的层次结构
      代码重用和可扩展性
    多态
      不同对象之间的统一访问接口
      代码的灵活性和可维护性
  异常
    概念
      程序在运行时发生的错误或意外情况
        空指针引用
        数组越界
        文件不存在
    处理机制
      程序可以在异常发生时进行处理，避免程序因异常而崩溃
    try-catch语句块
      捕获并处理异常
      try中包含可能会引发异常的代码
      catch块中包含处理异常的代码
    finally块
      代码无论是否发生异常都会执行
      用于释放资源等操作
    异常类
      异常都是通过类来表示的
      根据异常类型进行不同的处理
      常见异常类
        RuntimeException
        NullPointerException
        ArrayIndexOutOfBoundsException
    抛出异常
      通过throw语句在代码中抛出异常
      由上层调用者进行处理
    自定义异常
      继承Exception/RuntimeException类来自定义异常类
  集合框架
    方便存储和操作对象
    分类
      List集合
        有序的集合
        可以包含重复元素
        实现类
          ArrayList
          LinkedList
        常用方法
          add(E e)
            将元素e添加到列表的末尾。
          add(int index, E element)
            将元素element插入到指定的索引位置index。
          get(int index)
            返回列表中指定索引位置index的元素。
          set(int index, E element)
            将指定索引位置index的元素替换为新的元素element。
          remove(int index)
            删除列表中指定索引位置index的元素。
          remove(Object o)
            删除列表中第一个与给定对象o相等的元素。
          indexOf(Object o)
            返回第一个匹配给定对象o的元素的索引，如果没有找到，则返回-1。
          size()
            返回列表中的元素数量。
          isEmpty()
            如果列表中没有任何元素，则返回true。
          clear()
            从列表中删除所有元素。
          contains(Object o)
            如果列表包含指定对象o，则返回true。
          toArray()
            将列表转换为数组。
          subList(int fromIndex, int toIndex)
            返回列表中指定范围内的元素，包括fromIndex，但不包括toIndex。
      Set集合
        不重复的集合
        元素不保证顺序
        实现类
          HashSet
          TreeSet
      Map集合
        键值对集合
        可以通过键来获取值
        实现类
          HashMap
          TreeMap
        常用方法
          put(key, value)
            将指定的键值对添加到Map中。
          get(key)
            获取指定键对应的值，如果Map中不存在该键，则返回null。
          remove(key)
            从Map中删除指定键的键值对。
          containsKey(key)
            判断Map中是否包含指定的键。
          containsValue(value)
            判断Map中是否包含指定的值。
          keySet()
            返回Map中所有键的集合。
          values()
            返回Map中所有值的集合。
          entrySet()
            返回Map中所有键值对的集合。
          size()
            返回Map中键值对的个数。
          clear()
            清空Map中所有键值对。
          isEmpty()
            判断Map是否为空。
    迭代
「对集合进行遍历」
      使用Iterator迭代器
      foreach循环
        集合名.forEach(元素变量 -> {
// 循环体语句
});
          集合名是要遍历的集合
          元素变量是代表每个元素的变量名
          循环体语句是要执行的循环体语句
          循环体语句使用Lambda表达式表示
    排序
      实现Comparable接口
      实现Comparator接口
        compare()
          返回负数，表示第一个参数小于第二个参数
          返回0，表示两个参数相等
          返回正数，表示第一个参数大于第二个参数
        比较2个整数：Integer.compare(a, b);
    泛型
      指定集合中存储的元素类型
      避免类型转换的问题
  Java核心类库
    I/O
      处理文件、网络通信等操作
      流
        I/O操作都是通过流来实现
        字节流
          处理二进制数据
        字符流
          文本数据
      输入流和输出流
        输入流用于读取数据
        输出流用于写入数据
      文件I/O
        File类和流进行文件读写
        常用的类
          FileInputStream
          FileOutputStream
          BufferedReader
          PrintWriter
        File常用操作
          创建新文件或目录
            boolean createNewFile()
              创建一个新的、空的文件
              如果文件已经存在，则返回false
            boolean mkdir()
              创建一个新的、空的目录
              如果目录已经存在，则返回false
            boolean mkdirs()
              创建一个新的、空的目录
              如果目录已经存在，则返回false
              如果中间路径不存在，则会创建中间路径上缺失的所有目录
          判断文件或目录是否存在
            boolean exists()
              判断文件或目录是否存在
            boolean isFile()
              判断当前File对象是否代表一个文件
            boolean isDirectory()
              判断当前File对象是否代表一个目录
          获取文件或目录的信息
            String getName()
              获取文件或目录的名称
            String getPath()
              获取文件或目录的路径
            long lastModified()
              获取文件或目录的最后修改时间
            long length()
              获取文件的长度（单位为字节）
          遍历目录
            File[] listFiles()
              获取当前目录下的所有文件和子目录
            String[] list()
              获取当前目录下的所有文件和子目录的名称（不包括路径信息）
          删除文件或目录
            boolean delete()
              删除当前File对象代表的文件或目录。如果是目录，则该目录必须为空才能删除
          修改文件或目录名
            boolean renameTo(File dest)
              将当前文件或目录重命名为指定的文件或目录。如果dest已经存在，则替换它
        文件读取、写入
          InputStream/OutputStream
            FileInputStream inputStream = new FileInputStream("input.txt");
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
String fileContent = new String(buffer, 0, len, "UTF-8");
System.out.println(fileContent);
inputStream.close();
              创建一个FileInputStream对象，传入要读取的文件路径作为参数
              创建一个byte数组，用于存储读取到的数据
              调用read方法读取文件内容，并将读取到的数据存储到buffer数组中
              将读取到的数据转换为字符串
              关闭FileInputStream对象
            FileOutputStream fileOutputStream = new FileOutputStream("file.txt");
String data = "Hello, world!";
byte[] bytes = data.getBytes();
fileOutputStream.write(bytes);
fileOutputStream.close();
              创建一个FileOutputStream对象，指定要写入的文件的路径和名称。
              将要写入文件的数据转换为byte数组。
              使用FileOutputStream对象的write方法将数据写入文件。
              在写入完成后，要调用FileOutputStream对象的close方法释放资源。
          BufferedReader/BufferedWriter
            BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
reader.readLine()
            BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
writer.write(写入的Str);
writer.newLine();
          Scanner读取文件内容
            Scanner scanner = new Scanner(new File("input.txt"));
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
          Files 类读写文件
            Path inputPath = Paths.get("input.txt");
byte[] fileBytes = Files.readAllBytes(inputPath);
            Path outputPath = Paths.get("output.txt");
Files.write(outputPath, fileBytes);
      序列化
Serialization
        对象转换为字节序列进行传输或者存储
        反序列化
          将字节序列转换回对象
    多线程
    网络编程
  数据库编程
  Web开发
  安全编程
  性能优化
  新特性