Java面试题,常见面试题及答案汇总,附答案

2021刚开始,很多朋友问题,有没有一些Java基础面试题及答案面试题,最近抽时间整理了一份Java面试题。或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信足以应对目前市面上绝大部分的 最新Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的面试题及答案知识点了。

Java常见面试题及答案汇总,2021年最新版

全部答案,整理好了,直接下载吧

其实,博主还整理了,更多大厂面试题,直接下载吧
下载链接:高清172份,累计 7701 页大厂面试题 PDF

1、抽象工厂模式和原型模式之间的区别?

抽象工厂模式:通常由工厂方法模式来实现。但一个工厂中往往含有多个工厂方法生成一系列的产品。这个模式强调的是客户代码一次保证只使用一个系列的产品。当要切换为另一个系列的产品,换一个工厂类即可。

原型模式:工厂方法的最大缺点就是,对应一个继承体系的产品类,要有一个同样复杂的工厂类的继承体系。我们可以把工厂类中的工厂方法放到产品类自身之中吗?如果这样的话,就可以将两个继承体系为一个。这也就是原型模式的思想,原型模式中的工厂方法为clone,它会返回一个拷贝(可以是浅拷贝,也可以是深拷贝,由设计者决定)。为了保证用户代码中到时可以通过指针调用clone来动态绑定地生成所需的具体的类。这些原型对象必须事先构造好。

原型模式想对工厂方法模式的另一个好处是,拷贝的效率一般对构造的效率要高。

2、在 Java 程序中怎么保证多线程的运行安全?

出现线程安全问题的原因一般都是三个原因:

1、 线程切换带来的原子性问题 解决办法:使用多线程之间同步synchronized或使用锁(lock)。

2、 缓存导致的可见性问题 解决办法:synchronized、volatile、LOCK,可以解决可见性问题

3、 编译优化带来的有序性问题 解决办法:Happens-Before 规则可以解决有序性问题

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、Java中各种数据默认值

1、 Byte,short,int,long默认是都是0

2、 Boolean默认值是false

3、 Char类型的默认值是’’

4、 Float与double类型的默认是0.0

5、 对象类型的默认值是null

5、说说Java 垃圾回收机制

在 Java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

6、有没有可能两个不相等的对象有有相同的 hashcode?

有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。

7、synchronized 和 Lock 有什么区别?

1、 首先synchronized是Java内置关键字,在JVM层面,Lock是个Java类;

2、 synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

3、 synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

4、 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

8、什么是Vector

Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,访问它比访问ArrayList慢很多

ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。ArrayList的缺点是每个元素之间不能有间隔。

9、对象的访问定位有哪几种方式

建立对象就是为了使用对象,我们的Java程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式有虚拟机实现而定,目前主流的访问方式有使用句柄和直接指针2种:

句柄:如果使用句柄的话,那么Java堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。

直接指针:如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference 中存储的直接就是对象的地址。

这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。

10、equals 和 == 的区别?#

通俗点讲:是看看左右是不是一个东西。equals是看看左右是不是长得一样。如何记住嘛。如果单纯是想记住,:等于。equals:相同。两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人。你只要记住equals,==就不用记了。

术语来讲的区别:

1、 ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同

2、 ==是指对内存地址进行比较 equals()是对字符串的内容进行比较3.==指引用是否相同 equals()指的是值是否相同

11、Servlet中如何获取用户提交的查询参数或表单数据?

12、堆溢出的原因?

13、Java 中,怎么获取一个文件中单词出现的最高频率?

14、你知道哪些JVM性能调优

15、抽象类必须要有抽象方法吗?

16、串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

17、React的请求应该放在哪个生命周期中

18、volatile关键字的作用

19、我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?

20、什么是Java虚拟机

21、CMS 收集器(多线程标记清除算法)

22、接口和抽象类的区别是什么?

23、如何合理分配线程池大小

24、什么是线程组,为什么在Java中不推荐使用?

25、类加载器

26、JVM 如何确定垃圾对象?

27、字符型常量和字符串常量的区别

28、G1 收集器

29、Java 中,直接缓冲区与非直接缓冲器有什么区别?

30、如何决定使用 HashMap 还是 TreeMap?

31、说一下 ArrayList 的优缺点

32、构造方法能不能重写?能不能重载?

33、什么是红黑树

34、什么是逃逸分析?

35、栈帧里面包含哪些东西?

36、Tomcat是怎么打破双亲委派机制的呢?

37、WeakHashMap 是怎么工作的?

38、java 中操作字符串都有哪些类?它们之间有什么区别?

39、什么是JVM?java虚拟机包括什么?

40、Java 的引用有哪些类型?

全部答案,整理好了,直接下载吧

下载链接:全部答案,整理好了
其实,博主还整理了,更多大厂面试题,直接下载吧
下载链接:高清172份,累计 7701 页大厂面试题 PDF
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值