当前位置: 首页 > news >正文

Java企业面试题3

1. break和continue的作用(智*图)

  • break:用于完全退出一个循环(如 for, while)或一个 switch 语句。当在循环体内遇到 break 语句时,程序会立即跳出当前循环体,继续执行循环之后的代码。
  • continue:用于跳过当前循环体中剩余的部分,并开始下一次循环。如果是在 for 循环中使用 continue,则会直接进行条件判断以决定是否执行下一轮循环。

2. if分支语句和switch分支语句的异同之处(智*图)

  • 相同点:都是用来根据不同的条件执行不同的代码块。
  • 不同点
    • if语句可以处理范围条件和复杂条件判断,而switch语句通常用于等值判断,即变量等于某个特定值的情况。
    • switch语句支持的类型有限,主要是整型(包括byteshortintchar)和枚举类型,以及从Java 7开始支持的字符串类型。if语句没有这种限制。
    • switch语句在执行完一个case后,如果没有break,会继续执行下一个case的代码(称为“穿透”),而if语句不会出现这种情况。

3. 什么时候用语句if,什么时候选用语句switch(灵伴*来科技)

  • 使用 if 语句:当你的程序需要根据某个条件执行特定的代码段,或者条件是复杂的布尔表达式时,适合使用 if 语句。
  • 使用 switch 语句:当有多个互斥的选项(即一次只能选择一个选项),并且这些选项是基于一个具体的值时,使用 switch 语句可以使代码更加清晰和简洁。

4. switch语句中忘写break会发生什么(北京*蓝)

  • case穿透:在 switch 语句中忘记写 break 会导致“fall through”现象,即执行完当前 case 的代码后,会继续执行下一个 case 的代码,直到遇到 break 或者 switch 结束为止。这可能会导致未预期的行为。

5. Java支持哪些类型循环(上海*睿)

  • for循环:通过初始化表达式、条件表达式和迭代表达式来控制循环次数。
  • while循环:在循环开始前检查条件,如果条件为真,则执行循环体。
  • do-while循环:至少执行一次循环体,之后再检查条件是否满足。
  • 增强型for循环(也称为for-each循环):用于遍历数组或集合中的元素,简化了遍历过程。

6. while和do while循环的区别(国*科技研究院)

  • while 循环:先检查条件是否为真,然后才进入循环执行循环体。如果初始条件下就为假,则循环体一次也不会执行。
  • do...while 循环:先执行循环体内的代码,然后检查条件是否为真。这意味着无论条件如何,do...while 循环的循环体会至少执行一次。

7. 数组有没有length()这个方法? String有没有length()这个方法?(*蓝)

  • 数组:在Java中,数组没有length()方法,而是有一个length属性。例如,int[] arr = new int[10]; 中,arr.length会返回数组的长度,即10。
  • String:字符串(String)有length()方法,用于返回字符串的长度。例如,String str = "Hello"; 中,str.length()会返回5。

8.有数组int[] arr,用Java代码将数组元素顺序颠倒(闪*购)

public static void reverseArray(int[] arr) {int leftIndex = 0;int rightIndex = arr.length - 1;while (leftIndex < rightIndex) {// 交换两端的元素int temp = arr[leftIndex];arr[leftIndex] = arr[rightIndex];arr[rightIndex] = temp;// 移动索引leftIndex++;rightIndex--;}
}

9.为什么数组要从0开始编号,而不是1(中*支付)

  • 数组的索引,表示了数组元素距离首地址的偏离量。因为第1个元素的地址与首地址相同,所以偏移量就是0。所以从0开始。

10.数组有什么排序的方式,手写一下(平*保险)

  • 常见的数组排序方式包括冒泡排序、选择排序、插入排序、归并排序、快速排序等。这里以冒泡排序为例:
public static void bubbleSort(int[] arr) {int temp;for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

11.常见排序算法,说下快排过程,时间复杂度?(5*到家)

  • 快速排序是一种高效的排序算法,它使用分治法。基本步骤如下:

        选择一个'pivot'(基准)元素。
        将所有比pivot小的元素放到它的左边,比pivot大的放到右边。
        对左右两边递归执行上述步骤。

  • 平均时间复杂度为O(n log n),最坏情况下的时间复杂度为O(n^2),当每次划分都极不平衡时会发生这种情况

12.二分算法实现数组的查找(神舟*天软件)

  • 二分查找适用于有序数组,以下是其实现:
public static int binarySearch(int[] arr, int target) {int left = 0, right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1; // 如果没有找到目标值,则返回-1
}

13.怎么求数组的最大子序列和(携*)

  • 这个问题可以通过动态规划解决,著名的解法是Kadane算法:
public static int maxSubArraySum(int[] arr) {int maxSoFar = arr[0];int currMax = arr[0];for (int i = 1; i < arr.length; i++) {currMax = Math.max(arr[i], currMax + arr[i]);maxSoFar = Math.max(maxSoFar, currMax);}return maxSoFar;
}

14.Arrays 类的排序方法是什么?如何实现排序的?(阿*、阿*校招)

  • Java 的 java.util.Arrays 类提供了一系列静态方法来对数组进行操作,包括排序。对于基本类型的数组,可以使用 Arrays.sort() 方法进行排序。这个方法内部实现了使用一种称为“双支枢快速排序”的高效算法,它对于大多数情况下的性能表现是非常好的。下面是使用 Arrays.sort() 方法的一个例子:
import java.util.Arrays;public class ArraySortExample {public static void main(String[] args) {int[] arr = {9, 5, 1, 8, 2, 7};// 对数组进行排序Arrays.sort(arr);// 输出排序后的数组System.out.println(Arrays.toString(arr));}
}

        这段代码将会输出一个已经按照升序排列的数组 [1, 2, 5, 7, 8, 9]。

  • 对于对象数组,Arrays.sort() 同样可以使用,但是要求这些对象必须实现 Comparable 接口,并且重写其中的 compareTo 方法来定义自然排序的顺序。如果没有实现 Comparable 或者需要自定义排序规则,可以传递一个 Comparator 实例给 Arrays.sort() 方法。示例代码如下:
import java.util.Arrays;
import java.util.Comparator;class Person implements Comparable<Person> {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Person other) {return Integer.compare(this.age, other.age);}@Overridepublic String toString() {return name + ": " + age;}
}public class ObjectArraySortExample {public static void main(String[] args) {Person[] people = new Person[] {new Person("Tom", 30),new Person("Jerry", 25),new Person("Bob", 22)};// 按照年龄排序Arrays.sort(people);// 输出排序后的数组System.out.println(Arrays.toString(people));// 使用Comparator按姓名排序Arrays.sort(people, new Comparator<Person>() {@Overridepublic int compare(Person p1, Person p2) {return p1.getName().compareTo(p2.getName());}});// 输出按姓名排序后的数组System.out.println(Arrays.toString(people));}
}

        在这个例子中,我们首先根据年龄对 Person 实例进行排序,然后使用 Comparator 根据名字进行排序。注意 toString 方法的重写是为了更好地展示输出结果。

15.面向对象与面向过程的理解

  • 面向对象:是一种编程范式,它使用“对象”来设计软件。对象是类的实例,包含数据(属性)和操作数据的方法。面向对象强调的是数据和功能的封装,以及对象之间的交互。它支持继承、多态和封装等概念,使得代码更加模块化、易于维护和扩展。
  • 面向过程:是一种更传统的编程方法,侧重于编写一系列的步骤或函数来完成特定的任务。面向过程关注的是程序执行的顺序,以及如何通过函数调用来实现功能。它通常不涉及对象和类的概念,而是直接操作数据和函数。

16.Java 的引用类型有哪几种(阿*校招)

        类、数组、接口;枚举、注解、记录

17.类和对象的区别(凡*科技、上*银行)

  • 类是一个模板或蓝图,用于创建对象。它定义了一组相似对象的属性和方法。
  • 对象是类的具体实例。它是类的实体,具有状态和行为。

18.面向对象,你解释一下,项目中哪些地方用到面向对象?(燕*金融)

  • 使用类来表示业务实体(如用户、订单、产品等)。
  • 利用继承来扩展类的功能,比如定义一个特殊类型的用户(如管理员、普通用户)。
  • 通过多态实现不同对象对同一接口的不同实现,例如支付方式(信用卡、支付宝、微信等)。
  • 封装数据和方法,确保对象的状态只能通过定义好的方法来改变,提高代码的安全性和可维护性。

19.Java虚拟机中内存划分为哪些区域,详细介绍一下(神**岳、数*互融)

         Java虚拟机(JVM)内存主要分为以下几个区域:

  • 堆(Heap):存放对象实例,几乎所有对象实例都在这里分配内存。
  • 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量等数据。
  • 虚拟机栈(JVM Stack):为每个方法的执行创建栈帧,存储局部变量表、操作数栈、动态链接、方法出口等信息。
  • 本地方法栈(Native Method Stack):为虚拟机使用到的本地(Native)方法服务。
  • 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器。

20.对象存在Java内存的哪块区域里面?(阿*)

  • 对象实例存储在堆(Heap)区域。

21.private 、缺省、protected、public的表格化作用区域(爱*信、拓*思、中*瑞飞)

22.main方法的public能不能换成private?为什么?(凡*科技、顺*)

  • 不可以。main 方法是程序的入口点,必须被声明为 public,这样JVM才能访问它。如果声明为 private,JVM将无法执行该方法,导致程序无法启动。

23.构造方法和普通方法的区别(凡*科技、软*动力、中*软)

  • 构造方法:与类名相同,没有返回类型,主要用于初始化对象的状态。
  • 普通方法:可以有不同的名称,具有明确的返回类型,并且可以执行各种任务。

24.构造器Constructor是否可被overload?(鸿*网络)

  • 是的,构造器可以被重载。这意味着在同一个类中可以有多个构造器,它们通过不同的参数列表来区分。

25.无参构造器和有参构造器的的作用和应用(北京楚*龙)

  • 无参构造器:创建对象时不需要提供任何参数。它通常用于对象的默认初始化。
  • 有参构造器:允许在创建对象时提供参数,用于初始化对象的特定状态。这在需要根据不同的初始条件创建对象时非常有用。

26.成员变量与局部变量的区别(艾*软件)

  • 成员变量:属于类的实例或者类本身(如果是static),在整个对象生命周期内有效。
  • 局部变量:定义在方法、构造器或语句块中,只在定义它的那个方法或块中有效。

27.变量赋值和构造方法加载的优先级问题(凡*科技、博*软件)

        在Java中,变量的初始化顺序遵循它们在类中声明的顺序,无论是在构造函数中还是直接在类声明中初始化。构造方法会在创建对象时被调用,而类级别的变量初始化会先于构造方法执行。如果构造方法中有对变量的赋值,那么这些赋值会发生在构造方法执行期间。

28.父类哪些成员可以被继承,属性可以被继承吗?可以或者不可以,请举下例子。(北京明**信)

  • 成员变量(属性):如果父类中的成员变量(属性)不是private修饰的,那么它们是可以被继承的。public、protected和默认访问权限(包访问权限)的成员变量都可以被子类继承。
  • 方法:同样,非private的方法可以被继承。public、protected和默认访问权限的方法都可以被子类继承。
  • 构造器:构造器不会被继承。每个类都需要至少一个构造器来初始化它的实例。

29.什么是Override,与Overload的区别(顺*、软**力、明*数据、阳*科技、中*软)

  • Override(重写):子类重新定义父类的方法,方法签名(名称、参数列表)必须相同,返回类型可以是父类方法返回类型的子类型。重写用于子类提供特定于子类的行为。
  • Overload(重载):在同一个类中定义多个同名方法,但参数列表不同(参数类型、个数或顺序不同)。重载用于实现同一个功能的不同操作方式。

30.Overload的方法是否可以改变返回值的类型?(新*陆)

  • 可以改变返回值的类型,只要参数列表不同即可。
  • public void method(int i){}
  • public int method(int j,int k){}

31.构造器Constructor是否可被override?(鸿*网络、深圳德**技、航**普)

  • 不可以,构造器是用来初始化对象的,每个类都有至少一个构造器,但它们不能被继承也不能被覆盖(override)。然而,构造器可以被重载(overload)。

32.为什么要有重载,我随便命名一个别的函数名不行吗?谈谈你是怎么理解的。(腾*)

  • 重载允许同一个类中存在多个同名方法,但它们的参数列表不同。这使得方法的使用更加灵活和方便,因为你可以用相同的方法名来执行类似但略有不同的操作。如果不用重载,你可能需要记住更多的方法名来完成相似的功能,这会降低代码的可读性和易用性。

33.super和this的区别(蚂**服)

  • this:指向当前对象的引用,用于访问当前对象的属性和方法,或调用当前类的其他构造器。
  • super:指向父类对象的引用,用于访问父类的属性、方法和构造器。

34.this、super关键字分别代表什么?以及他们各自的使用场景和作用。(北京楚*龙)

  • this:代表当前对象的引用,通常用于在构造器或方法中引用当前对象的成员。
  • super:代表当前对象的父类对象的引用,用于访问父类的成员。

35.谈谈你对多态的理解(三*重工、江*智能、银*数据、君*科技)

  • 多态是指一个类的对象可以表现为多种形式的能力。在Java中,多态可以通过覆盖父类的方法来实现,即子类可以根据需要重写父类的方法,从而实现不同的行为。

36.多态new出来的对象跟不多态new出来的对象区别在哪?(万*智能)

  • 使用多态new出来的对象实际上是指向上层类型的引用指向了下层类型的对象。这样的好处是可以使用统一的接口来处理不同类型的对象,从而提高了代码的复用性和扩展性。

37.说说你认为多态在代码中的体现(楚*龙)

  • 多态在代码中的体现通常是通过继承和接口实现。通过多态,可以编写更灵活的代码,例如,可以编写一个接收基类引用的函数,然后传入任何继承自该基类的子类对象。

38.==与equals的区别(拓*思)

  • ==:比较两个对象的引用是否相等。
  • equals:比较两个对象的内容是否相等,默认的行为是比较引用是否相等,但在很多类中会被重写以提供具体的比较逻辑。

39.重写equals方法要注意什么?(安**网络科技)

  • 重写equals时,应该同时重写hashCode方法,以保证对象的相等性与其哈希码的一致性。
  • equals方法应该遵循一些约定,比如对称性、反射性、传递性等。

40.Java中所有类的父类是什么?他都有什么方法?(阿*校招)

  • 所有类的父类:java.lang.Object类。
  • Object类的方法:toString(), equals(Object obj), hashCode(), getClass(), notify(), notifyAll(), wait()等。

        这些方法提供了基本的功能,如对象的字符串表示、对象的比较、哈希码计算等。

41.静态变量和实例变量的区别?(保*丰、*软国际、*软华*、北京明**信)

  • 静态变量(类变量):属于类,不依赖于任何实例,被该类的所有实例共享。
  • 实例变量:属于对象,每个对象都有自己的一份拷贝,不同对象的实例变量互不影响。

42.静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?(*度)

  • 静态属性和静态方法可以被继承,但不能被重写(override)。因为静态方法是属于类的,不是对象的,所以子类不能通过重写来改变父类的静态方法。

43.是否可以从一个static方法内部发出对非static方法的调用?(同*顺)

  • 不可以。static方法属于类,而非static方法属于对象实例。在static方法中直接调用非static方法会导致编译错误,因为static方法执行时可能还没有任何对象实例被创建。

44.被static修饰的成员(类、方法、成员变量)能否再使用private进行修饰?(联*优势)

  • 可以。static成员可以是public、protected、private或默认访问权限。使用private修饰可以限制对static成员的访问,即使它们是类级别的。

45.知道哪些设计模式?(*通快递、蚂**服)

  • 常见的设计模式包括单例模式、工厂模式、建造者模式、策略模式、观察者模式等。

46.开发中都用到了那些设计模式?用在什么场合? (久*国际物流)

  • 单例模式常用于管理数据库连接或日志记录器,工厂模式用于创建对象时解耦对象的创建和使用,策略模式用于算法的灵活切换等。

47.main()方法的public能不能换成private,为什么(凡*科技、顺*)

  • 不可以。main()方法是程序的入口点,必须是public的,以便JVM可以访问它。如果改为private,JVM将无法调用main()方法,导致程序无法运行。

48.main()方法中是否可以调用非静态方法?(浩*科技)

  • 可以,但需要先创建类的实例。因为非静态方法依赖于具体的对象实例。

49.类的组成和属性赋值执行顺序?

  • 类定义中的顺序决定了属性赋值的顺序。首先是默认初始值,然后是显式赋值,最后是在构造函数中赋值。

50.静态代码块,普通代码块,构造方法,从类加载开始的执行顺序?

  • 静态代码块 -> 普通代码块 -> 构造方法。静态代码块只在类加载时执行一次,普通代码块在每次对象创建时执行,构造方法在对象实例化时执行。

51.描述一下对final理解

  • final修饰的类不能被继承;final修饰的方法不能被重写;final修饰的变量是一个常量,其值不可改变。

52.判断题:使用final修饰一个变量时,是引用不能改变,引用指向的对象可以改变?(*米)

  • 错误。当final修饰一个引用变量时,意味着这个引用变量一旦被赋值后不可更改,即不能指向另一个对象。但如果是对象内部的可变状态,则可以改变。

53.判断题:final不能用于修饰构造方法?

  • 正确。构造方法不能被声明为final。因为构造方法的主要目的是初始化对象,而final用于防止方法被重写或类被继承,这与构造方法的目的相悖。

54.final或static final 修饰成员变量,能不能进行++操作?

  • static final修饰的成员变量是常量,不能被修改,包括不能进行++操作。final修饰的非static成员变量可以进行++操作,但一旦赋值后不能再改变。

55.什么是抽象类?如何识别一个抽象类?

  • 抽象类是不能实例化的类,通常用于表示一个概念或基类,它可能包含抽象方法(没有具体实现的方法)和具体方法。识别一个抽象类通常通过看类声明中是否有abstract关键字。

56.为什么不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法?

  • 抽象方法是需要子类提供具体实现的方法,而私有方法和静态方法无法被子类访问,因此不能被重写。构造器不能被声明为abstract,因为它的目的是初始化对象,而abstract方法的目的是要求子类提供实现。final方法不能被重写,与抽象方法的目的相冲突。

57.接口与抽象类的区别?

  • 接口可以声明方法和常量,但不能有实现;抽象类可以包含方法的实现。一个类可以实现多个接口,但只能继承一个抽象类。接口是完全抽象的,而抽象类可以包含具体的方法和属性。

58.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实现类(concrete class)?

  • 接口可以继承一个或多个其他接口。抽象类可以实现(implements)接口,但实现接口时必须提供接口中所有方法的具体实现。抽象类可以继承实现类,但这样做会使得实现类失去其具体性,通常不推荐。

59.接口可以有自己属性吗?

  • 在Java 8之前,接口不能有属性,只能有静态常量。从Java 8开始,接口可以有默认方法和静态方法,但仍然不能有实例属性,只能有静态属性。

60.访问接口的默认方法如何使用(上海*思)

  • 接口中的默认方法允许有具体实现,实现该接口的类可以显式地覆盖这些默认方法,也可以直接使用接口中定义的默认实现。

61.内部类有哪几种?

  • 成员内部类、局部内部类、匿名内部类、静态内部类。

62.内部类的特点说一下

  • 内部类可以访问外部类的成员,包括私有成员。成员内部类可以有多种访问修饰符,局部内部类只能在方法内部使用。匿名内部类没有名字,通常用于实现接口或抽象类的单次使用。静态内部类不依赖于外部类的实例。

63.匿名类说一下

  • 匿名类是一种没有名字的内部类,通常用于实现接口或继承一个类的单次使用。它允许在表达式中创建和实例化一个类。

64.枚举可以继承吗?

  • Java中的枚举类型不能继承其他类,但可以实现接口。

65.Java基本类型与包装类的区别

  • 基本类型是Java语言内置的数据类型,如int、double等,直接存储数值。包装类是对应基本类型的封装类,如Integer、Double等,提供了对象的特性,如方法和属性。

66.谈谈你对面向对象的理解(君*科技、航*拓普、...)

  • 面向对象是一种编程范式,它使用对象来表示数据和方法。对象是类的实例,类是对象的蓝图。面向对象的三大特性是封装、继承和多态。封装隐藏了对象的内部状态和实现细节,只暴露接口;继承允许创建层次化的类结构;多态允许不同类的对象对同一消息做出响应。

67.面向对象的特征有哪些方面? (北京楚*龙、深圳德*科技、直*科技、米*奇网络、航*拓普)

  • 面向对象的特征主要包括封装、继承、多态和抽象。封装隐藏了对象的内部状态和实现细节,只暴露接口;继承允许创建层次化的类结构;多态允许不同类的对象对同一消息做出响应;抽象是提取和忽略非本质细节,关注对象的本质特征。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构—单链表
  • 让医院更智慧,让决策更容易
  • LeetCode_sql_day30(1264.页面推荐)
  • ROS学习笔记13——rosbag功能包的简单使用
  • 【自动化测试】常见的自动化遍历工具以及如何选择合适的自动化遍历工具
  • 1、vectorCast单元测试常用操作
  • 关于 OceanBase 4.x 中被truncate的 table 不再支持进回收站的原因
  • CSS——网格布局(display: grid)之上篇
  • 链路聚合(Link Aggregation)
  • vue 入门一
  • 【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第二篇-着色器制作】
  • JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
  • jQuery 简介 ③ ready()事件函数、jQuery 二个原则及容错机制
  • 关系型数据库,NoSQL和内存数据库三种数据库的比较
  • nvm node管理工具常用指令
  • 【刷算法】从上往下打印二叉树
  • 4. 路由到控制器 - Laravel从零开始教程
  • Fastjson的基本使用方法大全
  • Golang-长连接-状态推送
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java教程_软件开发基础
  • js中的正则表达式入门
  • Magento 1.x 中文订单打印乱码
  • ReactNative开发常用的三方模块
  • React-redux的原理以及使用
  • React系列之 Redux 架构模式
  • Redux 中间件分析
  • sessionStorage和localStorage
  • spring security oauth2 password授权模式
  • 正则学习笔记
  • Mac 上flink的安装与启动
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 湖北分布式智能数据采集方法有哪些?
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #NOIP 2014# day.1 T2 联合权值
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $jQuery 重写Alert样式方法
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (多级缓存)缓存同步
  • (附源码)php投票系统 毕业设计 121500
  • (回溯) LeetCode 46. 全排列
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET delegate 委托 、 Event 事件
  • .Net IOC框架入门之一 Unity
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .NET中使用Redis (二)
  • /proc/stat文件详解(翻译)
  • @EnableAsync和@Async开始异步任务支持