前言:三狗狗的Java杂记,希望所有笔记都成为我前进的脚印。
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]
3.用 boolean 命名的函数通常表示该函数会返回一个布尔值(true 或 false)。这类函数的主要目的是执行某种逻辑判断或条件验证,然后根据结果返回布尔类型的值。带有布尔返回类型的函数通常用于做逻辑判断,并根据条件返回 true 或 false。这种命名方式使代码更具可读性,开发者在调用这些函数时,可以直观地理解其功能与返回值的含义。
假设你有以下代码:
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
}
}
*实例成员(非静态成员):每个类的实例(对象)都有自己独立的一份数据或方法。这些成员依赖于类的具体对象来访问或调用。例如,普通的类变量和方法通常是非静态的,属于类的实例。
*静态成员:静态成员是属于类本身的,不依赖于类的实例。静态成员可以直接通过类名调用,无需创建类的对象。
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(),无需创建类的实例。
-
Getter 和 Setter 方法:
- 为类中的所有字段自动生成相应的
get
和set
方法。
- 为类中的所有字段自动生成相应的
-
toString()
方法:- 自动生成
toString()
方法,输出对象的字段值,便于调试和日志记录。
- 自动生成
-
equals()
和hashCode()
方法:- 自动生成
equals()
和hashCode()
方法,用于对象比较和散列操作。
- 自动生成
-
RequiredArgsConstructor
:- 生成一个包含所有
final
字段的构造方法,以及所有标记了@NonNull
注解的字段。
- 生成一个包含所有
使用 @Data
可以避免手动编写重复的代码,从而使代码更简洁、更易维护。它通常适用于简单的数据传输对象(DTO)或实体类中。
示例:
@Data
public class User {
private Long id;
private String name;
private String email;
}
这个注解将会自动生成 id
、name
和 email
的 Getter、Setter、toString()
、equals()
和 hashCode()
方法。
- 如果你需要定制某些方法,可能需要自己手动编写这些方法,避免 Lombok 的自动生成与手动代码冲突。
主要考虑堆的内存泄漏
@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
}
-
对空对象调用方法:
如果你试图调用一个为null
的对象的实例方法,会抛出NullPointerException
。String str = null; int length = str.length(); // 会抛出 NullPointerException
-
访问空对象的成员变量:
如果你试图访问一个为null
的对象的成员变量,也会抛出NullPointerException
。class Person { String name; } Person p = null; String name = p.name; // 会抛出 NullPointerException
-
使用空数组访问元素:
如果数组本身为null
,并尝试访问其元素,也会抛出NullPointerException
。int[] arr = null; int value = arr[0]; // 会抛出 NullPointerException
-
对空集合调用方法:
如果集合对象是null
,并且尝试调用它的方法,如add()
,get()
等,也会导致NullPointerException
。List<String> list = null; list.add("item"); // 会抛出 NullPointerException
-
自动拆箱操作时遇到
null
:
当你试图将一个null
值拆箱为原始类型(例如Integer
拆箱为int
)时,也会引发NullPointerException
。Integer num = null; int n = num; // 会抛出 NullPointerException
-
通过
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
的发生,并提高代码的健壮性。