Java 笔记

Java 笔记

记录写 Java 需要注意的问题,以及一些技巧。

Java 中的关键字

var // 类似 C++ 中的 auto

基础知识

基本数据类型以及包装类

int,short,long,float,boolean,byte,double,char
// 类型大小 32,16,64,32,vm depend,8,64,16

多线程

Java 中编写多线程程序有两种主要的方法:实现 Runnable 接口或继承 Thread 类。下面是两种方式的示例代码:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);  // 将实现了 Runnable 接口的对象传递给 Thread 的构造函数
        thread.start();  // 启动线程
    }
}

public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();  // 启动线程
    }
}

// 在上述示例中,通过实现 Runnable 接口或继承 Thread 类,并重写 run() 方法来定义线程执行的代码。在 main() 方法中创建对象并启动线程。
// 值得注意的是,只有调用 start() 方法才会启动线程,而不是直接调用 run() 方法。
// start() 方法会创建一个新的线程,并在新线程中执行 run() 方法中的代码。

注解

@Nullable 是 Java 语言中的一种注解,用于标记一个变量、参数或返回值可能为 null 的情况。
@Override 注解表示被注解的方法覆盖(override)了父类中的同名方法,或者实现了接口中的同名方法。它用于**强制**确保方法的重写正确性,
如果注解的方法与父类或接口中的方法签名不匹配,编译器将报错。这种注解可以帮助开发人员避免意外地修改了方法签名而没有正确地进行方法重写。
@Getter 和 @Setter 是 Lombok 提供的注解,用于自动生成 Java 类中的 Getter 和 Setter 方法。这两个注解可以避免手动编写重复的 getter 和 setter 代码,使类定义更加简洁。
通过 import lombok.Getter; 后使用
@VisibleForTesting 是 Guava 库中的一个注解,用于指示某个类、方法或字段的可见性仅限于测试代码中使用。它和 Java 标准库中的 @Deprecated 注解类似,都是为了在代码中提供更多的信息和限制。
@Mock 注解是 JMockit 中的一个重要特性,用于将被测试的类中的某个方法替换为一个模拟实现,以便在测试中控制和验证方法的行为。
通过 import mockit.Mock; 后使用
@ConfField(description = {mutable = false}) 是一个 Java 注解,用于标记一个字段的元数据信息。它通常用于配置文件的读写操作中,用于指定某个配置属性的描述信息以及是否可变。
@SuppressWarnings,抑制告警
@SuppressWarnings("unchecked"),强制类型转换时的告警
@SuppressWarnings("deprecation")

JUnit

Java 项目中进行单元测试的工具

Java 版本

Java 6 是 Java 开发工具包(JDK)的第 6 版本,于 2006 年 12 月发布。
Java 7 是 Java 开发工具包(JDK)的第 7 版本,于 2011 年 7 月发布。
Java 8 是 Java 开发工具包(JDK)的第 8 版本,于 2014 年 3 月发布。
Java 9 是 Java 开发工具包(JDK)的第 9 版本,于 2017 年 9 月发布。

img

note

foreach与正常for循环效率对比

用 for 循环 ArrayList 10万次花费时间:5毫秒。 用 foreach 循环 ArrayList 10万次花费时间:7毫秒。

用 for 循环 LinkedList 10万次花费时间:4481毫秒。 用 foreach 循环 LinkedList 10万次花费时间:5毫秒。

结论:

需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。

需要循环链表结构的数据时,一定不要使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

断言

img

assert !ranges.isEmpty() // assert 是内置的断言直接使用即可,并在不正确时抛出 AssertionError 异常

lambda

img

img

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyTest {
    public static void main(String[] args) {
        List<String> items = Arrays.asList("Apple", "Banana", "Cherry", "Date");

        // 使用 forEach 和 Lambda 表达式打印每个元素
        items.stream().forEach(item -> System.out.println(item));
        
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "Java");
        map.put(2, "Python");
        map.put(3, "JavaScript");

        map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
    }
}

Stream

img

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MyTest {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

        // 使用 filter 方法过滤空字符串
        List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

        // 使用 map 方法将字符串转换为大写
        List<String> upperCaseStrings = strings.stream().map(String::toUpperCase).collect(Collectors.toList());
        
        // 使用 reduce 方法将字符串拼接起来
        
        String concatenatedString = strings.stream().reduce("", (a, b) -> a + b);

        // 打印过滤后的列表
        System.out.println("Filtered List: " + filtered);

        // 打印转换后的列表
        System.out.println("Upper Case List: " + upperCaseStrings);

        // 打印连接后的字符串
        System.out.println("Reduce List: " + concatenatedString);
    }
}

Reference

posted on 2023-12-19 13:37  LambdaQ  阅读(16)  评论(0编辑  收藏  举报