Java开发面试题汇总整理

又是金三银四的时候,我希望这份面试题能够祝你一臂之力!

1、自我介绍

2、你觉得自己的优点是?你觉得自己有啥缺点?

3、你有哪些 offer?

4、你为什么要离开上家公司?你上家公司在xxx,我们公司在xxx,离这么远为什么要选择我们这里?

5、上家公司的同事和领导是怎么评价你的?

6、介绍下你的上家公司是做哪块的吧

7、在上家公司你做了哪些项目?

8、你在项目中是什么角色?

9、这个项目的数据量和并发量多大?

10、这个项目用的什么技术?

11、项目过程中有遇到什么很印象深刻的问题吗?

12、是怎么解决的这些问题?

13、项目有没有还可以继续优化的地方?

14、该怎么优化?有什么思路没?

15、叫你设计一个并发xxx,数据存储量xxx 量级的系统,你该如何设计?从你知道的点尽可能的多说出些?

1、Object 对象的方法有哪些?分别有什么作用?该什么场景用?

2、Integer 的常量缓存池

3、Java 特性?什么是多态?举个例子

4、重载重写的区别?

5、画下 HashMap 的结构图?HashMap 、 HashTable 和 ConcurrentHashMap 的区别?使用场景分别是?

6、HashMap 中怎么解决冲突的?

7、ConcurrentHashMap 和 HashTable 中线程安全的区别?为啥建议用 ConcurrentHashMap ?能把 ConcurrentHashMap 里面的实现详细的讲下吗?

8、保证线程安全的还有其他的方式吗?

9、讲下 Synchronized?

10、讲下 ReentrantLock 可重入锁? 什么是可重入锁?为什么要设计可重入锁?

11、Synchronized 和 ReentrantLock 有什么区别?这两个有没有深入了解源码?

12、讲下 Volatile 吧?他是怎样做到同步的?

13、Volatile 为什么不支持原子性?举个例子

14、Atomic 怎么设计的?有用过里面的类吗?

15、线程安全类和线程不安全的类,项目使用的时候你会怎么选择?怎么判断项目代码哪里会有线程不安全问题?

16、Map、List、Set 分别说下你了解到它们有的线程安全类和线程不安全的类?

17、TreeSet 清楚吗?能详细说下吗?

18、ThreadLocal 了解吗?项目有用过吗?可以说说

19、JUC 里面你还知道什么其他的类吗?比如 CountDownLatch、Condition

20、从源码详细说下 Java 里面的线程池吧,使用线程池有什么要注意的地方?你们公司有规范吗?

1、JAVA 类加载器

2、Java 内存结构(注:不是 Java 内存模型,别搞混)

3、怎么判断对象是否可 GC?Java 对象有哪些引用类型?有什么区别?

4、OOM 出现的有哪些场景?为什么会发生?

5、Minor GC 和 Full GC 有什么区别?分析过 GC 日志吗?

6、说下你知道的垃圾回收算法

7、说下你知道的垃圾收集器

8、CMS 和 G1 的区别知道吗?使用场景分别是?你项目中用的是哪个?

9、你还知道哪些 JVM 调优参数?

10、假如线上服务发生 OOM,有哪些措施可以找到问题?

11、假如线上服务 CPU 很高该怎么做?有哪些措施可以找到问题?

12、假如线上应用频繁发生 Full GC,有哪些措施可以找到问题?

13、一般线上环境遇到 JVM 问题,你会使用哪些工具来分析?找到问题后又该如何去解决呢?

1、说下你对 Spring 生态的了解?

2、说下你对 Spring AOP 和 IOC 的理解?看过实现原理吗?

3、说下 Bean 在 Spring 中的生命周期?

4、讲下你知道的 Spring 注解有哪些?该什么场景使用?

5、Spring 事务知道吗?有了解过吗?

6、说下你刚才说的 SpringBoot 吧,你觉得 SpringBoot 有什么优点?

7、SpringBoot 自动化配置是怎么做的?有看过实现源码吗?

8、Spring Boot 中最核心的注解 SpringBootApplication 有看过源码分析过吗?

9、你的项目中 SpringBoot 用到了哪些和其他技术栈整合的?

10、使用 Spring 或者 SpringBoot 有遇到过什么印象深刻的问题吗?当时是怎么解决的?

1、你的项目使用的是什么数据库?

2、你对数据库了解多少?说下数据库的索引实现和非主键的二级索引

3、说下 MySQL 的索引原理

4、讲下 InnoDB 和 MyISAM 的区别?使用场景是?

5、有和 ElasticSearch 的索引原理对比过吗?

6、如何判断一个查询 sql 语句是否使用了索引?

7、数据库事务特性和隔离级别

8、项目数据库表是你设计的吗?一般要注意什么?如何考虑扩展性?

9、项目 MySQL 的数据量和并发量有多大?量大后的影响有哪些,有考虑吗?SQL 调优有哪些技巧?

10、说下你项目里面关于数据库印象最深的一个问题?当时是怎么解决的

1、描述下网页一个 Http 请求到 ,到后端的整个请求过程

2、有比较过 Http 和 RPC 吗?如果叫你设计一个高性能的 Http 或者 RPC,你会从哪些方面考虑?

3、项目中我看使用了 xxx (ElasticSearch、Hbase、Redis、Flink 等),有深入了解它们的原理和懂点调优技巧吗?

4、项目中我看使用了 xxx (ElasticSearch、Hbase、Redis、Mysql 等),有深入了解它们数据同步是怎么做吗?

5、项目中我看使用了 xxx (ElasticSearch、Hbase、Redis、Mysql 等),有深入了解它们常见的监控指标吗?

6、如果叫你设计一个秒杀系统,你会从哪些方面考虑?

7、如果叫你设计一个电商系统,你会从哪些方面考虑?

8、如果叫你设计一个监控告警系统,你会从哪些方面考虑?

本文的面试题以 HR & 技术官角度常问的面试题,技术方面从 Java 基础、JVM、Spring、数据库、拓展题等方面考察你,当然面试官可能还会问些其他的技术点,我一篇文章也难以概全。总的来说,还是得多准备充分,面试时灵活答辩,相信你最后能拿到满意的 offer!加油,骚年!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


在 Java 语言中,提高程序的执行效率有两种实现方法,一个是使用线程、另一个是使用线程池。而在生产环境下,我们通常会采用后者。为什么会这样呢?今天我们就来聊聊线程池的优点,以及池化技术及其应用。 1.池化技术 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 池化技术的优点
在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识符,停止线程。 使用线程中断方法 interrupt 停止线程。 使用 stop 停止线程。 其中 stop 方法为 @Deprecated 修饰的过期方法,也就是不推荐使用的过期方法,因为 stop 方法会直接停止线程,这样就没有给
在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notifyAll 方法之后,才能继续恢复执行。而在 Java 中,wait 和 notify/notifyAll 有着一套自己的使用格式要求,也就是在使用 wait 和 notify(notifyAll
在 Java 语言中,并发编程都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景,总体来说线程池的创建可以分为以下两类: 通过 ThreadPoolExecutor 手动创建线程池。 通过 Executors 执行器自动创建线程池。 而以上两类创建线
sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中断,也就是线程在休眠的过程中,如果收到中断信号,都可以进行响应,并抛出 InterruptedException 异常。那 sleep 和 wait 的区别都有哪些呢
在 Java 中,线程的创建方法有 7 种,分为以下 3 大类: 继承 Thread 类的方式,它有 2 种实现方法。 实现 Runnable 接口的方式,它有 3 种实现方法。 实现 Callable 接口的方式,它有 2 种实现方法。 接下来我们一个一个来看。 1.继承Thread类 继承 Th
所谓的线程池的 7 大参数是指,在使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数,如以下源码所示: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
在 Java 语言中,线程分为两类:用户线程和守护线程,默认情况下我们创建的线程或线程池都是用户线程,所以用户线程也被称之为普通线程。 想要查看线程到底是用户线程还是守护线程,可以通过 Thread.isDaemon() 方法来判断,如果返回的结果是 true 则为守护线程,反之则为用户线程。 我们
聊到线程池就一定会聊到线程池的执行流程,也就是当有一个任务进入线程池之后,线程池是如何执行的?我们今天就来聊聊这个话题。线程池是如何执行的?线程池的拒绝策略有哪些? 线程池执行流程 想要真正的了解线程池的执行流程,就得先从线程池的执行方法 execute() 说起,execute() 实现源码如下:
单例模式是面试中的常客了,它的常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一一来看。 1.饿汉模式 饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安
线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的。在 Java 中,解决线程安全问题有以下 3 种手段: 使用线程安全类,比如 AtomicInteger。 加锁排队执行 使用 synchronize
在 Java 语言中,保证线程安全性的主要手段是加锁,而 Java 中的锁主要有两种:synchronized 和 Lock,我们今天重点来看一下 synchronized 的几种用法。 用法简介 使用 synchronized 无需手动执行加锁和释放锁的操作,我们只需要声明 synchronize
在 Java 语言中,有两个线程池可以执行定时任务:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的单线程版本,它的用法和
从公平的角度来说,Java 中的锁总共可分为两类:公平锁和非公平锁。但公平锁和非公平锁有哪些区别?孰优孰劣呢?在 Java 中的应用场景又有哪些呢?接下来我们一起来看。 正文 公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的,最前面的线程总是最先获取到锁。 非公平锁:每个线程获取锁的顺序
单例模式的实现方法有很多种,如饿汉模式、懒汉模式、静态内部类和枚举等,当面试官问到“为什么单例模式一定要加 volatile?”时,那么他指的是为什么懒汉模式中的私有变量要加 volatile? 懒汉模式指的是对象的创建是懒加载的方式,并不是在程序启动时就创建对象,而是第一次被真正使用时才创建对象。
读写锁(Readers-Writer Lock)顾名思义是一把锁分为两部分:读锁和写锁,其中读锁允许多个线程同时获得,因为读操作本身是线程安全的,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。总结来说,读写锁的特点是:读读不互斥、读写互斥、写写互斥。 1.读写锁使用 在
很多场景下,我们需要等待线程池的所有任务都执行完,然后再进行下一步操作。对于线程 Thread 来说,很好实现,加一个 join 方法就解决了,然而对于线程池的判断就比较麻烦了。 我们本文提供 4 种判断线程池任务是否执行完的方法: 使用 isTerminated 方法判断。 使用 getCompl
在 Java 中,线程池的状态和线程的状态是完全不同的,线程有 6 种状态:NEW:初始化状态、RUNNABLE:可运行/运行状态、BLOCKED:阻塞状态、WAITING:无时限等待状态、TIMED_WAITING:有时限等待状态和 TERMINATED:终止状态。而线程池的状态有以下 5 种:
volatile 是 Java 并发编程的重要组成部分,也是常见的面试题之一,它的主要作用有两个:保证内存的可见性和禁止指令重排序。下面我们具体来看这两个功能。 内存可见性 说到内存可见性问题就不得不提 Java 内存模型,Java 内存模型(Java Memory Model)简称为 JMM,主要
1.第一范式 第一范式规定表中的每个列都应该是不可分割的最小单元。比如以下表中的 address 字段就不是不可分割的最小单元,如下图所示: 其中 address 还可以拆分为国家和城市,如下图所示: 这样改造之后,上面的表就满足第一范式了。 2.第二范式 第二范式是在满足第一范式的基础上,规定表中