Skip to content

Latest commit

 

History

History
213 lines (168 loc) · 4.97 KB

基础知识.md

File metadata and controls

213 lines (168 loc) · 4.97 KB

基础知识

数据类型

包装类型

数值比较
  • 包装类型在 -128 ~ 127之间时,使用==equals比较都是true,因为在此范围内直接中缓存中取值;超过此范围只能用equals故包装类型的数值比较直接用equals
Long l1 = 123456L;
Long l2 = 123456L;
System.out.println(l1.equals(l2));
System.out.println(l1 == l2);

true
false
    
Serializable l4 = 123456L;
Serializable l5 = 123456L;
System.out.println(l4.equals(l5));
System.out.println(l4 == l5);

true
false
  • 包装类型与基本数据类型比较时,会自动拆包为基本数据类型,故用==即可
System.out.println(l1.equals(123456L));
System.out.println(l1 == 123456L);
System.out.println(l1 == 123456);

true
true
true

Note

包装类型如果为null时,自动拆包会报空指针异常

实例类型判断

PackageData pd = new PackageData();
PackageData pd1 = null;
byte[] b = new byte[0];
byte[] b1 = null;

System.out.println(pd instanceof PackageData);
System.out.println(pd1 instanceof PackageData);
System.out.println(b instanceof byte[]);
System.out.println(b1 instanceof byte[]);

Tip

值为null时,instanceof返回false

枚举

enum EnumTest11 {
    DOG,
    TIGER
}

@Getter
enum EnumTest12 {
    DOG(2),
    TIGER(3);

    private int value;

    EnumTest12(int value) {
        this.value = value;
    }

    public static EnumTest12 of(int value) {
        for(EnumTest12 ft : EnumTest12.values()) {
            if(ft.value == value) {
                return ft;
            }
        }
        throw new RuntimeException("no enum for value: " + value);
    }
}
EnumTest11.TIGER.name();
EnumTest11.TIGER.ordinal();
EnumTest11.TIGER.toString();

EnumTest12.TIGER.name();
EnumTest12.TIGER.ordinal();
EnumTest12.TIGER.toString();
EnumTest12.TIGER.getValue();
/* 结果:
TIGER
1
TIGER

TIGER
1
TIGER
3
*/

EnumTest12 e1 = EnumTest12.valueOf("TIGER");
EnumTest12 e2 = Enum.valueOf(EnumTest12.class, "TIGER");
// ordinal 不推荐的方式
EnumTest12 e3 = EnumTest12.values()[1];
// 自行写的方法
EnumTest12 e4 = EnumTest12.of(3);
/* 结果:
TIGER
TIGER
TIGER
TIGER
*/

nametoString方法的区别:

  • name()final的,返回枚举名称
  • toString()默认返回name()

枚举:如何正确使用name()和toString()方法_dnc8371的博客-CSDN博客

Enum: How to use name() and toString() methods correctly - Java Code Geeks - 2023

Note

当枚举使用value属性时,使用 fastjson2 序列化应注意:防止将枚举字段序列化为value,参看java/fastjson - fastjson2 序列化枚举问题

ordinal 方法

枚举索引,枚举顺序改变后,索引会发生变化。

定义一个枚举类:

enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

Enum类提供了一个ordinal()方法,用来返回枚举对象的序数,比如本例中SPRING, SUMMER, AUTUMN, WINTER的序数就分别是0,1,2,3。在某些情况下,我们需要根据这个序数生成我们需要的枚举对象。 我们可以使用枚举类型的values()方法做到:

enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
    public static Season valueOf(int ordinal) {
        if (ordinal < 0 || ordinal >= values().length) {
            throw new IndexOutOfBoundsException("Invalid ordinal");
        }
        return values()[ordinal];
    }
}

Java中枚举类的ordinal()方法_枚举的ordinal-CSDN博客

Enum规范中谈到ordinal时这么写到:“大多数的程序员都不需要这个方法。它是设计成用于像EnumSetEnumMap这种基于枚举的通用数据结构的。”除非你在编写的是这种数据结构,否则最好完全避免使用ordinal方法。

枚举ordinal方法 - 简书 (jianshu.com)

List

排序
List<Person> test2 = new ArrayList<>();
test2.add(new Person("alex", 19, null));
test2.add(new Person("alice", 18, null));

// 两者任选其一,数字小则顺序不变,数字大交换顺序,即升序
test2.sort((a, b) -> a.age - b.age);
test2.sort(Comparator.comparingInt(a -> a.age));
print(test2);

Tip

可以这么记忆,sort 方法中的编程函数,返回负值,表示a应该放在b前面。

初始化
public static List<String> HIGHLIGHT_DECODER_MIME_TYPES = new ArrayList<String>() {{
    add("video/hevc");
    add("video/avc");
    add("video/av01");
}};

Map

初始化

public static final Map<Integer, String> COLOR_FORMAT_MAP = new HashMap<Integer, String>() {{
    put(3 , "12bitRGB444");
    put(5 , "16bitARGB1555");
    put(4 , "16bitARGB4444");
}}