没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
17页
JAVA面试常见问题整理 本文主要概述了Java面试中常见的问题及其相关内容。首先,文章介绍了JDK、JRE、JVM的区别和联系,以及它们在Java程序运行过程中的作用。接着,文章详细解释了equals和hashCode的用法及区别,以及String、StringBuffer、StringBuilder的区别和适用场景。 此外,文章还涵盖了Java中的一些基本概念,如final、interface、abstract类、重载和重写等。同时,还讲解了一些关于多线程编程的知识,如线程的生命周期、状态、以及线程安全等问题。 在Java集合框架方面,文章介绍了List、Set和Map的区别和特点,以及它们的使用场景。接下来,文章重点讲解了ConcurrentHashMap的原理和实现方式,以及ThreadLocal的原理和使用场景。 最后,文章简要概述了Spring框架的基本概念和作用,包括IOC、AOP、Bean的作用域等内容。同时,还涉及了事务处理的并发问题、Spring事务的实现方式和隔离级别等相关知识。 总之,本文为读者提供了一个关于Java面试常见问题及内容的概述,帮助读者更好
资源推荐
资源详情
资源评论
JAVA 面试常见问题整理
1、JDK、JRE、JVM 区别和联系
jvm:java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指
令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核
心
jre:运行环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm
来说,多出来的是一部分的 Java 类库。
jdk:开发工具包。包含 jre 和 jvm。
2、==和 equals 的区别
==:用于比较引用和比较基本数据类型时具有不同的功能。
equal:用来检测两个对象是否相等,即两个对象的内容是否相等。
3、final
被 final 修饰的变量不能被改变,被 final 修饰的类不能被继承,被 final 修饰的方法不能被
重写。
4、String、StringBuffer、StringBuild
String:是一个不可变字符串,底层使用 final 修饰
� 在修改字符串操作比较多的时候用 StringBuilder 或 StringBuffer.
� 在要求线程安全的情况下用 StringBuffer
� 在不要求线程安全的情况下用 StringBuilder
5、重载和重写的区别
� 重载:方法名一致,参数列表不同,参数类型不同。与返回值无关
� 重写:方法名一致,参数列表一致,返回类型一致,存在子类中。
6、接口和抽象类
� 抽象类:只能单继承。可以存在普通成员函数。成员变量可以是多种类型的。
� 接口:多实现。只能只存在 public abstract 方法。只能是 publi static final 类型的。
7、list 和 set 的区别
� list:有序可重复。按对象进入顺序保存对象,允许多个 Null 元素对象,可以用
iteratiterator 遍历取出所有元素。在逐一遍历,还可以使用 get(int index)获取指定下标元素。
� set:无序不可重复最多允许一个 Null 元素对象,取元素时只能通过 iteratoriterator
取得所有元素,在逐一遍历各个元素。
8、hashCode 和 equals
� 两者都是比较对象
� equals 比较,比较的比较全面、比较复杂,性能低,所以加上 hashCode 取得 hash
码更加快速,准确。
� 直接使用 hashCode 来比较的话,不同的对象可能会拥有相同的 hash 码,所以比较
的结果不是那么的准确。
9、ArrayList 和 linkedList 区别
� ArrayList 基于数组实现,连续存储在内存中。从中间插入元素比 linkedList 慢,因
为他会将其之后的元素复制,再写入。从末尾添加就不会比 linkedList 慢~
� linkedList 基于链表实现,分散在内存中。
10、HashMap 和 HashTable 的区别
� HashMap:非线程安全的,允许 key 和 value 为 null。
� 底层基于链表和数组实现。java8 开始链表高度达到 8,数组长度超过 64,
链表转化为红黑树,元素以内部类 Node 节点存在。
� key 为 nul,存在下标 0 的位置。
� HashTable:线程安全的,每一个方法 synchronized 修饰。不允许 key 和 value 为 null
11、ConcurrentHashMap 原理,jdk7 和 jdk8 版本的区别
jdk1.7
� 数 据 结 构 : ReentrantLock+Segment+HashEntity, 一 个 Segment 中 包 含 一 个
HashEntity 数组,每个 HashEntity 又是一个链表结构
jdk1.8
� synchronized+CAS(乐观锁)+Node+红黑树,Node 的 val 和 next 都用 volatile 修
饰,保证可见性,查找、替换、赋值操作都是使用 CAS
12、如何实现一个 IOC 容器
� 配置文件配置包扫描路径
� 递归包扫描获取.class 文件
� 反射、确定需要交给 ioc 管理的类
� 对需要注入的类进行依赖注入
13、java 类加载器有哪些
� 根加载器,bootstraClassLoader
� 扩展加载器:ExtenuationClassLoader
� 应用程序加载器:AppClassLoader
� 自定义加载:比如阿里巴巴觉得 JDK8 不好用,自己编写一个 alibbaJDK.(高端定制)
14、什么叫双亲委派机制?
� 类加载器去加载类的时候,从上往下加载,加载到了类,后边的就不加载了。
双亲委派机制的作用就是保证程序的安全。
15、什么是字节码?
.class 文件中的二进制数据就是字节码。
代{过}{滤}理类要实现的接口是 MethodInterceptor
而且需要一个增强剂的类(Enhancer)
16、JAVA 中异常体系
java 中的所有异常都来自顶级父类 Throwable。Throwble 下有两个子类 Exception 和 Error
� Exeception:不会导致程序终止。分为 runTimeExeception 和 CheckedExeception
检查异常。
� Error:表示程序无法处理的错误,一旦发生错误,将停止程序运行。如内存溢出
17、Gc 如何判断对象可以被回收
� 强引用:就算内存不足也不会被回收
� 弱引用:内存不足时,发现就会被回收
� 软引用:发现就会被回收
� 虚引用:形同虚设,随时都会被回收
18、线程的生命周期,线程有哪些状态
� 线程通常有五种状态:
� 创建(新建)
� 就绪
� 运行
� 阻塞
� 死亡
� 阻塞的情况又分为三种
� 等待阻塞:运行线程执行 wait()方法会使线程处于等待状态,不能被自动唤
醒,必须依靠其它线程调用 notifyAll()方法
� 同步阻塞:运行线程在获取对象的同步锁时,若该同步被其他线程占用,
则 JVM 会把线程放入“锁池”中
� 其他阻塞:运行的线程执行 sleep 或 join 方法,或者发出 I/O 请求时,JVM
会把该线程置为阻塞状态。当 sleep 状态超时,join 等待线程终止或者超时,或者 I/O 处理
完毕,线程会重新进入就绪状态。
19、sleep()、wait()、join()、yield()的区别
� sleep:sleep 方法是属于 Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞
线程,让出 cpu 给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动
恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优
先级的线程以运行的机会
� wait:属于 Object 类中的,wait 过程中线程会释放对象锁,只有当其他线程调用
notify 才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰的
代码块中使用,那么相应的 notify 方法同样必须在 synchronized 修饰的代码块中使用,
如 果 没 有 在 synchronized 修 饰 的 代 码 块 中 使 用 时 运 行 时 会 抛 出
IllegalMonitorStateException 的异常
� join:等待调用 join 方法的线程结束之后,程序再继续执行,一般用于等待异步线程
执行完结果之后才能继续运行的场景。例如:主线程创建并启动了子线程,如果子线程中
要进行大量耗时运算计算某个数据值,而主线程要取得这个数据值才能运行,这时就要用
到 join 方法了
� yield 和 sleep 一样都是 Thread 类的方法,都是暂停当前正在执行的线程对象,
不会释放资源锁,和 sleep 不同的是 yield 方法并不会让线程进入阻塞状态,而是让线程
重回就绪状态,它只需要等待重新获取 CPU 执行时间,所以执行 yield()的线程有可能在进
入到可执行状态后马上又被执行。还有一点和 sleep 不同的是 yield 方法只能使同优先级
或更高优先级的线程有执行的机会
20、线程安全的理解
复制代码 隐藏代码
多个线程的结果与单线程的结果一致,或者说是多线程运行后的结果是预期的结果
21、Thread、Runable 的区别
Thread 和 Runable 实际是继承关系,操作复杂线程推荐使用 thread,如果只是执行一个简
单线程建议使用 runable
22、ThreadLocal 的原理和使用场景
复制代码 隐藏代码
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用 ThreadLocal
创建的变量只能被当前线程访问,其它线程则无法访问及修改。
Thread.currentThread():获取当前线程的引用,既代码段正在被哪一个线程调用。
� ThreadLocal 的实现原理就是 ThreadLocal 里面有一个静态的 ThreadLocalMap
� ThreadLocalMap 是 ThreadLocal 里面的一个静态类
� ThreadLocal 的值是放入了当前线程的一个 ThreadLocalMap 实例中,所以
只能在本线程中访问,其他线程无法访问。
ThreadLocal 类的应用场景:承载一些线程相关的数据
复制代码 隐藏代码
因为 javaee 三层架构里面,如果使用事务,要在 service 层里面进行开启事务(因为处
剩余16页未读,继续阅读
资源评论
- wudi41662023-08-22挺有用,多谢分享
琅琊榜首2020
- 粉丝: 6
- 资源: 50
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功