最后
定义两个枚举类,一个枚举类有一个int型属性,一个string型属性,另外一个枚举类只有一个string属性:
public enum SexEnum {
MALE(1, “男”),
FEMALE(0, “女”);
private int type;
private String name;
SexEnum(int type, String name) {
this.type = type;
this.name = name;
}
}
public enum Sex1Enum {
MALE(“男”),
FEMALE(“女”);
private String name;
Sex1Enum(String name) {
this.name = name;
}
}
然后编写一个测试类,并且让两个枚举 switch 的 FEMALE 和 MALE 对应的返回值不同:
public class SwitchTest {
public int enumSwitch(SexEnum sex) {
switch (sex) {
case MALE:
return 1;
case FEMALE:
return 2;
default:
return 3;
}
}
public int enum1Switch(Sex1Enum sex) {
switch (sex) {
case FEMALE:
return 1;
case MALE:
return 2;
default:
return 3;
}
}
}
将这几个类反编译下:
// SexEnum.class
public enum SexEnum {
MALE(1, “鐢�”),
FEMALE(0, “濂�”);
private int type;
private String name;
// $FF: synthetic field
private static final SexEnum[] $VALUES = new SexEnum[]{MALE, FEMALE};
private SexEnum(int var3, String var4) {
this.type = var3;
this.name = var4;
}
}
// Sex1Enum.class
public enum Sex1Enum {
MALE(“鐢�”),
FEMALE(“濂�”);
private String name;
// $FF: synthetic field
private static final Sex1Enum[] $VALUES = new Sex1Enum[]{MALE, FEMALE};
private Sex1Enum(String var3) {
this.name = var3;
}
}
反编译这两个枚举类,发现其中多了一个 $VALUES 数组,内部包含了所有的枚举值。继续反编译测试类:
// SwitchTest$1.class
import com.example.express.test.Sex1Enum;
import com.example.express.test.SexEnum;
// $FF: synthetic class
class SwitchTest$1 {
// $FF: synthetic field
static final int[] S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSexEnum;
// $FF: synthetic field
static final int[] S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSex1Enum = new int[Sex1Enum.values().length];
static {
try {
S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSex1Enum[Sex1Enum.FEMALE.ordinal()] = 1;
} catch (NoSuchFieldError var4) {
;
}
try {
S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSex1Enum[Sex1Enum.MALE.ordinal()] = 2;
} catch (NoSuchFieldError var3) {
;
}
S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSexEnum = new int[SexEnum.values().length];
try {
S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSexEnum[SexEnum.MALE.ordinal()] = 1;
} catch (NoSuchFieldError var2) {
;
}
try {
S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSexEnum[SexEnum.FEMALE.ordinal()] = 2;
} catch (NoSuchFieldError var1) {
;
}
}
}
首先生成了一个名为 SwitchTest$1.java 的链接类,里面定义了两个枚举数组,这两个数组元素添加的顺序完全和测试类中 switch 类调用的顺序一致。
图片
枚举元素在数组中的下标由 ordinal() 函数决定,该方法就是返回枚举元素在枚举类中的序号。
这里我们其实就已经知道了,在 switch 语句中,是根据枚举元素在枚举中的序号来转变成 int 型的。最后再看下测试类的反编译结果验证下:
// SwitchTest.class
import com.example.express.test.Sex1Enum;
import com.example.express.test.SexEnum;
import com.example.express.test.SwitchTest.1;
public class SwitchTest {
public int enumSwitch(SexEnum var1) {
switch(1. S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSexEnum[var1.ordinal()]) {
case 1:
return 1;
case 2:
return 2;
default:
return 3;
}
}
public int enum1Switch(Sex1Enum var1) {
switch(1. S w i t c h M a p SwitchMap SwitchMapcom e x a m p l e example exampleexpress t e s t test testSex1Enum[var1.ordinal()]) {
case 1:
return 1;
case 2:
return 2;
default:
return 3;
}
}
}
三、String 类型是咋变成 int 类型的?
首先我们先知道 char 类型是如何变成 int 类型的,很简单,是 ASCII 码,例如存在 switch 语句:
public int charSwitch(char c) {
switch © {
case ‘a’:
return 1;
case ‘b’:
return 2;
default:
return Integer.MAX_VALUE;
}
}
反编译结果:
public int charSwitch(char var1) {
switch(var1) {
case 97:
return 1;
case 98:
return 2;
default:
return Integer.MAX_VALUE;
}
}
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
[外链图片转存中…(img-x7fPDa6G-1715374559125)]
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
[外链图片转存中…(img-34Drzkj9-1715374559126)]