Java学习笔记

Java学习笔记

一、Java常用API


  1. 字符串遍历方式:

    • String.charAt();
    • String.subString(beginIndex, endIndex);
    • String.toCharArray();
    • 使用方法:
      // 方法一:
      for(int i=0; i < str.length(); i++) {
         System.out.println(str.charAt(i)); 
      }
      
      // 方法二
      for(int i=0; i < str.length(); i++) {
         System.out.println(str.substring(i,i+1)); 
         
      }
      
      // 方法三
      char[]  c = str.toCharArray();
      for(int i=0; i < c.length; i++) {
         System.out.println(c[i]);
      }
         
  2. 字符串拼接:

    • 常用拼接方式:
      • 使用+连接
      • StringBuffer.append()
      • StringBuilder.append()
        • 区别:StringBuffer仅仅比StringBuilder多了synchronized关键字。
      • String.concat(string_01)
        • 该方法是String类的实例方法
      • String.join(string_01, string_02, ……);
        • 该方法是String类的静态方法
        • 源代码中,调用StringJoiner类的实例方法join()
      • StringUtils.join(string_01, string_02, ……)
    • 直接使用+连接多个字符串,系统性能消耗太大。虽然编译器会对其进行优化(使用StringBuilder对象),但编译后生成的StringBuilder会很多。
    • 建议:
      • 使用StringBuilder对象进行拼接。
  3. 字符串反转:

    • 常用反转方法:

      1. 字符串从后往前遍历。
      2. StringBuilder的reverse()
      3. 前后字符串互换
      4. Collections的静态方法reverse()
    • 示例:

      // 方法一-字符串从后往前遍历
      String output = new String();
      for (int i = ("asdf".length() - 1); i >= 0; i--) {
         output += ("asdf".charAt(i));
      }
      
      // 方法二-StringBuilder的reverse()
      StringBuilder builder = new StringBuilder("asdf");
      String output = builder.reverse().toString();
      
      // 方法三-前后字符串互换
      char[] array = "asdf".toCharArray();
      int length = array.length - 1;
      int half = (int) Math.floor(array.length / 2);
      char c;
      for (int i = length; i >= half; i--) {
         c = array[length - i];
         array[length - i] = array[i];
         array[i] = c;
      }
      
      // 方法四-Collections的静态方法reverse()
      List<Character> aLetterList = new ArrayList<>();
      for (char aLetter : "asdf".toCharArray()) {
         aLetterList.add(aLetter);
      }
      /* 字符串反转 */
      Collections.reverse(aLetterList);
      StringBuilder builder = new StringBuilder();
      for (char letter : aLetterList) {
         builder.append(letter);
      }
      
         

二、Web服务器基础


  1. 静态资源与动态资源:

    • 静态资源:由客户端向服务器取得已经存在的相应文件,服务器返回给客户端,并由客户端渲染解析。
    • 动态资源:客户端请求的动态资源,先由服务器交由数据库处理,再将处理好的内容返回给客户端。
  2. HTTP协议:

    • HTTP请求方法(以不同的方式操作指定资源):
      • Get:向指定资源发出读取数据请求。
      • Head:向指定资源发出读取数据请求,服务器不返回资源的正文部分,仅有头部信息(元数据)。
      • Post: 向指定资源提交数据
        • 例如:提交表单、上传数据
      • Put:向指定资源提交数据
      • Delete:请求服务器删除URL指定的资源
      • Trace:回显服务器收到的请求
      • Options:使服务器传回该资源所支持的所有HTTP请求方法
      • Connect:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
      • 注意事项:
        • 以上的请求方法一定要被对应的资源所支持。
        • HTTP服务器至少应该实现GET和HEAD方法
    • 状态码:
      • 1xx: 消息——请求已被服务器接收,继续处理
      • 2xx: 成功——请求已成功被服务器接收、理解、并接受
      • 3xx: 重定向——需要后续操作才能完成这一请求
      • 4xx:请求错误——请求含有词法错误或者无法被执行
      • 5xx: 服务器错误——服务器处理某个正确请求时发生错误
    • 请求报文:
      • 构成:请求行 + 请求头 + 请求正文
      • 如图所示
    • 相应报文:
      • 构成: 响应行 + 响应头 + 响应正文
      • 如图所示:

三、异常


  1. JVM默认异常处理方式:

    • 将异常名称 + 异常详细信息 + 异常位置输出在控制台上,同时程序停止运行。
    • 示例:
      // 控制台输出内容
      Exception in thread "main" java.lang.ArithmeticException: 
      
      +
      
      / by zero 
      
      +
      
      at cn。itcast_01.ExceptionDemo.main(ExceptionDemo.java:31)
         
  2. Throwable类的常见方法:

    • getMessage(): 返回异常详细信息
    • toString(): 返回异常详细信息 + 异常名称
    • printStackTrace(): 返回异常详细信息 + 异常名称 + 异常位置
  3. 异常的分类:

    • Exception(extends Throwable)
      • 可检测异常(Checked Exception):必须被显式捕获处理
        • 一般为代码逻辑异常,可以通过try-catch块处理。
      • 不检测异常(Unchecked Exception):也叫做运行时异常。
    • Error(extends Throwable)
      • 一般为JVM异常,不可被捕获处理。
  4. 异常的注意事项:

    • 多个catch块排列顺序:由细到粗、从子类到父类
    • throw语句抛出异常后,之后额语句不会执行。

四、集合


  1. 迭代器的使用
    • 实现Collection接口的类
      1. 与while循环结合
        // 创建一个List
        ArrayList<String> list = new ArrayList<>();
        
        // 创建迭代器
        Iterator iterator = list.iterator();
        
        // 迭代列表
        /**
        * Iterator.next(): 返回下一元素,并往后移一位
        */
        while(iterator.hasNext()) {
           System.out.println(iterator.next());
        }
              
      2. forEach循环:
        • forEach循环本身就相当于一个迭代器
        • 示例i:
          for (String letter : list) {
             System.out.println(letter);
          }
                   
    • 实现Map接口的类
      1. 与while循环结合
        // 创建一个Map
        HashMap<String, Object> map = new HashMap<>();
        
        // 创建迭代器
        /**
        * 通过entrySet返回迭代器对象
        */
        Iterator iterator = map.entrySet().iterator();
        
        // 迭代遍历
        while (iterator.hasNext()) {
           System.out.println(iterator.next())
        }
              
      2. forEach循环
        • 示例:
          for (Object entrySet : map.entrySet()) {
             System.out.println(entrySet)
          }
                   

五、IO


  1. 数据流分类:

    • 字节流
      • 对应的IO类的方法以Stream方法结尾
    • 字符流:由一个个的字符组成的、有顺序的、单向的、有起点和终点的数据集合。
      • Java中的字符统一采用Unicode编码。即一个字符占2个字节
      • 对应的IO类的方法以Reader / Writer结尾
  2. IO类中的常见方法:

    • 可根据数据流的类别将IO类的方法分为两类,如图所示。
  3. 在 Java7 之后,可以在 try 块中打开流,最后程序会自动关闭流对象。

  4. 在字节输入流中,InputStream是所有字节输入流的父类,InputStream类有3个基本的读方法:

    • read():读取并返回一个字节的数据,
      • 如果返回-1,表示读到了输入流的末尾。
    • read(byte[] b):将数据读入一个字节数组,同时返回实际读取的字节数。
        • 如果返回-1,表示读到了输入流的末尾。
    • read(byte[] b, int off, int len):将最大字节数为len的数据读入到起始偏移位置为off的数组b中。
  5. 在字节输出流中,OutputStream是所有字节输出流的父类,OutputStream类有3个基本的写方法:

    • write(int b):往输出流中写入一个字节。
    • write(byte[] b):把数组b中的所有字节输出。
    • write(byte[] b, int off, int len): 把数组b中从起始偏移量off开始的len个字节的数据输出。
  6. 在字符输入流中,Reader是所有字符输入流的父类,Reader类有3个基本的读方法:

    • read():读取并返回一个字符。
    • read(char cbuf[]): 读取一系列字符到数组 cbuf[]中,返回值为实际读取的字符的数量。
    • read(char cbuf[],int off,int len): 读取 len 个字符,从数组 cbuf[] 的下标 off 处开始存放,返回值为实际读取的字符数量。

参考文章:七种java字符串拼接详解Java反转字符串的10种方法HTTP协议详解


  目录