- 包装类型在 -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
*/
name
和toString
方法的区别:
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 序列化枚举问题
枚举索引,枚举顺序改变后,索引会发生变化。
定义一个枚举类:
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]; } }
Enum
规范中谈到ordinal
时这么写到:“大多数的程序员都不需要这个方法。它是设计成用于像EnumSet
和EnumMap
这种基于枚举的通用数据结构的。”除非你在编写的是这种数据结构,否则最好完全避免使用ordinal
方法。
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");
}};
初始化
public static final Map<Integer, String> COLOR_FORMAT_MAP = new HashMap<Integer, String>() {{
put(3 , "12bitRGB444");
put(5 , "16bitARGB1555");
put(4 , "16bitARGB4444");
}}