愚而好自用,贱而好自专。

  1. 类是所有Java应用的构建模块,Java程序中的所有内容都必须放在类中

  2. 当将一个字符串与一个非字符串拼接时,后者会转换成字符串,任何一个人Java对象都可以转换成字符串

    java
    1
    2
    3
    int age = 18;
    String rating = "PG" + age;
    System.out.println(rating);

    PG18

  3. String类对象是不可变的,即不可以直接修改

    判断两个字符串是否相等时,尽量用.equals()方法

    • 使用.equals()方法进行比较时,你比较的是字符串的内容是否相同。
    • 使用==运算符时,你比较的是两个引用是否指向内存中的同一个对象。
  4. 字符串的索引方式 s.charAt(i)

  5. 输入

    java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(System.in);
    String str = sc.next(); // 读入下一个字符串 遇到空格、回车等空白字符时停止输入
    String line = sc.nextLine(); // 读入下一行 遇到空格不会停止输入,遇到回车才会停止
    int x = sc.nextInt(); // 读入下一个整数
    float y = sc.nextFloat(); // 读入下一个单精度浮点数
    double z = sc.nextDouble(); // 读入下一个双精度浮点数
    }
    }
  6. String常用API:

    • length():返回长度
    • split(String regex):分割字符串
    • indexOf(char c)indexOf(String str)lastIndexOf(char c)lastIndexOf(String str):查找,找不到返回-1
    • equals():判断两个字符串是否相等,注意不能直接用==
    • compareTo():判断两个字符串的字典序大小,负数表示小于,0表示相等,正数表示大于
    • startsWith():判断是否以某个前缀开头
    • endsWith():判断是否以某个后缀结尾
    • trim():去掉首尾的空白字符
    • toLowerCase():全部用小写字符
    • toUpperCase():全部用大写字符
    • replace(char oldChar, char newChar):替换字符
    • replace(String oldRegex, String newRegex):替换字符串
    • substring(int beginIndex, int endIndex):返回[beginIndex, endIndex)中的子串
    • toCharArray():将字符串转化成字符数组
  7. StringBuilderStringBuffer说明

    如果有多次字符串拼接操作,每一次都会构建一个新的String对象,即耗时,又浪费空间;

    String不能被修改,如果打算修改字符串,可以使用StringBuilderStringBuffer

    StringBuffer线程安全,速度较慢;StringBuilder线程不安全,速度较快。

    java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    StringBuilder builder = new StringBuilder("Hello ");  // 初始化
    sb.append("World"); // 拼接字符串
    System.out.println(builder);

    for (int i = 0; i < builder.length(); i ++ ) {
    builder.setCharAt(i, (char)(builder.charAt(i) + 1)); // 读取和写入字符
    }

    System.out.println(sb);
  8. Arrays常用API:

    • 属性length:返回数组长度,注意不加小括号

    • Arrays.sort():数组排序

      • Arrays.sort(int[] a, int fromIndex, int toIndex)对下标[fromIndex, toIndex)升序

      • 降序排列的两种方法:

        •   import java.util.Comparator;
            Arrays.sort(array, new Comparator<Integer>() {
                        public int compare(Integer o1, Integer o2) {
                            return o2 - o1;
                        }
                    });
            <!--code3-->
          
          
        • 注意降序都必须用Integer而非int

    • Arrays.fill(int[] a, int val):填充数组

    • Arrays.toString():将数组转化为字符串

    • Arrays.deepToString():将多维数组转化为字符串

    • 数组不可变长

    • 使用Arrays需要import java.util.Arrays

  9. java中允许有长度为0的数组,注意和null的区别

    • 状态不同

      • 长度为 0 的数组是一个有效的数组对象,只是没有包含任何元素。 String[] emptyArray = new String[0];
      • null 数组表示没有引用任何数组对象。String[] nullArray = null;
    • 属性访问

      • 对长度为 0 的数组,可以安全地访问其属性,例如 length,它会返回 0。
      • null 数组,访问任何属性(如 length)会抛出 NullPointerException
    • 元素访问

      • 对长度为 0 的数组,访问任何元素都会抛出 ArrayIndexOutOfBoundsException
      • null 数组,访问任何元素都会抛出 NullPointerException
  10. String s1 = "abc";
    String s2 = "a" + "b" + "c";
    System.out.println(s1 == s2); 
    // 返回true,因为字符串字面量(比如 "abc")是在编译时就确定的,并且存储在常量池中。当程序运行时,如果遇到相同的字符串字面量,Java虚拟机(JVM)会从常量池中获取引用,而不是重新创建一个新的字符串对象。
    
    // 如果s2中有变量则为flase
    <!--code4-->
    
        如此一来,多态会有一个弊端:当调用子类中独有而父类中没有的成员方法时,在编译阶段会出错
    
    
  11. 不同权限的访问能力

    public protected 默认 private
    同一类中
    同一包中的类
    不同包的子类
    不同包中的无关类
  12. final: 不可改变,最终的含义。可以用于修饰类、方法和变量

    - 类:被修饰的类,不能被继承
    - 方法:被修饰的方法,不能被重写
    - 变量:被修饰的变量,有且仅能被赋值一次
    
  13. 接口中的抽象方法默认会自动加上public abstract

    接口中定义的成员变量默认会加上: `public static final`修饰
    
    java8开始允许在接口中定义具有方法体的方法,但是必须声明`default`,这是为了避免在接口升级的场景下,每个实现接口的类都要做更改的麻烦
    
  14. 泛型的细节:

    • 泛型中不能写基本数据类型
    • 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型
    • 如果不写泛型,类型的默认是Object
  15. 几个Set的使用场景

    • HashSet:无序,不重复,无索引 (如果要去重,默认使用HashSet
    • LinkedHashSet:有序,不重复,无索引 (如果要去重且存取有序,使用LinkedHashSet
    • TreeSet:无序,不重复,可排序 (基于红黑树实现,增删改查性能较好)
  16. 异常捕获四个问题

    java
    1
    2
    3
    4
    5
    6
    try{
    编写可能会出现异常的代码
    }catch(异常类型 e){
    处理异常的代码
    //记录日志/打印异常信息/继续抛出异常
    }
    • 如果try中没有遇到问题,怎么执行?

      会把try里的所有代码全部执行,不会执行catch里的代码

    • 如果try中可能会遇到多个问题,怎么执行?

      遇到第一个问题后直接执行catch里的代码,后面的问题不会执行

      可以写多个catch与之对应,父类异常需要写在下面

    • 如果try中遇到的问题没有被捕获,怎么执行?

      会直接将异常虚拟机处理,并停止执行代码

    • 如果try中遇到了问题,那么try下面的其他代码还会执行吗?

      不会

    一般遇到异常捕获之后会使用e.printStackTrace()去打印信息,不会终止程序的运行

  17. 抛出异常throwsthrow的比较

    • throws:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常

      java
      1
      public void 方法名(参数) throws 异常类名1,异常类名2…{   }	

      编译时异常 必须要写;运行时异常 可以不写

      一般是给方法的调用者看的

    • throw 写在方法内,结束方法。手动抛出异常对象,交给调用者。方法中下面的代码不再执行

  18. 创建自定义异常的四个步骤:

    • 定义异常类
    • 写继承关系
    • 空参构造
    • 带参构造