Java面试题

Java面试题

Java基础面试知识点

  • java中==和equals和hashCode的区别
  • int、char、long各占多少字节数
  • int与integer的区别
  • 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)
  • String、StringBuffer、StringBuilder区别
  • 什么是内部类?内部类的作用
  • 抽象类和接口区别
  • 抽象类的意义
  • 抽象类与接口的应用场景
  • 抽象类是否可以没有方法和属性?
  • 接口的意义
  • 泛型中extends和super的区别
  • 父类的静态方法能否被子类重写
  • 进程和线程的区别
  • final,finally,finalize的区别
  • 序列化的方式
  • transient关键字的作用
  • Serializable 和Parcelable 的区别
  • 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
  • 静态内部类的设计意图
  • 成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
  • string 转换成 integer的方式及原理
  • 反射是如何实现的,在哪些场景用到反射
  • 反射中 Class.forName 和 ClassLoader 区别
  • 反射创建类实例的三种方式是什么
  • 如何通过反射调用对象的方法,获取和设置对象私有字段的值
  • 反射机制的优缺点
  • 什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配
  • 什么是懒加载(Lazy Loading)
  • 什么是尾递归,为什么需要尾递归

Java高级面试题

  • 讲一下常见编码方式?
  • utf-8编码中的中文占几个字节;int型几个字节?
  • 静态代理和动态代理的区别,什么场景使用?
  • Java的异常体系
  • 修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?
  • 为什么在重写 equals 方法的时候需要重写 hashCode 方法?equals与 hashCode 的异同点在哪里
  • 可以在 hashcode() 中使用随机数字吗?
  • Java中实现多态的机制是什么?
  • 如何将一个Java对象序列化到文件里?
  • 说说你对Java反射的理解
  • Java动态代理的实现方式及原理
  • 说说你对Java注解的理解
  • 说说你对依赖注入的理解
  • 说一下泛型原理,并举例说明
  • Java中String的了解
  • String为什么要设计成不可变的?
  • java中的四种引用的区别以及使用场景
  • 强引用置为null,会不会被回收?

Java数据结构

  • 常用数据结构有哪些
  • 并发集合了解哪些?
  • 列举java的集合以及集合之间的继承关系
  • 集合类以及集合框架
  • 容器类介绍以及之间的区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)
  • List、Set、Map的区别
  • List和Map的实现方式以及存储方式
  • ArrayList和LinkedList的区别,以及应用场景
  • 数组和链表的区别
  • HashMap的实现原理及源码理解
  • HashMap如何put数据(从HashMap源码角度讲解)
  • HashMap的遍历方式及效率
  • 怎么手写实现一个HashMap
  • HashTable实现原理
  • TreeMap具体实现
  • ConcurrentHashMap的实现原理
  • ArrayMap和HashMap的对比
  • HashMap与HashSet的区别
  • HashMap 、HashTable、ConcurrentHashMap 的区别
  • HashMap、LinkedMap、TreeMap的区别
  • 如何决定选用HashMap还是TreeMap
  • HashSet与HashMap怎么判断集合元素重复
  • 集合Set实现Hash怎么防止碰撞
  • WeakHashMap 是怎么工作的?
  • 二叉树的深度优先遍历和广度优先遍历的具体实现
  • 堆的结构
  • 堆和树的区别
  • 堆和栈在内存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?
  • 什么是深拷贝和浅拷贝
  • 讲一下对树、B+树的理解
  • 讲一下对图的理解
  • 判断单链表成环与否?

Java线程、多线程、线程池、锁

  • 开启线程的三种方式?
  • 线程和进程的区别?
  • 为什么要有线程,而不是仅仅用进程?
  • run()和start()方法区别
  • 如何控制某个方法允许并发访问线程的个数?
  • 在Java中wait和seelp方法的不同;
  • 谈谈wait/notify关键字的理解
  • 什么导致线程阻塞?
  • 线程如何关闭?
  • 讲一下java中的同步的方法
  • 数据一致性如何保证?
  • 如何保证线程安全?
  • 如何实现线程同步?
  • 两个进程同时要求写或者读,能不能实现?如何防止进程的同步?
  • 线程间操作List
  • Java中对象的生命周期
  • Synchronized用法和原理
  • 谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解
  • static synchronized 方法的多线程访问和作用
  • 同一个类里面两个synchronized方法,两个线程同时访问的问题
  • volatile的原理
  • 谈谈volatile关键字的用法和作用以及场景
  • 谈谈NIO的理解
  • synchronized 和volatile 关键字的区别
  • synchronized与Lock的区别
  • ReentrantLock 、synchronized和volatile比较
  • ReentrantLock的内部实现
  • lock原理
  • 死锁的四个必要条件?
  • 怎么避免死锁?
  • 对象锁和类锁是否会互相影响?
  • 什么是线程池,如何使用?
  • Java的并发、多线程、线程模型
  • ThreadLocal 用途是什么,原理是什么,用的时候要注意什么
  • ThreadPool用法与优势,线程池队列已满时会发会生什么
  • 线程池的实现策略
  • 线程池的关闭方式有几种,各自的区别是什么
  • 线程池中submit() 和 execute()方法有什么区别?
  • 谈谈对多线程的理解
  • 多线程有什么要注意的问题?
  • Java中用到的线程调度算法是什么
  • 什么是多线程中的上下文切换,避免上下文切换的方案(无锁编程/CAS/合理的创建线程)
  • JAVA线程间的状态转换
  • 你对线程优先级的理解是什么
  • Java多线程的三大核心是什么?(原子性、可见性、顺序性)
  • 什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)
  • 谈谈你对多线程同步机制的理解?
  • 什么是多线程环境下的伪共享(false sharing)
  • 如何保证多线程读写文件的安全?
  • 多线程断点续传原理
  • 断点续传的实现

并发编程

  • 谈谈你对并发编程的理解并举例说明
  • Java 中锁机制:synchronized、Lock、Condition
  • 深入分析ConcurrentHashMap
  • BlockingQueue是什么
  • 简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处
  • ArrayBlockingQueue, CountDownLatch的用法
  • CyclicBarrier 和 CountDownLatch有什么不同?各自的内部原理和用法是什么
  • Semaphore的用法
  • 什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题
  • 解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁
  • 什么时候应该使用可重入锁
  • 简述锁的等级方法锁、对象锁、类锁
  • Java中活锁和死锁有什么区别?
  • 什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁
  • 死锁与活锁的区别,死锁与饥饿的区别
  • 怎么检测一个线程是否拥有锁
  • 如何实现分布式锁
  • 有哪些无锁数据结构,他们实现的原理是什么
  • 读写锁可以用于什么应用场景

JVM

  • Java 内存模型,1.8和1.9的区别
  • Java类加载机制
  • Java 堆内存溢出分析
  • MetaSpace (元数据) 内存溢出一般是什么原因
  • 垃圾回收算法有哪些
  • 哪些情况下的对象会被垃圾回收机制处理掉?
  • 深入理解java内存模型–参考InfoQ系列文章

架构设计和设计模式

  • 聊了下曾经参与设计的服务器架构
  • 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?
  • BS与CS的联系与区别
  • 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别
  • 什么是领域驱动开发(Domain Driven Development)
  • 请简要讲一下你对测试驱动开发(TDD)的认识
  • 微服务(MicroServices)与单体应用(Monolithic Applications)之间的区别在哪里
  • REST、RPC、RMI有什么区别
  • MVC MVP MVVM原理和区别
  • 你所知道的设计模式有哪些?
  • 项目中常用的设计模式
  • 手写生产者/消费者模式
  • 写一个你认为最好的单例模式
  • 写出观察者模式的代码
  • 适配器模式,装饰者模式,外观模式的异同?
  • 用到的一些开源框架,介绍一个看过源码的,内部实现过程。
  • 从0设计一个小程序项目整体架构,如何去做?
  • 说一款你认为当前比较火的应用并设计(比如:电商、直播APP,P2P金融,小视频等)
  • 谈谈对java状态机理解
  • 对于应用更新这块是如何做的?(解答:灰度,强制更新,分区域更新)?
  • 你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些
  • 实现一个Json解析器(可以通过正则提高速度)
  • 什么样的项目不适合用框架
  • 新浪微博是如何实现把微博推给订阅者
  • 说出数据连接池的工作机制是什么
  • 怎么提升系统的QPS和吞吐量
  • 你有了解过存在哪些反模式(Anti-Patterns)吗
  • 你用过的网站前端优化的技术有哪些
  • 如何搭建一个高可用系统
  • 如何启动时不需输入用户名与密码
  • 如何在基于Java的Web项目中实现文件上传和下载
  • 如何实现一个秒杀系统,保证只有几位用户能买到某件商品。
  • 如何实现负载均衡,有哪些算法可以实现
  • 如何设计一个购物车?想想淘宝的购物车如何实现的
  • 如何设计一套高并发支付方案,架构如何设计
  • 如何设计建立和保持 100w 的长连接
  • 如何避免浏览器缓存。
  • 如何限流?在工作中是怎么做的?说一下具体的实现?
  • 如何进行熔断?
  • 熔断框架都有哪些?具体实现原理知道吗?
  • 如何进行降级?
  • 如何防止缓存雪崩
  • 如果有人恶意创建非法连接,怎么解决
  • 什么是微服务?微服务之间是如何独立通讯的?
  • Spring Cloud 和 Dubbo 有哪些区别?
  • Spring Boot 和 Spring Cloud,谈谈你对它们的理解?
  • 什么是服务熔断?什么是服务降级?
  • 微服务的优缺点分别是什么?说一下你在项目开发中碰到的坑?
  • 你所知道的微服务技术栈都有哪些?
  • Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别?

性能优化

  • 遇到过的内存泄漏或栈溢出场景,CPU利用率飙高,应用无响应时怎么解决?
  • 如何分析Thread dump
  • Java多线程引发的性能问题,怎么解决?
  • 如何保持应用的稳定性
  • 线上系统突然变得异常缓慢,你如何查找问题
  • 网站性能优化如何优化
  • SQL优化的常见手段

分布式

  • CDN实现原理
  • 什么是 Raft和Paxos 算法
  • 什么是 zab 协议
  • 解释什么是 MESI 协议(缓存一致性)
  • 解释CAP、BASE
  • 什么是幂等,如何实现
  • 分布式事务的原理,优缺点,如何使用分布式事务?
  • 你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?
  • 分布式ID 生成器的实现方案及优缺点(数据库、本地UUID、本地时间、雪花算法)
  • 分布式锁的实现方式及优缺点
  • 分布式缓存设计需要考虑哪些因素
  • 分布式 Session如何实现
  • 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?
  • 如何保证消息队列的高可用?
  • 如何保证消息不被重复消费?(如何保证消息消费的幂等性)
  • 如何保证消息的可靠性传输?(如何处理消息丢失的问题)
  • 如何保证消息的顺序性?
  • 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
  • 高并发下,如何做到安全的修改同一行数据
  • 12306网站的订票系统如何实现,如何保证不会票不被超卖
  • 实现分布式环境下的 countDownLatch
  • es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
  • es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
  • es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
  • es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?

算法

  • 排序算法有哪些?
  • 最快的排序算法是哪个?
  • 手写一个冒泡排序
  • 手写快速排序代码
  • 手写一个折半查找
  • 手写堆排序
  • 实现一个电梯模拟器用
  • 随机产生20个不能重复的字符并排序
  • 写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组
  • 写一段代码在遍历 ArrayList 时移除一个元素
  • 快速排序的过程、时间复杂度、空间复杂度
  • 堆排序过程、时间复杂度及空间复杂度
  • 写出你所知道的排序算法及时空复杂度,稳定性
  • 二叉树给出根节点和目标节点,找出从根节点到目标节点的路径
  • 给阿里2万多名员工按年龄排序应该选择哪个算法?
  • GC算法(各种算法的优缺点以及应用场景)
  • 蚁群算法与蒙特卡洛算法
  • 约瑟芬环游戏
  • 子串包含问题(KMP 算法)写代码实现
  • 一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法
  • 万亿级别的两个URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)
  • 百度POI中如何试下查找最近的商家功能(提示:坐标镜像+R树)。
  • 两个不重复的数组集合中,求共同的元素。
  • 两个不重复的数组集合中,这两个集合都是海量数据,内存中放不下,怎么求共同的元素?
  • 一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法
  • 一张Bitmap所占内存以及内存占用的计算
  • 2000万个整数,找出第五十大的数字?
  • 烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?
  • 求1000以内的水仙花数以及40亿以内的水仙花数
  • 5枚硬币,2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬8币和反面向上的硬币个数相同
  • 时针走一圈,时针分针重合几次
  • N*N的方格纸,里面有多少个正方形
  • x个苹果,一天只能吃一个、两个、或者三个,问多少天可以吃完?
  • 50个人围坐一圈,当数到三或者三的倍数出圈,问剩下的人是谁,原来的位置是多少
  • 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
  • 如果让你实现一个并发安全的链表,你会怎么做
  • 计算两个日期之间的差距

编程题

1. 计算加班费

加班10小时以下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工作26天,一天正常工作8小时)

  • 计算1000月薪,加班9小时的加班费
  • 计算2500月薪,加班11小时的加班费
  • 计算1000月薪,加班15小时的加班费

2. 卖东西

一家商场有红苹果和青苹果出售。(红苹果5元/个,青苹果4元/个)。

  • 模拟一个进货。红苹果跟青苹果各进200个。
  • 模拟一个出售。红苹果跟青苹果各买出10个。每卖出一个苹果需要进行统计。

提示:一个苹果是一个单独的实体。

3. 日期提取

有这样一个时间字符串:2008-8-8 20:08:08 , 请编写能够匹配它的正则表达式,并编写Java代码将日期后面的时分秒提取出来,即:20:08:08

4. 线程

  • 8设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
  • 用Java写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出
  • wait-notify 写一段代码来解决生产者-消费者问题

5. 数字计算

  • 判断101-200之间有多少个素数,并输出所有素数
  • 用最有效率的方法算出2乘以17等于多少
  • 有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优
  • 2 亿个随机生成的无序整数,找出中间大小的值
  • 10 亿个数字里里面找最小的 10 个
  • 1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2、8、6,如1到11拆分后的数字之和 => 1 + … + 9 + 1 + 0 + 1 + 1
  • 一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数
  • 一个数组中所有的元素都出现了三次,只有一个元素出现了一次找到这个元素
  • 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
  • 求100-1000内质数的和
  • 求1到100的和的平均数
  • 求s=a+a+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 求出1到100的和
  • 算出1到40的质数,放进数组里

    • 显示放组里的数
    • 找出第[5]个数
    • 删除第[9]个数,再显示删除后的第[9]个
  • 有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。

  • 有一组数1.1.2.3.5.8.13.21.34。写出程序随便输入一个数就能给出和前一组数字同规律的头5个数
  • 计算指定数字的阶乘
  • 给定一个包含 N 个整数的数组,找出丢失的整数
  • 一个排好序的数组,找出两数之和为m的所有组合
  • 将一个正整数分解质因数。例如:输入90,打印出90=233*5。
  • 打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方
  • 原地交换两个变量的值
  • 找出4字节整数的中位数
  • 找到整数的平方根

6. 逻辑代码题

  • FizzBuzz问题
  • 实现斐波那契
  • 写一个死锁
  • 手写生产者/消费者模式
  • 写一个你认为最好的单例模式
  • 写一个观察者模式
  • 手写一个冒泡排序
  • 手写快速排序代码
  • 手写一个折半查找
  • 手写堆排序
  • 手写链表逆序代码
  • 合并有序链表
  • 约瑟芬环游戏

其他问题

  • 在你的职业生涯中,算得上最困难的技术挑战是什么
  • 如果有机会重新设计你们的产品,你会怎么做
  • 最近看什么书,印象最深刻的是什么
  • 你的学习方法是什么样的?实习过程中如何学习?实习项目中遇到的最大困难是什么以及如何解决的?
  • 如果通过这次面试我们单位录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么办?
  • 工作过程中周围同事/同学有哪些值得学习的地方?