1.1 Java源程序的扩展名是什么?
.java
1.2 什么是标识符?
在java语言中能够我们自己起名的都叫标识符
1.3 标识符有哪些特点?
标识符是大小写字母、数字字符、$和_组成,不能以数字开头,也不能是java关键字,并且区分大小写
1.4 请说明环境变量Path 与 classpath 区别
path是系统用来指定可指定文件的完整路径。Path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径。
classpath是指定你在程序中所使用的类(.class)文件所在的位置。
1.5 java程序经编译后产生的字节码文件扩展名是什么?
字节码文件扩展名是 .class
1.6 请说出常用的DOS命令并解释?
1.7 请解释Java语言的跨平台特性?
Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(class file)。
1.8 请说明JDK、JRE、JVM的区别?
2.1 注释的分类及作用?
2.2 请说出Java中数据类型的分类?基本数据类型都有哪些?
2.3 Java中数据的类型转换有几种?分别是什么?
2.4 Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。
补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
2.5 请说明 && 和 & 的区别?
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
2.6 请说明 == 与 = 的区别?
2.7 三元运算符的基本格式是什么?
三元运算符的格式是: 条件表达式 ? 表达式1 : 表达式2
2.8 三元运算符的执行流程是什么?
三元运算符的执行流程: 首先计算条件表达式的值看其返回结果是true还是false,如果是true就执行表达式1,如果是false就执行表达式2
2.9 使用键盘录入数据的三个步骤是什么?
2.10 请说明for、while、do…while三种循环的格式以及执行流程,以及它们的区别。
注意:写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环
2.11 定义一个方法的格式是什么,以及方法的注意事项?
2.12 private 关键字在哪里使用? 被 private 修饰的成员有什么特点?
类中的成员需要私有的时候使用private关键字
特点:
是一个权限修饰符。
可以修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问
2.13 为什么要有 this 关键字?this 关键字的含义?
this用来解决成员变量与局部变量重名问题
this关键字代表的是本类对象引用;谁调用我,this就代表谁.
2.14 final 关键字是什么意思,可以修饰那些成员?被修饰的成员有哪些特点?
final最终的意思。
可修饰
特点
2.15 形式参数是基本类型要的是什么?是类名、抽象类名、接口名时分别要的是什么?
形式参数是基本类型要的是一个基本类型的变量或者具体的常量值
2.16 返回值类型是基本类型返回的是什么?是类名、抽象类名、接口名分别返回的是什么?
返回值是基本数据类型的时候返回的是一个具体的值
2.17 package它有什么作用?
package,包的意思,其实就是文件夹,它可以对类进行分类管理
2.18 import的作用?
在不同包下的类之间相互访问的时候,发现,每次使用不同包下的类的时候,都需要加包的全路径。比较麻烦,这个时候,java就提供了( import )导包的功能。
使用import可以将包中的类导入进来,以后使用类的时候,不需导包,直接使用,简化了书写。
2.19 请解释 ==与equals()方法的区别?
== 解读
对于基本类型和引用类型 == 的作用效果是不同的,如下所示:
代码示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
equals 解读
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。
首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("mbb");
Cat c2 = new Cat("mbb");
System.out.println(c1.equals(c2)); // false
输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
原来 equals 本质上就是 ==。
那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:
String s1 = new String("mbb");
String s2 = new String("mbb");
System.out.println(s1.equals(s2)); // true
同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。
总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
2.20 请简述泛型是什么?有什么用?在哪里用?
2.21 如何编写一个泛型方法,让它能够接受泛型参数并返回泛型类型?并举例
泛型方法,指把泛型定义在方法上,使用泛型类型来替代原始类型
public static T[] sort(T[] t){
Arrays.sort(t);
return t;
}
2.22 请简述Java中如何使用泛型编写带有参数的类?并举例
泛型类,指把泛型定义在类上,使用泛型类型来替代原始类型
class GenericClass {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
2.23 请说说文件名称过滤器FilenameFilter的作用?
FilenameFilter是文件名过滤器,用来过滤不符合规则的文件名,并返回合格的文件。
2.24 请简述递归是什么?注意事项是什么?
所谓递归,是指程序调用自身。
注意,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了。
2.25 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对,两个对象的 hashCode() 相同,equals() 不一定 true。
代码示例:
String str1 = "通话";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
执行的结果:
str1:1179395 | str2:1179395
false
代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
2.26 Java 中的 Math. round(-1. 5) 等于多少?
等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。
3.1 请写出Java标识符的命名规则
3.2 变量是什么?
变量,在程序运行时,值可以被修改的量。
3.3 变量的定义格式是什么?
数据类型 变量名 = 变量值
3.4 成员变量与局部变量的区别?
在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
3.5 静态变量与成员变量的区别?
所属不同
静态变量属于类,所以也称为为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
4.1 String s = “a”+“b”+”c”; 创建了多少对象,分别是什么?
因为字符串的特点是一旦被创建就不能被改变,所有在使用常量进行相加的时候,都是在创建新的字符串对象,最后在把字符串"abc"这个常量值赋值给引用变量s
4.2 如何实现StringBuffer和String的相互转换?
4.3 如何实现String和int数据的相互转换
4.4 如何实现【基本数据类型】与【基本数据封装类】之间的相互转换
4.5 请说明String与StringBuffer二者之间的区别?
String类表示内容不可以改变的字符串
StringBuffer类表示内容可以被修改的字符串
4.6 请说明StringBuffer与StringBilder二者之间的区别?
StringBilder
是线程不安全的,运行效率高
> 如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。
StringBuffer
是线程安全的,运行要低于StringBilder
> 如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
4.7 什么是正则表达式?
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则达表示通常被用来检索、替换那些符合某个模式的文本。
4.8 如何实现Date与long相互转换?
4.9 如何实现Date与String相互转换?
Date 转 String
String 转 Date
Date类的构造方法
> 已过时,被DateFormat类的parse(String s)方法取代
DateFormat类的parse()方法
4.10 String 属于基础的数据类型吗?
String 不属于基础类型
基础类型有 8 种:
而 String 属于对象
4.11 String str=“i” 与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
4.12 如何将字符串反转?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
示例代码:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System. out. println(stringBuilder.reverse()); // gfedcba
4.13 String 类的常用方法都有那些?
5.1 类是什么? 对象是什么?举例说明
是一组相关属性和行为的集合是一个抽象的东西,对象则是该类的一个具体的体现。
举例: 学生就是一个类,然后每一个学生都是学生的一个个具体的体现,所以每一个学生就是一个学生。
5.2 类由哪些内容组成?
类由成员变量和成员方法组成
成员变量对应的就是事物的属性(就是事物固有的信息,比如: 人的属性有身高 , 姓名 , 年龄 , 学历…) , 成员方法对应的是行为(行为: 就是该事物可以做的事情,比如:人的行为有: 吃饭,睡觉…)
5.3 什么是匿名对象?什么时候使用匿名对象?
匿名对象指:没有起名字的对象
使用匿名对象:
a:调用方法,仅仅只调用一次的时候
b:匿名对象可以作为实际参数传递
5.4 构造方法的作用是什么?构造方法的特点是什么?构造方法的注意事项? 构造方法中可不可以写return 语句呢?
构造方法的作用是用于给类的成员变量赋值,完成类的初始化工作
构造方法的特点:
构造方法的名称和类名相同
构造方法没有返回值类型,连void也没有
构造方法没有具体的返回值
构造方法的注意事项:
如果一个类没有给出构造方法,系统将会提供一个默认无参的构造方法
如果我们给出类构造方法,系统将不会提供默认无参的构造方法,这个时候如果我们还想使用无参的构造方法来创建对象,那么就需要我们给出无参的构造方法
可以写空的return语句.
5.5 一个类的缺省构造方法可以有参数吗?
一个类的缺省构造方法没有参数
5.6 请说明一个对象的创建过程做了哪些事情?
Student s = new Student();
5.7 子父类中构造方法的执行有什么特点?为什么要这样?
> 注意:super(…)或者this(…)必须出现在第一条语句上,否则,就会有父类数据的多次初始化
5.8 静态代码块,构造代码块,构造方法的执行顺序是什么以及执行特点?
5.9 抽象类是什么,抽象类的特点?
抽象类的定义
使用了关键字abstract声明的类叫做“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。
抽象类的特点:
抽象类的定义格式: abstract class 类名{}
抽象方法的定义格式: public abstract 返回值类型 方法名();
抽象类中可以存在抽象方法,也可以存在非抽象方法
抽象类不能直接进行实例化,我们可以使用多态的形式进行进行间接实例化
抽象类的子类
可以是抽象类
> 如果子类还是抽象类,那么我们还是不能进行实例化,还需要一个子类去继承
也可以是非抽象类
> 子类必须重写父类的抽象方法
5.10 抽象类中有没有构造方法,如果有它是用来做什么的?
抽象类虽然不能进行实例化,但是抽象类中是存在构造方法,该构造方法的作用是用于子类访问父类数据时的初始化.
5.11 接口中成员变量的特点,以及成员方法的特点?
接口中的成员变量都是常量,存在默认的访问修饰符:
public static final
接口中的成员方法都是抽象方法,存在默认的访问修饰符:
public abstract
5.12 请说出类与类,类与接口,以及接口与接口的关系以及特点?
只支持单继承,可以是多层继承
。可以是多实现
5.13 抽象类和接口的区别?
成员区别
关系区别
设计理念区别
5.14 内部类有哪些访问特点?
5.15 匿名内部类的格式是什么?其本质是什么?
5.16 抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法。
示例代码:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
上面代码,抽象类并没有抽象方法但完全可以正常运行。
5.17 抽象类能使用 final 修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类
6.1 请解释什么是方法的重载?
方法重载指在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
方法重载特点:
a) 与返回值类型无关,只看方法名和参数列表
b) 在调用时,虚拟机通过参数列表的不同来区分同名方法
6.2 使用面向对象【封装】的好处有哪些?
隐藏实现细节,提供公共的访问方式;
提高了代码的复用性;
提高安全性。
6.3 Java 中的类的继承特点是什么以及继承的注意事项?
继承的特点: 在java语言中类的继承只支持单继承,不支持多继承.但是可以多层继承。
继承的注意事项:
6.4 继承的好处是什么?
6.5 this 和 super 分别是什么,他们各自的应用场景是什么?
this
代表的是本类对象的引用 , 谁调用我这个方法,这个方法里边的this就代表谁。一般的使用场景是,当局部变量隐藏了成员变量的时候,我们可以使用this去明确指定要访问的是成员变量
super
代表的是父类存储空间的一个标志(可以理解为父类对象的引用),我们可以使用super来访问父类的成员
6.6 什么是方法重写?需要注意哪些问题?
方法重写:指子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写
需要注意的问题:
1. 父类中私有方法不能被重写
2. 子类重写父类方法时,访问权限不能更低
3. 父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此)
6.7 方法重写和重载有什么区别?
6.8 什么是多态,多态的前提是什么?
一种事物在不同时刻表现出来的状态就是多态
多态的前提:
6.9 多态中成员(成员变量,成员方法,静态成员方法)的访问特点是什么?
访问成员变量
编译看左边 , 运行看左边
> 因为成员变量其实就是属性,属性就是只该事物的描述信息,所以使用父类在访问的时候,访问的就是父类的成员变量
成员方法
编译看左边,运行看右边
> 这个是多态的本质,存在动态绑定的机制
静态成员方法
编译看左边,运行看左边
> 所以说静态算不上重写
6.10 多态的好处?
6.11 多态的弊端是什么,如果我们想访问子类的特有的功能我们应该怎么办?
多态的弊端,不能访问子类中特有的功能
如果我们还想使用子类中特有的功能,我们需要使用向下转型
> 向下转型: 就是将父类的引用强制转换成子类的引用,在向下转型的过程中需要注意一个异常: ClassCastException
7.1 数组有几种创建的方式?分别是什么?
2种。动态创建和静态创建。
7.2 请简述集合和数组的异同点?
集合:
数组:
7.3 迭代器Iterator是什么?怎么使用?有什么特点?
Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。
Iterator 使用代码如下:
List list = new ArrayList<>();
Iterator it = list.iterator();
while(it.hasNext()){
String obj = it.next();
System.out.println(obj);
}
Iterator的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
7.4 请简述常见的数据结构有哪些?
7.5 请简述ArrayList、Vector、LinkedList三者的特点?
ArrayList
底层数组结构
Vector
底层数组结构
LinkedList
底层链表结构
7.6 请简述ArrayList、Vector、LinkedList,分别在什么时候使用?
线程安全
Vector
非线程安全
7.7 请简述并发修改异常产生的原因?如何解决?
异常
ConcurrentModificationException
> 在迭代器迭代的过程中,集合中的元素个数发生了改变,此时导致并发修改异常。
解决方式
7.8 请简述List extends T>和List super T>之间有什么区别?
7.9 请简述Set集合的特点?
7.10 请简述HashSet是如何保证元素唯一性的?
HashSet集合中存储的元素,通过重写hashCode() 与 equals()方法来保证元素唯一性
7.11 请简述TreeSet是如何保证元素唯一性与排序的?
7.12 请说明Map接口和Collection接口的区别
Map接口是双列集合顶层接口,每个位置存储一对元素(key, value)
Collection接口是单列集合顶层接口,每个位置存储一个元素
7.13 请说出Map集合的遍历方式
7.14 请说明HashMap和Hashtable的区别
7.15 请解释Collection与Collections的区别
7.16 Java 容器都有哪些?
Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
7.17 List、Set、Map 之间的区别是什么?
List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。
7.18 如何决定使用 HashMap 还是 TreeMap?
对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。
7.19 说一下 HashMap 的实现原理?
HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
7.20 说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
7.21 如何实现数组和 List 之间的转换?
数组转 List
使用 Arrays.asList(array) 进行转换。
List 转数组
使用 List 自带的 toArray() 方法。
代码示例:
// list to array
List list = new ArrayList();
list.add("这个");
list.add("小程序");
list.add("很赞");
list.toArray();
// array to list
String[] array = new String[]{"这个","小程序","很赞"};
Arrays.asList(array);
7.22 Array 和 ArrayList 有何区别?
7.23 在 Queue 中 poll()和 remove()有什么区别?
相同点:都是返回第一个元素,并在队列中删除返回的对象。
不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。
代码示例:
Queue queue = new LinkedList();
queue.offer("string"); // add
System.out.println(queue.poll());
System.out.println(queue.remove());
System.out.println(queue.size());
7.24 Iterator 和 ListIterator 有什么区别?
7.25 怎么确保一个集合不能被修改?
可以使用 Collections.unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。
示例代码如下:
List list = new ArrayList<>();
list. add("x");
Collection clist = Collections.unmodifiableCollection(list);
clist.add("y"); // 运行时此行报错
System.out.println(list.size());
8.1 请说说什么是异常?异常的分类?
什么是异常?
Java异常是java提供的用于处理程序中错误的一种机制
。
所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0错误,数组下标越界,所要读取的文件不存在)。设计良好地程序应该在程序异常发生时提供处理这些错误的方法,使得程序不会因为异常的发送而阻断或产生不可预见的结果。
Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将被提交给java运行时系统,这个过程称为抛出异常。
当java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交其处理,这一过程称为捕获异常。
异常的分类
8.2 请说出异常处理的方式?
捕获异常
try{
}catch(XxxException e){
}finally{
}
抛出异常
throw \ throws()
异常五个关键字
8.3 请说说编译期异常和运行期异常的区别?
8.4 请说说throws与throw的区别?
8.5 请说说final、finally与finalize的区别?
8.6 请说说异常的注意事项及如何使用异常处理?
8.7 请说出最常见到的RuntimeException异常
8.8 请简述IO流的分类
9.1 请简述字符编码是什么?请说出常见字符编码表?
9.2 请说出学习过的IO流中的常用方法?
9.3 请说出转换流OutputStreamWriter与InputStreamReader 的作用?
9.4 请简述打印流(PrintStream、PrintWriter)的特点?
9.5 BIO、NIO、AIO 有什么区别?
9.6 Files的常用方法都有哪些?
为帮助开发者们提升面试技能、有机会入职BATJ等大厂公司,特别制作了这个专辑——这一次整体放出。
大致内容包括了: Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈!
需要获取以下这些面试题答案以及学习资料得话麻烦一键三连之后微信扫描下图作者助手的微信:( msb-shishi )添加即可免费获取到哦
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
关注公众号 『 java烂猪皮 』,不定期分享原创知识。
同时可以期待后续文章ing
.关注后回复【666】扫码即可获取学习资料包
作者:码霸霸
链接:https://www.imooc.com/article/314894