JAVA经典面试题:Java内存模型

合集下载

120道Java面试题以及答案陆小马功钟浩

120道Java面试题以及答案陆小马功钟浩

多线程、并发及线程的基础问题1)Java 中能创建volatile 数组吗?能,Java 中可以创建volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。

我的意思是,如果改变引用指向的数组,将会受到volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了。

2)volatile 能使得一个非原子操作变成原子操作吗?一个典型的例子是在类中有一个long 类型的成员变量。

如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为volatile。

为什么?因为Java 中读取long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该long 变量的值,另一个线程可能只能看到该值的一半(前32 位)。

但是对一个volatile 型的long 或double 变量的读写是原子。

3)volatile 修饰符的有过什么实践?一种实践是用volatile 修饰long 和double 变量,使其能按原子类型来读写。

double 和long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个32 位,然后再读剩下的32 位,这个过程不是原子的,但Java 中volatile 型的long 或double 变量的读写是原子的。

volatile 修复符的另一个作用是提供内存屏障(memory barrier),例如在分布式框架中的应用。

简单的说,就是当你写一个volatile 变量之前,Java 内存模型会插入一个写屏障(write barrier),读一个volatile 变量之前,会插入一个读屏障(read barrier)。

意思就是说,在你写一个volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。

4)volatile 类型变量提供什么保证?volatile 变量提供顺序和可见性保证,例如,JVM 或者JIT为了获得更好的性能会对语句重排序,但是volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。

java工程师面试可能问到的问题

java工程师面试可能问到的问题

java工程师面试可能问到的问题作为Java 工程师面试官,以下是一些常见的问题及其回答建议:你能介绍一下Java 集合框架吗?回答建议:集合框架是Java 中非常重要的一部分,可以用来处理数据结构。

回答时应包括以下几个方面:集合框架的组成、各个集合类的特点和用途、集合类之间的关系和区别等。

你能介绍一下Java 中的多线程吗?回答建议:多线程是Java 中非常重要的一部分,可以用来提高程序的效率。

回答时应包括以下几个方面:线程的创建、线程的生命周期、线程同步和锁、线程池等。

你能介绍一下Java 中的设计模式吗?回答建议:设计模式是Java 中非常重要的一部分,可以用来提高程序的可读性、可维护性和可扩展性。

回答时应包括以下几个方面:常见的设计模式、设计模式的用途和优点、设计模式的实现等。

你能介绍一下Java 中的数据库编程吗?回答建议:数据库编程是Java 中非常重要的一部分,可以用来处理数据的存储和读取。

回答时应包括以下几个方面:JDBC 的使用、SQL 语句的编写、数据库连接池等。

你能介绍一下Java 中的Web 开发吗?回答建议:Web 开发是Java 中非常重要的一部分,可以用来开发基于Web 的应用程序。

回答时应包括以下几个方面:Servlet 和JSP 的使用、Spring MVC 的使用、Web 应用程序的安全性等。

你能介绍一下Java 中的内存管理和垃圾回收吗?回答建议:内存管理和垃圾回收是Java 中非常重要的一部分,可以用来保证程序的性能和稳定性。

回答时应包括以下几个方面:Java 内存模型、垃圾回收机制、内存泄漏的避免等。

你能介绍一下Java 中的异常处理吗?回答建议:异常处理是Java 中非常重要的一部分,可以用来保证程序的健壮性和稳定性。

回答时应包括以下几个方面:异常的类型、异常的处理方式、异常的避免等。

java面试题库java面试题目及答案(3篇)

java面试题库java面试题目及答案(3篇)

第1篇一、基础知识1. Java简介题目:请简述Java的基本特点。

答案:- 简单易学:Java设计之初就考虑了易学性,使用面向对象编程。

- 原生跨平台:Java通过JVM(Java虚拟机)实现跨平台运行。

- 安全性:Java提供了强大的安全机制,如沙箱安全模型。

- 体系结构中立:Java不依赖于特定的硬件或操作系统。

- 高效:Java的运行速度接近C/C++。

- 多线程:Java内置多线程支持,便于实现并发处理。

- 动态性:Java在运行时可以进行扩展和修改。

2. Java虚拟机题目:请解释Java虚拟机(JVM)的作用。

答案:JVM是Java程序的运行环境,其主要作用包括:- 将Java字节码转换为本地机器码。

- 管理内存,包括堆、栈、方法区等。

- 提供垃圾回收机制。

- 管理线程和同步。

3. Java内存模型题目:请简述Java内存模型的组成。

答案:Java内存模型主要由以下部分组成:- 堆(Heap):存储对象实例和数组。

- 栈(Stack):存储局部变量和方法调用。

- 方法区(Method Area):存储类信息、常量、静态变量等。

- 本地方法栈(Native Method Stack):存储本地方法调用的相关数据。

- 程序计数器(Program Counter Register):存储线程的当前指令地址。

4. Java关键字题目:请列举并解释Java中的几个关键字。

答案:- `public`:表示访问权限为公开。

- `private`:表示访问权限为私有。

- `protected`:表示访问权限为受保护。

- `static`:表示属于类本身,而非对象实例。

- `final`:表示常量或方法不能被修改。

- `synchronized`:表示线程同步。

- `transient`:表示数据在序列化时不会被持久化。

二、面向对象编程5. 类和对象题目:请解释类和对象之间的关系。

答案:类是对象的模板,对象是类的实例。

java模拟面试题目(3篇)

java模拟面试题目(3篇)

第1篇一、Java基础知识1. 请简述Java语言的特点。

2. 什么是Java虚拟机(JVM)?它有什么作用?3. 什么是Java的内存模型?请解释Java内存模型中的几个关键概念:堆、栈、方法区、程序计数器、本地方法栈。

4. 什么是Java中的反射机制?请举例说明反射在Java中的应用。

5. 什么是Java中的泛型?请解释泛型的原理和作用。

6. 请简述Java中的四种访问控制符:public、protected、default、private。

7. 什么是Java中的继承和多态?请举例说明继承和多态在实际开发中的应用。

8. 什么是Java中的封装?请举例说明封装在实际开发中的应用。

9. 什么是Java中的接口和抽象类?它们之间有什么区别?10. 什么是Java中的异常处理?请解释try-catch-finally语句的执行顺序。

二、Java集合框架1. 请列举Java集合框架中的常用集合类及其特点。

2. 请简述ArrayList、LinkedList、HashMap、HashSet的区别。

3. 什么是Java中的泛型集合?请举例说明泛型集合的应用。

4. 什么是Java中的迭代器(Iterator)和枚举器(Enum)?请比较它们的区别。

5. 什么是Java中的List、Set、Map的遍历方法?6. 请解释Java中的ArrayList和LinkedList的内部实现原理。

7. 什么是Java中的HashMap的扩容机制?8. 什么是Java中的HashSet的内部实现原理?9. 请解释Java中的线程安全集合类,如CopyOnWriteArrayList、ConcurrentHashMap。

三、Java多线程与并发1. 什么是Java中的线程?请解释线程的创建、调度和同步。

2. 请简述Java中的线程状态,如新建、就绪、运行、阻塞、等待、超时等待、终止。

3. 什么是Java中的同步机制?请解释synchronized关键字的作用。

java跳槽面试题目(3篇)

java跳槽面试题目(3篇)

第1篇一、Java基础知识1. 请简述Java的基本特点。

解析:Java具有“一次编写,到处运行”的特点,具有跨平台性;具有简单易学、面向对象、分布式、解释型、健壮性、安全性、体系结构中立、多线程、动态性等特点。

2. 什么是JVM?请简述JVM的作用。

解析:JVM(Java虚拟机)是运行所有Java应用程序的虚拟机。

它的作用是执行Java字节码,为Java程序提供运行环境,保证Java程序跨平台运行。

3. 请简述Java中的四种访问控制符及其作用。

解析:- public:表示公开的访问控制符,可以在任何地方访问。

- private:表示私有的访问控制符,只能在类内部访问。

- protected:表示受保护的访问控制符,可以在类内部和子类中访问。

- default(无修饰符):表示默认的访问控制符,只能在本包内访问。

4. 什么是封装?请举例说明。

解析:封装是将类的属性和行为封装在一起,对外只提供有限的接口。

例如,一个学生类,包含姓名、年龄、性别等属性,以及学习、休息等方法。

5. 什么是继承?请举例说明。

解析:继承是子类继承父类的方法和属性。

例如,一个动物类,包含行走、吃食等方法,一个猫类继承自动物类,则猫类具有行走、吃食等方法。

6. 什么是多态?请举例说明。

解析:多态是指同一个方法在不同对象上有不同的行为。

例如,一个形状类,包含计算面积的方法,一个圆形和正方形类继承自形状类,计算面积的方法在圆形和正方形类中有不同的实现。

7. 什么是接口?请举例说明。

解析:接口是一种规范,定义了类应该具有的方法,但不提供具体实现。

例如,一个Comparable接口,定义了compareTo方法,用于比较两个对象的大小。

8. 什么是泛型?请举例说明。

解析:泛型是一种类型参数化技术,可以在编译时进行类型检查,提高代码的安全性。

例如,一个List<T>泛型集合,可以存储任意类型的元素。

二、Java集合框架1. 请简述Java集合框架中的常用类及其特点。

Java内存模型面试题集

Java内存模型面试题集

Java内存模型面试题集在Java开发领域中,面试题是评估一个候选人技能水平和专业知识的重要方式之一。

针对Java内存模型的面试题,以下是一些常见问题及其解答,帮助读者更好地理解和掌握Java内存模型。

1. 什么是Java内存模型(Java Memory Model, JMM)?Java内存模型定义了Java虚拟机(JVM)在多线程编程中如何处理内存访问和操作的规范。

它确保了多线程程序在并发执行时的可见性、有序性和原子性。

2. JMM中的主内存和工作内存有什么区别?主内存是所有线程共享的内存区域,用于存储共享变量。

每个线程都有自己的工作内存,用于存储该线程使用到的变量的副本。

3. 什么是可见性问题?可见性问题是指当一个线程修改了某个共享变量的值时,其他线程能否立即看到这个修改。

JMM通过使用主内存和工作内存之间的同步机制来解决可见性问题。

4. 什么是顺序一致性?顺序一致性是指多线程程序的执行结果与该程序在单线程执行时的执行结果一致。

Java内存模型保证了满足顺序一致性的内存访问顺序。

5. 什么是重排序?重排序是指编译器或处理器为了提高运行速度而对指令序列进行重新排序的优化手段。

重排序可能会改变程序的执行顺序,但不会影响单线程下的执行结果。

6. 什么是happens-before原则?happens-before原则是指在多线程编程中,如果操作A happens-before 操作B,那么操作A的执行结果将对操作B可见。

它定义了一系列规则,保证了多线程程序的正确执行。

7. 什么是volatile关键字?它的作用是什么?volatile关键字用于修饰共享变量,保证了对该变量的读写操作具有可见性。

它禁止了对该变量的重排序,并保证了操作的原子性。

8. 什么是原子性操作?原子性操作是指不可再分割的操作。

在Java中,对基本数据类型的读写操作都具有原子性。

而对于复合操作或非原子性操作,可以通过synchronized关键字或锁来保证原子性。

尚硅谷面试题

尚硅谷面试题

尚硅谷面试题尚硅谷是一家知名的IT培训机构,提供高质量的编程教育和就业服务。

作为一名学员或者准备面试的应聘者,了解尚硅谷的面试题目是非常重要的。

本文将为大家介绍几道尚硅谷的常见面试题,并且给出详细的解答和思路分析。

面试题一:谈谈Java中的多态性?思路分析:多态性是面向对象编程的重要特性之一,也是Java语言中常见的面试题目。

多态性通过继承和接口实现,实现了父类引用可以指向子类对象的特点。

在面试中,可以从多个角度来回答这个问题,包括多态的定义、实现方式、优点和应用场景等。

解答:多态性是指同一类型的变量,在不同的对象实例上表现出不同的行为。

在Java中,多态性通过继承和接口实现。

通过继承,我们可以定义一个父类,然后派生出多个子类,这些子类都拥有父类的属性和方法。

通过接口,我们可以定义一组规范,然后多个类实现这个接口,根据实现类的不同,调用相同的接口方法会得到不同的结果。

多态性的主要优点是增加代码的灵活性和可扩展性。

通过使用父类引用指向不同的子类对象,我们可以在运行时动态地选择调用哪个子类的方法,从而实现了代码的灵活性。

另外,当需要添加新的子类时,我们只需要继承或者实现相同的父类或接口,而不需要修改原有的代码,从而实现了代码的可扩展性。

多态性适用于很多场景,比如通过一个统一的接口来操作不同的实现类,实现代码的解耦和通用性;通过将子类对象当作父类对象使用,提高代码的灵活性和可维护性等。

但是需要注意,在进行多态操作时,需要保证父类引用指向的对象是其子类对象,否则会出现类型转换异常。

面试题二:谈谈Java中的异常处理机制?思路分析:异常处理是Java编程的重要部分,良好的异常处理能够提高程序的健壮性和容错性。

在面试中,可以从异常的概念和分类、处理方法、异常处理的最佳实践等方面来回答这个问题。

解答:在Java中,异常是指程序在运行时遇到的意外事件或错误条件。

异常分为受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

java高级开发场景程序设计面试题

java高级开发场景程序设计面试题

java高级开发场景程序设计面试题
以下是一些Java高级开发场景程序设计面试题,这些问题可以帮助你了解应聘者的技能和经验:
1. 请描述一下您对Java内存模型的理解,以及它在并发编程中的应用。

2. 请解释一下Java中的垃圾回收机制,以及如何优化垃圾回收性能。

3. 请解释一下Java中的线程和进程的区别,以及如何在Java中实现多线程编程。

4. 请描述一下您如何使用Java中的并发工具类(例如,ExecutorService,Semaphore,CyclicBarrier等)来解决实际问题。

5. 请解释一下您如何处理高并发情况下的系统性能问题,以及您所使用的方法和工具。

6. 请描述一下您如何使用Java中的设计模式来解决实际问题,以及您所使用的设计模式的优缺点。

7. 请解释一下您如何进行单元测试和集成测试,以及您所使用的测试框架(例如,JUnit,TestNG等)。

8. 请解释一下您如何进行代码优化和重构,以及您所使用的工具和技术。

9. 请描述一下您如何使用Java中的版本控制工具(例如,Git),以及您所使用的分支策略。

10. 请解释一下您如何进行系统性能调优,以及您所使用的工具和技术。

这些问题可以帮助你了解应聘者的技能和经验,以及他们如何解决实际问题。

当然,这些问题只是面试题的一部分,你可以根据实际情况进行适当的修改和补充。

Java经典面试题及答案(200题)

Java经典面试题及答案(200题)

Java经典面试题及答案(200题) Java经典面试题200道Java 基础1. JDK 和 JRE 有什么区别?JDK:Java Development Kit 的简称,Java 开发工具包,提供了Java 的开发环境和运行环境。

JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。

简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。

2. == 和 equals 的区别是什么?「== 解读」对于基本类型和引用类型 == 的作用效果是不同的,如下所示:基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;代码示例:String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

「equals 解读」equals 本质上就是 ==,只不过 String 和 Integer 等重写了equals 方法,把它变成了值比较。

2024年Java经典面试题及答案

2024年Java经典面试题及答案

2024年Java经典面试题及答案问:Java中的泛型是什么?它有什么作用?答:Java中的泛型是一种参数化类型,它允许使用一个占位符来代表各种类型。

它的作用是在编译时检测类型的一致性,避免了类型转换错误,并提高了代码的重用性。

问:Java中的静态方法和实例方法有什么区别?答:静态方法是属于类的方法,可以在不创建实例对象的情况下被调用,它可以直接通过类名来调用。

实例方法是属于具体实例对象的方法,需要先创建实例对象才能调用。

问:Java中的反射是什么?它有什么用途?答:反射是指在运行状态中,动态获取类的信息并操作类的属性和方法。

它的主要用途是在运行时动态创建对象、访问属性和调用方法,以及在编译时无法确定类型的情况下进行操作。

问:Java中的多线程是什么?如何创建多线程?答:多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务。

要创建多线程可以通过继承Thread 类或实现Runnable接口来实现。

问:Java中的异常处理是什么?有哪些常见的异常类型?答:异常处理是指在程序执行过程中处理各种错误或异常情况。

常见的异常类型包括NullPointerException、ArrayIndexOutOfBoundsExcpetion、IOException等。

问:Java中的集合框架是什么?它有哪些常见的接口和类?答:集合框架是Java中用于存储和操作对象的数据结构。

常见的接口包括List、Set、Map等,常见的类包括ArrayList、LinkedList、HashSet、HashMap等。

问:Java中的IO流是什么?它有哪些常见的流类型?答:IO流是用于输入和输出操作的流。

常见的流类型包括字节流和字符流,分别对应InputStream/OutputStream和Reader/Writer。

在Java编程中, IO流是非常重要的一个概念。

IO流是用于将数据从一个地方传输到另一个地方的机制,它允许程序通过输入和输出来访问数据。

Java线程面试题Top50

Java线程面试题Top50

下面是Java线程相关的热门面试题,你可以用它来好好准备面试。

1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。

比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。

Java 在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。

欲了解更多详细信息请点击这里。

2) 线程和进程有什么区别?线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。

不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。

别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

更多详细信息请点击这里。

3) 如何在Java中实现线程?在语言层面有两种方式。

ng.Thread 类的实例就是一个线程但是它需要调用ng.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承ng.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。

更多详细信息请点击这里.4) 用Runnable还是Thread?这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。

所以如果你要继承其他类,当然是调用Runnable接口好了。

更多详细信息请点击这里。

6) Thread 类中的start() 和run() 方法有什么区别?这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。

当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

Java虚拟机(JVM)面试题-51道

Java虚拟机(JVM)面试题-51道

4. 说一下 JVM由那些部分组成,运行流程是什么?JVM包含两个子系统和两个组件: 两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。

Class loader(类装载):根据给定的全限定名类名(如:ng.Object)来装载class文件到Runtime data area中的method area。

Execution engine(执行引擎):执行classes中的指令。

Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。

Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。

程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解线程A在看直播突然,线程B来了一个视频电话,就会抢夺线程A的时间片,就会打断了线程A,线程A 就会挂起解析栈帧:1. 局部变量表:是用来存储我们临时8个基本数据类型、对象引用地址、returnAddress类型。

(returnAddress中保存的是return后要执行的字节码的指令地址。

)2. 操作数栈:操作数栈就是用来操作的,例如代码中有个 i = 6*6,他在一开始的时候就会进行操作,读取我们的代码,进行计算后再放入局部变量表中去3. 动态链接:假如我方法中,有个 service.add()方法,要链接到别的方法中去,这就是动态链接,存储链接的地方。

4. 出口:出口是什呢,出口正常的话就是return 不正常的话就是抛出异常落一个方法调用另一个方法,会创建很多栈帧吗?答:会创建。

如果一个栈中有动态链接调用别的方法,就会去创建新的栈帧,栈中是由顺序的,一个栈帧调用另一个栈帧,另一个栈帧就会排在调用者下面栈指向堆是什么意思?栈指向堆是什么意思,就是栈中要使用成员变量怎么办,栈中不会存储成员变量,只会存储一个应用地址递归的调用自己会创建很多栈帧吗?答:递归的话也会创建多个栈帧,就是在栈中一直从上往下排下去8. 你能给我详细的介绍Java堆吗?(重点理解)java堆(Java Heap)是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。

java校招面试题目(3篇)

java校招面试题目(3篇)

第1篇第一部分:基础知识1. Java基本概念(1)请解释Java中的面向对象编程(OOP)的特点。

解析:面向对象编程的特点包括封装、继承和多态。

封装是指将数据和对数据的操作封装在一个类中;继承是指允许一个类继承另一个类的属性和方法;多态是指同一个方法在不同对象上表现出不同的行为。

(2)简述Java中的四种访问控制符及其作用范围。

解析:Java中的四种访问控制符分别是public、protected、默认(不写)和private。

public可以访问任何类;protected可以在同一个包内和子类中访问;默认访问(不写)只能在同一个包内访问;private只能在类内部访问。

2. Java基本数据类型(1)请列出Java中的基本数据类型,并说明其特点和取值范围。

解析:Java中的基本数据类型包括byte、short、int、long、float、double、char和boolean。

byte和short为有符号整数类型,取值范围分别为-128到127和-32,768到32,767;int为基本整型,取值范围为-2,147,483,648到2,147,483,647;long为长整型,取值范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807;float和double为浮点数类型,取值范围分别为-3.4E38到3.4E38和-1.8E308到1.8E308;char为字符类型,取值范围为0到65,535;boolean为布尔类型,取值为true或false。

(2)简述Java中的自动装箱和拆箱。

解析:自动装箱是指将基本数据类型自动转换为包装类型(如int自动转换为Integer);自动拆箱是指将包装类型自动转换为基本数据类型。

在装箱和拆箱过程中,如果数据类型不匹配,会抛出ClassCastException异常。

3. Java关键字(1)请解释Java中的关键字final、static和synchronized。

java面试题汇总及详解美团篇-

java面试题汇总及详解美团篇-

•美团篇5.1.0 java 虚拟机内存模型5.1.1 内存溢出一般发生在哪个区?永久代会不会导致内存溢出?5.1.2 动态加载类的框架了解哪些?5.1.3 动态代理一般有哪几种实现方式?动态代理的应用场景有哪些?5.1.4 栈会不会溢出?栈溢出一般抛什么异常?jvm 在哪里设置栈的大小?设置的参数是什么?5.1.5 用过哪些命令查看jvm 的状态、堆栈信息?5.1.6 jvm 的垃圾回收机制?5.1.7 java 类加载机制?如何实现自定义类加载器?findClass 与loadClass 的区别?5.1.8 String、StringBuffer、StringBuilder 的区别?对应的使用场景?5.1.9 如何实现不可变的类?5.2.0 浅复制和深复制?怎样实现深复制?5.2.1 HashMap、HashTable、ConcurrentHashMap 的区别?5.2.2 CAS 是一种什么样的同步机制?5.2.3 NIO 的原理,包括哪几个组件?5.2.4 简单介绍一下java 的反射机制?反射在哪些地方有应用场景?5.2.5 spring 加载bean 的流程?5.2.6 java 线程池?线程池构造函数的几个参数含义?keepAliveTime 解释一下?5.2.7 一个接口,要去调用另外5 个接口,每一个接口都会返回数据给这个调用接口,调用接口要对数据进行合并并返回给上层。

这样一种场景可能用到并发包下的哪些类?你会怎么去实现这样的业务场景?5.2.8 CountDownLatch 和CyclicBarrier 的区别?5.2.9 线程加锁有哪些方式?synchronized 和lock 的区别?5.3.0 volatile 关键字的作用?为什么使用AtomicLong 而不使用Long?AtomicLong 的底层是怎么实现的?5.3.1 mysql 的存储引擎有哪几种?5.3.2 sql 优化有哪些着手点?组合索引的最左前缀原则的含义?5.3.3 springmvc 处理请求的流程?5.3.4 spring 的事务怎么使用?事务回滚?自定义异常?5.3.5 脏读?幻读?5.3.6 tcp 四次挥手的过程?TIME_WAIT 为什么至少设置两倍的MSL 时间?5.3.7 get 和post 请求的区别?5.3.8 cookie 和session 的请求?5.3.9 了解哪些开源的中间件?缓存?消息?分布式框架?5.4.0 用到过哪些设计模式?单例模式的实现?5.4.1 数据库的事务实现原理、操作过程、如何做到事物之间的独立性等问题5.4.2 数据库的脏读,幻读,不可重复读出现的原因原理,解决办法5.4.3 数据库的隔离级别、MVCC5.4.4 乐观锁、悲观锁、互斥锁、读写锁的原理实现与区别5.4.5 线程的生命周期5.4.6 一致性hash 算法原理与应用5.4.7 CAP 原则5.4.8 CAS 操作5.4.9 分布式raft 算法5.1.0 java 虚拟机内存模型5.1.1 内存溢出一般发生在哪个区?永久代会不会导致内存溢出?5.1.2 动态加载类的框架了解哪些?5.1.3 动态代理一般有哪几种实现方式?动态代理的应用场景有哪些?5.1.4 栈会不会溢出?栈溢出一般抛什么异常?jvm 在哪里设置栈的大小?设置的参数是什么?5.1.5 用过哪些命令查看jvm 的状态、堆栈信息?5.1.6 jvm 的垃圾回收机制?5.1.7 java 类加载机制?如何实现自定义类加载器?findClass 与loadClass 的区别?5.1.8 String、StringBuffer、StringBuilder 的区别?对应的使用场景?5.1.9 如何实现不可变的类?5.2.0 浅复制和深复制?怎样实现深复制?5.2.1 HashMap、HashTable、ConcurrentHashMap 的区别?5.2.2 CAS 是一种什么样的同步机制?5.2.3 NIO 的原理,包括哪几个组件?5.2.4 简单介绍一下java 的反射机制?反射在哪些地方有应用场景?5.2.5 spring 加载bean 的流程?5.2.6 java 线程池?线程池构造函数的几个参数含义?keepAliveTime 解释一下?5.2.7 一个接口,要去调用另外5 个接口,每一个接口都会返回数据给这个调用接口,调用接口要对数据进行合并并返回给上层。

测试面试Java经典面试题汇总

测试面试Java经典面试题汇总

测试⾯试Java经典⾯试题汇总Java ⽬前仍然是业界应⽤最为⼴泛的编程语⾔,在很多互联⽹⼤⼚,深度掌握 Java 是中⾼级测试开发/测试架构师的必备核⼼技能。

技术⾯试中,Java编程技能也⼀直是考核重点。

本⽂整理汇总了常见的经典 Java⾯试题⽬(较偏向初级和中级⽔平),供各位测试开发同学参考。

这⾥只给出问题,不列出参考答案(很多问题答案并不唯⼀),有兴趣的可以留⾔讨论,进阶学习⽂末加群。

⼀、基础篇1.1、Java 基础⾯向对象的特征:继承、封装和多态final, finally, finalize 的区别Exception、Error、运⾏时异常与⼀般异常有何异同请写出 5 种常见到的 runtime exceptionint 和 Integer 有什么区别,Integer 的值缓存范围包装类,装箱和拆箱String、StringBuilder、StringBuffer重载和重写的区别抽象类和接⼝有什么区别说说反射的⽤途及实现说说⾃定义注解的场景及实现HTTP 请求的 GET 与 POST ⽅式的区别Session 与 Cookie 区别列出⾃⼰常⽤的 JDK 包MVC 设计思想equals 与 == 的区别hashCode 和 equals ⽅法的区别与联系什么是 Java 序列化和反序列化,如何实现 Java 序列化?或者请解释 Serializable 接⼝的作⽤Object 类中常见的⽅法,为什么 wait notify 会放在 Object ⾥边?Java 的平台⽆关性如何体现出来的JDK 和 JRE 的区别Java 8 有哪些新特性1.2、Java 常见集合List 和 Set 区别Set 和 hashCode 以及 equals ⽅法的联系List 和 Map 区别Arraylist 与 LinkedList 区别ArrayList 与 Vector 区别HashMap 和 Hashtable 的区别HashSet 和 HashMap 区别HashMap 和 ConcurrentHashMap 的区别HashMap 的⼯作原理及代码实现,什么时候⽤到红⿊树多线程情况下 HashMap 死循环的问题HashMap 出现 Hash DOS 攻击的问题ConcurrentHashMap 的⼯作原理及代码实现,如何统计所有的元素个数⼿写简单的 HashMap看过那些 Java 集合类的源码1.3、进程和线程线程和进程的概念、并⾏和并发的概念创建线程的⽅式及实现进程间通信的⽅式说说 CountDownLatch 和 CyclicBarrier 原理和区别说说 Semaphore 原理说说 Exchanger 原理ThreadLocal 原理分析ThreadLocal 为什么会出现 OOM,出现的深层次原理讲讲线程池的实现原理线程池的⼏种实现⽅式线程的⽣命周期,状态是如何转移的1.4、锁机制说说线程安全问题,什么是线程安全,如何保证线程安全重⼊锁的概念,重⼊锁为什么可以防⽌死锁产⽣死锁的四个条件(互斥、请求与保持、不剥夺、循环等待)如何检查死锁(通过 jConsole 检查死锁)volatile 实现原理(禁⽌指令重排、刷新内存)synchronized 实现原理(对象监视器)synchronized 与 lock 的区别AQS 同步队列CAS ⽆锁的概念、乐观锁和悲观锁常见的原⼦操作类什么是 ABA 问题,出现 ABA 问题 JDK 是如何解决的乐观锁的业务场景及实现⽅式Java 8 并法包下常见的并发类偏向锁、轻量级锁、重量级锁、⾃旋锁的概念1.5、JVMJVM 运⾏时内存区域划分内存溢出 OOM 和堆栈溢出 SOE 的⽰例及原因、如何排查与解决如何判断对象是否可以回收或存活常见的 GC 回收算法及其含义常见的 JVM 性能监控和故障处理⼯具类:jps、jstat、jmap、jinfo、jconsole 等JVM 如何设置参数JVM 性能调优类加载器、双亲委派模型、⼀个类的⽣命周期、类是如何加载到 JVM 中的类加载的过程:加载、验证、准备、解析、初始化强引⽤、软引⽤、弱引⽤、虚引⽤Java 内存模型 JMM1.6、设计模式常见的设计模式设计模式的的六⼤原则及其含义常见的单例模式以及各种实现⽅式的优缺点,哪⼀种最好,⼿写常见的单利模式设计模式在实际场景中的应⽤Spring 中⽤到了哪些设计模式MyBatis 中⽤到了哪些设计模式你项⽬中有使⽤哪些设计模式说说常⽤开源框架中设计模式使⽤分析动态代理(很重要!)1.7、数据结构树(⼆叉查找树、平衡⼆叉树、红⿊树、B 树、B+ 树)深度有限算法、⼴度优先算法克鲁斯卡尔算法、普林母算法、迪克拉斯算法什么是⼀致性 Hash 及其原理、Hash 环问题常见的排序算法和查找算法:快排、折半查找、堆排序等1.8、⽹络 /IO 基础BIO、NIO、AIO 的概念什么是长连接和短连接Http1.0 和 2.0 相⽐有什么区别Https 的基本概念三次握⼿和四次挥⼿、为什么挥⼿需要四次从游览器中输⼊ URL 到页⾯加载的发⽣了什么?⼆、数据存储和消息队列2.1、数据库MySQL 索引使⽤的注意事项DDL、DML、DCL 分别指什么explain 命令left join,right join,inner join数据库事物 ACID(原⼦性、⼀致性、隔离性、持久性)事物的隔离级别(读未提交、读以提交、可重复读、可序列化读)脏读、幻读、不可重复读数据库的⼏⼤范式数据库常见的命令说说分库与分表设计分库与分表带来的分布式困境与应对之策(如何解决分布式下的分库分表,全局表?)说说 SQL 优化之道MySQL 遇到的死锁问题、如何排查与解决存储引擎的 InnoDB 与 MyISAM 区别,优缺点,使⽤场景索引类别(B+ 树索引、全⽂索引、哈希索引)、索引的原理什么是⾃适应哈希索引(AHI)为什么要⽤ B+tree 作为 MySQL 索引的数据结构聚集索引与⾮聚集索引的区别遇到过索引失效的情况没,什么时候可能会出现,如何解决limit 20000 加载很慢怎么解决如何选择合适的分布式主键⽅案选择合适的数据存储⽅案常见的⼏种分布式 ID 的设计⽅案常见的数据库优化⽅案,在你的项⽬中数据库如何进⾏优化的2.2、RedisRedis 有哪些数据类型Redis 内部结构Redis 使⽤场景Redis 持久化机制Redis 集群⽅案与实现Redis 为什么是单线程的?缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级使⽤缓存的合理性问题Redis 常见的回收策略2.3、消息队列消息队列的使⽤场景消息的重发补偿解决思路消息的幂等性解决思路消息的堆积解决思路⾃⼰如何实现消息队列如何保证消息的有序性三、开源框架和容器3.1、SSM/ServletServlet 的⽣命周期转发与重定向的区别BeanFactory 和 ApplicationContext 有什么区别Spring Bean 的⽣命周期Spring IOC 如何实现Spring 中 Bean 的作⽤域,默认的是哪⼀个说说 Spring AOP、Spring AOP 实现原理动态代理(CGLib 与 JDK)、优缺点、性能对⽐、如何选择Spring 事务实现⽅式、事务的传播机制、默认的事务类别Spring 事务底层原理如何⾃定义注解实现功能Spring MVC 运⾏流程Spring MVC 启动流程Spring 的单例实现原理Spring 框架中⽤到了哪些设计模式Spring 其他产品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)有没有⽤到 Spring Boot,Spring Boot 的认识、原理MyBatis 的原理3.2、Netty为什么选择 Netty说说业务中,Netty 的使⽤场景原⽣的 NIO 在 JDK 1.7 版本存在 epoll bug什么是 TCP 粘包 / 拆包TCP 粘包 / 拆包的解决办法Netty 线程模型说说 Netty 的零拷贝Netty 内部执⾏流程Netty 重连实现3.3、TomcatTomcat 的基础架构(Server、Service、Connector、Container)Tomcat 如何加载 Servlet 的Pipeline-Valve 机制四、分布式4.1、Nginx请解释什么是 C10K 问题??正向代理和反向代理Nginx ⼏种常见的负载均衡策略Nginx 服务器上的 Master 和 Worker 进程分别是什么使⽤ “反向代理服务器” 的优点是什么 ?4.2、分布式其他谈谈业务中使⽤分布式的场景Session 分布式⽅案Session 分布式处理分布式锁的应⽤场景、分布式锁的产⽣原因、基本概念分布是锁的常见解决⽅案分布式事务的常见解决⽅案集群与负载均衡的算法与实现说说分库与分表设计分库与分表带来的分布式困境与应对之策4.3、Dubbo什么是 Dubbo什么是 RPC、如何实现 RPC、RPC 的实现原理Dubbo 中的 SPI 是什么概念Dubbo 的基本原理、执⾏流程五、微服务5.1、微服务前后端分离是如何做的?微服务哪些框架Spring Could 的常见组件有哪些?领域驱动有了解吗?什么是领域驱动模型?充⾎模型、贫⾎模型JWT 有了解吗,什么是 JWT你怎么理解 RESTful说说如何设计⼀个良好的 API如何理解 RESTful API 的幂等性如何保证接⼝的幂等性说说 CAP 定理、BASE 理论怎么考虑数据⼀致性问题说说最终⼀致性的实现⽅案微服务的优缺点微服务与 SOA 的区别如何拆分服务、⽔平分割、垂直分割如何应对微服务的链式调⽤异常如何快速追踪与定位问题如何保证微服务的安全、认证5.2、安全问题如何防范常见的 Web 攻击、如何⽅式 SQL 注⼊服务端通信安全攻防HTTPS 原理剖析、降级攻击、HTTP 与 HTTPS 的对⽐5.3、性能优化性能指标有哪些如何发现性能瓶颈性能调优的常见⼿段说说你在项⽬中如何进⾏性能调优六、其他6.1、对架构设计的理解能⼒和业务协作说说你在项⽬中使⽤过的 UML 图你如何考虑组件化、服务化、系统拆分秒杀场景如何设计说说公司的流程、如何进⾏⾃动化部署的你和团队是如何沟通的你如何进⾏代码评审说说你对技术与业务的理解说说你在项⽬中遇到感觉最难 Bug,是如何解决的介绍⼀下⼯作中的⼀个你认为最有价值的项⽬,以及在这个过程中的⾓⾊、解决的问题、你觉得你们项⽬还有哪些不⾜的地⽅6.2 软实⼒说说你的优缺点、亮点说说你最近在看什么书、什么博客、在研究什么新技术、再看那些开源项⽬的源代码说说你觉得最有意义的技术书籍⼯作之余做什么事情、平时是如何学习的,怎样提升⾃⼰的能⼒说说个⼈发展⽅向⽅⾯的思考说说你认为的测试开发⼯程师应该具备哪些能⼒说说你认为的测试架构师是什么样的是不是觉得还要学好多东西?加油吧,少年!** _来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web⾃动化测试 app⾃动化测试、接⼝⾃动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全⾯提升测试开发⼯程师的技术实⼒QQ交流群:484590337公众号 TestingStudio。

京东物流java面试题

京东物流java面试题

京东物流java面试题
1、请解释Java的内存模型?
Java的内存模型指的是Java虚拟机的内存结构,它把Java虚拟机分为方法区、堆区、栈区以及其他运行时数据区域。

方法区存放类信息,堆区存放对象实例、内存分配和回收管理等,栈区存放线程执行时的局部变量。

另外,还包括本地方法栈,持有Native方法的栈空间,和运行时常量池等。

2、请简单描述Java线程的生命周期?
Java线程的生命周期由5个状态构成,分别为新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。

新建状态是指线程创建后的初始状态;就绪状态是指线程已经创建,准备运行,等待被调度;运行状态是指线程正在运行,正在执行代码;阻塞状态是指线程在运行过程中,由于某种原因需要等待;死亡状态是指线程执行完毕,任务结束,终止生命周期。

JAVA研发工程师岗位面试题及答案(经典版)

JAVA研发工程师岗位面试题及答案(经典版)

JAVA研发工程师岗位面试题及答案1.介绍一下您的Java开发经验。

答:我有X年的Java开发经验,从基础的JavaSE到企业级应用的开发经验。

我参与过多个项目,包括Web应用、分布式系统和大数据处理。

2.请解释面向对象编程(OOP)的基本概念。

答:面向对象编程是一种编程范式,强调对象的概念,包括封装、继承和多态。

封装将数据和方法封装在一个单元中,继承允许一个类继承另一个类的属性和方法,多态允许不同对象对同一方法具有不同的实现。

3.什么是Java中的异常处理?举个例子说明。

答:异常处理是在程序中处理错误情况的机制。

例如,当尝试除以零时,会抛出ArithmeticException异常。

我们可以使用trycatch 块捕获并处理这些异常,以保证程序的稳定性。

4.请解释Java中的垃圾回收机制。

答:Java的垃圾回收机制是自动管理内存的过程,它会自动回收不再使用的对象,释放内存。

JVM通过监视对象的引用来确定哪些对象可以被回收,例如,当一个对象不再被引用时,它就成为垃圾,等待被垃圾收集器回收。

5.什么是Java中的线程?请说明多线程的优势。

答:线程是独立的执行流,允许多个任务在同一程序中并行执行。

多线程的优势包括更高的程序响应性、更好的资源利用和更快的任务执行,特别是在多核处理器上。

6.如何在Java中创建线程?请举例说明。

答:可以通过继承Thread类或实现Runnable接口创建线程。

例如,通过实现Runnable接口,可以创建一个线程来执行特定任务,提高代码的可重用性。

7.请解释Java中的同步和异步操作。

答:同步操作是指按顺序执行任务,一个任务完成后再执行下一个。

异步操作是指任务在后台执行,不需要等待前一个任务完成。

在Java中,可以使用多线程和异步框架实现异步操作,提高程序的性能和响应性。

8.什么是Java中的设计模式?请提供一个示例。

答:设计模式是解决常见软件设计问题的经验总结,包括单例、工厂、观察者等模式。

java高级场景面试题

java高级场景面试题

java高级场景面试题
在Java高级场景面试中,可能会涉及到以下一些问题:
1. 谈谈你对Java内存模型的理解,以及它在多线程环境中的应用。

2. 描述一下Java中的垃圾回收机制,并解释一下哪些情况会导致对象被垃圾回收。

3. 你如何理解Java中的泛型,以及它在编程中的优势和局限性是什么?
4. 谈谈你对Java中的注解的理解,以及你在项目中如何使用注解。

5. 解释一下Java中的多态性,以及它在面向对象编程中的重要性。

6. 你如何理解Java中的接口和继承,以及它们在编程中的区别和联系是什么?
7. 描述一下Java中的反射机制,以及它在编程中的用途和限制。

8. 谈谈你对Java中的lambda表达式和函数式接口的理解,以及你在项目中如何使用它们。

9. 你如何理解Java中的并发编程,以及你在项目中如何使用并发工具类(如:Lock、Semaphore等)?
10. 解释一下Java中的Optional类,以及它在编程中的用途和限制。

11. 你如何理解Java中的Stream API,以及它在数据处理中的优势和局限性是什么?
12. 描述一下Java中的事件驱动编程,以及你在项目中如何使用事件驱动模型。

13. 你如何理解Java中的设计模式,以及你在项目中如何应用设计模式?
14. 解释一下Java中的JMX(Java Management Extensions),以及它在系统监控和管理中的应用。

15. 你如何理解Java中的序列化机制,以及它在数据持久化中的应用。

以上问题可以作为参考,具体的面试问题会根据面试官的要求和面试者的经验、技能水平等因素而有所不同。

java应届生面试题目(3篇)

java应届生面试题目(3篇)

第1篇一、Java基础知识1. 请简述Java的基本特性和优势。

解析:Java具有简单性、面向对象、分布式、平台无关性、安全性、多线程、动态性、强类型、高效率、可移植性等特性。

其优势在于跨平台、安全性高、易于开发、有丰富的类库等。

2. 请解释Java中的基本数据类型和引用数据类型。

解析:基本数据类型包括byte、short、int、long、float、double、char、boolean;引用数据类型包括类、接口、数组等。

3. 请解释Java中的封装、继承、多态三个基本概念。

解析:封装是指将类的属性和方法封装在一个单元中,隐藏内部实现细节;继承是指子类继承父类的属性和方法,实现代码复用;多态是指同一方法在不同对象上表现不同的行为。

4. 请解释Java中的构造函数和析构函数。

解析:构造函数用于创建对象时初始化对象的属性,析构函数用于销毁对象时释放对象占用的资源。

5. 请解释Java中的static关键字。

解析:static关键字用于修饰成员变量和方法,表示该成员变量或方法属于类,而不是对象。

6. 请解释Java中的final关键字。

解析:final关键字用于修饰成员变量、方法和类,表示该成员变量、方法或类不可修改。

7. 请解释Java中的异常处理机制。

解析:Java中的异常处理机制包括try-catch-finally语句,用于捕获和处理程序中的异常。

8. 请解释Java中的泛型。

解析:泛型是一种参数化类型,允许在定义类、接口和泛型方法时指定类型参数,提高代码的复用性和安全性。

二、Java集合框架1. 请解释Java中的List、Set和Map接口。

解析:List接口表示有序集合,Set接口表示无序集合且元素不可重复,Map接口表示键值对映射。

2. 请解释Java中的ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等常用集合类。

解析:ArrayList和LinkedList实现List接口,ArrayList基于数组实现,LinkedList基于链表实现;HashSet和TreeSet实现Set接口,HashSet基于哈希表实现,TreeSet基于红黑树实现;HashMap和TreeMap实现Map接口,HashMap基于哈希表实现,TreeMap基于红黑树实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JAVA经典面试题:Java内存模型
因为Java内存模型不仅是java重点要学习的技术知识,还是面试的时候经典面试题,希望引起同学们的重视,今天千锋小编就来分享一下java内存模型的相关技术知识。

不同的渠道,内存模型是不一样的,但是jvm的内存模型标准是一致的。

其实java的多线程并发问题都会反映在java的内存模型上,所谓线程安全无非是要操控多个线程对某个资源的有序拜访或修改。

总结java的内存模型,要解决两个首要的问题:可见性和有序性。

可见性:多个线程之间是不能相互传递数据通信的,它们之间的交流只能经过同享变量来进行。

Java内存模型(JMM)规定了jvm有主内存,主内存是多个线程同享的。

当new一个目标的时分,也是被分配在主内存中,每个线程都有自己的作业内存,作业内存存储了主存的某些目标的副本,当然线程的作业内存大小是有限制的。

当线程操作某个目标时,履行次序如下:
(1) 从主存仿制变量到当前作业内存(read and load)
(2) 履行代码,改动同享变量值(use and assign)
(3) 用作业内存数据改写主存相关内容(store and write)
当一个同享变量在多个线程的作业内存中都有副本时,如果一个线程修改了这个同享变量,那么其他线程应该可以看到这个被修改后的值,这就是多线程的可见性问题。

有序性:线程在引证变量时不能直接从主内存中引证,如果线程作业内存中没有该变量,则会从主内存中复制一个副本到作业内存中,完成后线程会引证该副本。

当同一线程再度引证该字段时,有可能从头从主存中获取变量副本(read-load-use),也有可能直接引证本来的副本(use),也就是说read,load,use次序可以由JVM完成体系决议。

线程不能直接为主存中字段赋值,它会将值指定给作业内存中的变量副本(assign),完成后这个变量副本会同步到主存储区(store- write),至于何时同步往昔,依据JVM完成体系决议。

有该字段,则会从主内存中将该字段赋值到作业内存中,这个进程为read-load,完成后线程会引证该变量副本。

知识就财富,这句话再IT行业显示的尤其现实残酷,懂就是懂,不懂就是不懂,所以各位同学,你的努力与否与你财富直接挂钩。

一起加油吧!更多java 技术经典面试题欢迎关注千锋小编。

相关文档
最新文档