Skip to content

sandogdog/Java_Study_Notes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 

Repository files navigation

Java

前言:三狗狗的Java杂记,希望所有笔记都成为我前进的脚印。


Javaの日常

1.sort() 方法:Arrays.sort() 是 Arrays 类中的一个静态方法,用于对数组进行排序。默认情况下,它对数组中的元素进行升序排序。

eg:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums1 = {5, 2, 9, 1, 5, 6};
        Arrays.sort(nums1);
        System.out.println(Arrays.toString(nums1)); // 输出: [1, 2, 5, 5, 6, 9]
    }
}

降序排序

对于对象数组(如 Integer[]),可以直接使用 Arrays.sort() 结合 Collections.reverseOrder() 实现降序排列:

Integer[] nums1 = {5, 2, 9, 1, 5, 6};
Arrays.sort(nums1, Collections.reverseOrder());
// 排序后,nums1 = [9, 6, 5, 5, 2, 1]

2.final 变量:被 final 修饰的变量在赋值之后,就不能再被重新赋值了。这种特性常用于定义常量。


3.用 boolean 命名的函数通常表示该函数会返回一个布尔值(true 或 false)。这类函数的主要目的是执行某种逻辑判断或条件验证,然后根据结果返回布尔类型的值。带有布尔返回类型的函数通常用于做逻辑判断,并根据条件返回 true 或 false。这种命名方式使代码更具可读性,开发者在调用这些函数时,可以直观地理解其功能与返回值的含义。


4.在 Java 中,双引号 (" ") 是用来表示字符串 (String) 的,而单引号 (' ') 是用来表示字符 (char) 的。


5.在 Java 中,字符用单引号表示,而字符串用双引号表示。== 可以用于比较两个 char 类型的值,但对于 String 类型的值,应使用 .equals() 方法进行比较。


6.静态上下文(例如静态方法或静态块)不能直接访问类的非静态成员(包括非静态方法和变量),因为静态成员属于类本身,而非静态成员属于类的实例。

例子:

假设你有以下代码:

public class Main {
    public void judgment(char[][] grid) {
        // Some code
    }

    public static void main(String[] args) {
        judgment(grid);  // Error: Non-static method 'judgment(char[][])' cannot be referenced from a static context
    }
}

问题

在 main 方法中,你尝试调用非静态的 judgment 方法,但 main 是静态方法。静态方法无法直接访问非静态方法,因为非静态方法依赖于类的具体实例。

解决方案

有两种常见的解决方案:

1)将方法变为静态方法

如果该方法不依赖类的实例,可以将其声明为静态方法:

public class Main {
    public static void judgment(char[][] grid) {
        // Some code
    }

    public static void main(String[] args) {
        char[][] grid = {{'B', 'W'}, {'W', 'B'}};
        judgment(grid);  // Now it works
    }
}

2)创建类的实例并调用非静态方法

如果 judgment 方法依赖于类的实例,则在 main 方法中创建类的实例,并通过该实例调用非静态方法:

public class Main {
    public void judgment(char[][] grid) {
        // Some code
    }

    public static void main(String[] args) {
        Main mainInstance = new Main();
        char[][] grid = {{'B', 'W'}, {'W', 'B'}};
        mainInstance.judgment(grid);  // No error now
    }
}

7.类的实例和静态的区别

*实例成员(非静态成员):每个类的实例(对象)都有自己独立的一份数据或方法。这些成员依赖于类的具体对象来访问或调用。例如,普通的类变量和方法通常是非静态的,属于类的实例。

*静态成员:静态成员是属于类本身的,不依赖于类的实例。静态成员可以直接通过类名调用,无需创建类的对象。

例子说明

1)实例成员

public class Person {
    // 实例成员变量
    private String name;

    // 构造器用于初始化类的实例
    public Person(String name) {
        this.name = name;
    }

    // 实例方法
    public void sayHello() {
        System.out.println("Hello, my name is " + name);
    }

    public static void main(String[] args) {
        // 创建类的实例(对象)
        Person person = new Person("Alice");
        
        // 调用实例方法
        person.sayHello();  // 输出: Hello, my name is Alice
    }
}

在这个例子中,name 和 sayHello() 方法都是依赖于类的实例的。我们不能直接通过类名 Person 来调用 sayHello(),必须先创建 Person 类的对象 person,再通过这个对象调用该方法。

2)静态成员

public class Person {
    // 静态成员变量
    private static String species = "Homo sapiens";

    // 静态方法
    public static void showSpecies() {
        System.out.println("Species: " + species);
    }

    public static void main(String[] args) {
        // 可以直接通过类名调用静态方法
        Person.showSpecies();  // 输出: Species: Homo sapiens
    }
}

在这个例子中,species 和 showSpecies() 是静态的,它们属于类本身,和任何特定的实例无关。我们可以直接通过类名 Person 调用 showSpecies(),无需创建类的实例。


8.@Data 是 Lombok 库中的一个注解,用于简化 Java 类中常见的样板代码。它会自动生成以下常用的代码:

  1. Getter 和 Setter 方法

    • 为类中的所有字段自动生成相应的 getset 方法。
  2. toString() 方法

    • 自动生成 toString() 方法,输出对象的字段值,便于调试和日志记录。
  3. equals()hashCode() 方法

    • 自动生成 equals()hashCode() 方法,用于对象比较和散列操作。
  4. RequiredArgsConstructor

    • 生成一个包含所有 final 字段的构造方法,以及所有标记了 @NonNull 注解的字段。

使用 @Data 可以避免手动编写重复的代码,从而使代码更简洁、更易维护。它通常适用于简单的数据传输对象(DTO)或实体类中。

示例

@Data
public class User {
    private Long id;
    private String name;
    private String email;
}

这个注解将会自动生成 idnameemail 的 Getter、Setter、toString()equals()hashCode() 方法。

注意:

  • 如果你需要定制某些方法,可能需要自己手动编写这些方法,避免 Lombok 的自动生成与手动代码冲突。

9.Java集合框架体系

image


10.算法复杂度分析

image

image

image

image

image

image

image

image


11.ArrayList数据结构——数组

image

image

image

image

image


12.ArrayList源码分析

image


13.ArrayList底层原理及构造函数相关面试题回答

image

image


14.ArrayList如何实现数组和List之间的转换

image

image


15.LinkedList数据结构——链表

image

image

image

image

image

image


16.ArrayList和LinkedList的区别是什么

image

image

image


17.二叉树

image

image

image


18.红黑树

image

image

image


19.散列表

image

image

image

image

image

image

image


20.HashMap的实现原理

image

image

image


21.HashMap的put方法的具体流程

image

image

image

image


22.HashMap的扩容机制

image

image


23.HashMap的寻址算法和数组长度为什么是2的n次幂

image

image

image


24.HashMap在1.7情况下的多线程死循环问题

image

image

image


25.JVM介绍、运行流程

image

image

image

image


26.什么是程序计数器

image

image

image


27.详细介绍下Java堆

image

image

image


28.什么是虚拟机栈

image

image

image

image

image

image


29.能不能解释一下方法区

image

image

image

image


30.直接内存

image

image

image

image


31.类加载器、双亲委派

image

image

image

image

image

image


32.类装载的执行过程

image

image

image

image

image

image

image

image


33.对象什么时候可以被垃圾器回收

image

image

image

image

image

image


34.JVM垃圾回收算法有哪些

image

image

image

image

image


35.JVM中的分代回收

image

image

image

image


36.JVM有哪些垃圾回收器

image

image

image

image

image


37.G1垃圾回收器

image

image

image

image

image

image

image


38.垃圾回收——强引用、软引用、弱引用、虚引用的区别

image

image

image

image


39.JVM调优参数可以在哪里设置参数值

image

image

image

image


40.用JVM调优的参数都有哪些呢?

image

image

image

image

image

image


41.JVM调优的工具

image

image

image

image

image

image

image

image


42.Java内存泄漏的排查思路

主要考虑堆的内存泄漏

image

image

image

image


43.CPU飙高排查方案与思路

image

image

image

image


44.关于@ApiModelProperty

@ApiModelProperty 是 Swagger 注解库中的一部分,用于生成 API 文档时为模 型类的属性提供描述信息,帮助生成更清晰、易于理解的接口文档。它通常与 @ApiModel 注解一起使用,标注在模型类的字段上,指定字段的详细信息,以便在自动生成的 API 文档中更准确地描述每个属性的功能和含义。

常用属性: value:用于描述字段的含义或用途。 required:是否为必填字段,默认为 false。 example:字段的示例值,帮助生成文档时显示实际的字段示例。 notes:补充的说明,可以提供更详细的描述。

eg:

import io.swagger.annotations.ApiModelProperty;

public class User {
    
    @ApiModelProperty(value = "用户的唯一标识", required = true, example = "1")
    private Long id;
    
    @ApiModelProperty(value = "用户的姓名", example = "张三")
    private String name;
    
    @ApiModelProperty(value = "用户的邮箱地址", example = "example@example.com")
    private String email;
    
    // Getters and Setters
}

45.在 Java 开发中,空指针异常(NullPointerException)通常发生在以下几种常见情况:

  1. 对空对象调用方法
    如果你试图调用一个为 null 的对象的实例方法,会抛出 NullPointerException

    String str = null;
    int length = str.length(); // 会抛出 NullPointerException
  2. 访问空对象的成员变量
    如果你试图访问一个为 null 的对象的成员变量,也会抛出 NullPointerException

    class Person {
        String name;
    }
    Person p = null;
    String name = p.name; // 会抛出 NullPointerException
  3. 使用空数组访问元素
    如果数组本身为 null,并尝试访问其元素,也会抛出 NullPointerException

    int[] arr = null;
    int value = arr[0]; // 会抛出 NullPointerException
  4. 对空集合调用方法
    如果集合对象是 null,并且尝试调用它的方法,如 add(), get() 等,也会导致 NullPointerException

    List<String> list = null;
    list.add("item"); // 会抛出 NullPointerException
  5. 自动拆箱操作时遇到 null
    当你试图将一个 null 值拆箱为原始类型(例如 Integer 拆箱为 int)时,也会引发 NullPointerException

    Integer num = null;
    int n = num; // 会抛出 NullPointerException
  6. 通过 null 调用静态方法
    尽管静态方法不需要对象实例,但如果你通过 null 来调用静态方法时,仍然会发生 NullPointerException

    SomeClass obj = null;
    obj.someStaticMethod(); // 会抛出 NullPointerException

预防 NullPointerException

  • 使用 null 检查:在操作对象前,检查是否为 null

    if (str != null) {
        int length = str.length();
    }
  • 使用 Optional 类型(Java 8 及以上版本):Optional 可以有效避免显式的 null 检查。

    Optional<String> optionalStr = Optional.ofNullable(str);
    optionalStr.ifPresent(s -> System.out.println(s.length()));
  • 避免返回 null:尽量避免方法返回 null,而是返回一个空对象或使用 Optional

  • 使用 Objects.requireNonNull():在方法开始处进行 null 检查。

    Objects.requireNonNull(str, "Input string cannot be null");

通过这些方法,你可以有效减少 NullPointerException 的发生,并提高代码的健壮性。

About

三狗狗的Java杂记,希望所有笔记都成为我前进的脚印。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published