01.Java相关面试题
目录介绍
- 01.基础问题汇总
- 02.面向对象问题
- 03.IO流知识问题
- 05.异常处理问题
- 06.线程知识问题
- 07.并发知识问题
- 08.类的加载问题
- 09.反射使用问题
- 10.枚举注解问题
- 11.线程池问题
- 12.其他知识问题
01.基础问题汇总
- String类:请说下String与StringBuffer区别,StringBuffer底部如何实现?String类可以被继承吗,为什么?String为什么要设计成不可变的?
- 基本数据:int、char、long各占多少字节数?比如double强转int类型会造成精度损失,为什么?int,long的取值范围以及BigDecimal,数值越界了如何处理?
- 拆箱和装箱:介绍一下拆箱和装箱的问题。为什么要这样操作?Integer 对象缓存机制是什么?int 和 Integer 哪个会占用更多的内存?
- char字符:char 型变量中能不能存贮一个中文汉字,为什么?char是两个字节,是怎么存
Utf-8
的字符的? - Byte字节:将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
- 泛型:什么是泛型,应用场景,如何获取泛型的真实参数类型?如何理解泛型通配符?如何理解泛型擦除这个概念?Java中
List<?>
和List<Object>
之间的区别是什么? - 整型和字面值:整型数据和字面值有何区别?为何要有字面值?说下装箱和拆箱操作,int和integer分别存储在哪里,valueOf用到什么设计模式,怎么理解缓存池的概念
- 二进制:浮点型在二进制中如何表示,为何会出现精度丢失,从存储角度分析一下。如何对比浮点型数据是否是相同的?
02.面向对象问题
- 面向对象:面向对象有哪些特征?继承,封装,多态,可以随意抽一个问细节?接口和抽象类有什么区别?
- 封装:什么是封装?访问权限修饰符的作用是什么?举一个钱包的封装案例,说一下封装的作用?
- 继承:继承(Inheritance)与聚合(Aggregation)的区别在哪里?为什么类只能单继承,接口可以多继承?
- 多态:Java实现多态有哪些必要条件?具体怎么实现?多态的实现原理?多态的作用?
- 重载与重写:重载(overloading)与重写(override)的区别?重载的方法能否根据返回类型进行区分?继承最大好处?构造器 Constructor 是否可被 Override?
- 构造函数:什么是构造函数?什么是构造函数重载?什么是复制构造函数?为何要有构造函数?
- 案例题:如果类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题?
- 拷贝:如何实现对象克隆?深拷贝和浅拷贝区别?深拷贝和浅拷贝如何实现激活机制?
- 抽象类和接口:接口和抽象类有什么区别?为什么要这样设计?什么场景选择接口,什么场景选择抽象类?
- 静态:静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? 静态内部类的设计意图?静态块有什么好处?静态块和构造方法哪一个先执行?
- 内部类:内部类分为几种?内部类可以引用它的包含类(外部类)的成员吗? Java 中为什么要引入内部类,还有匿名内部类?匿名内部类是否可以继承其它类,是否可以实现接口?
- 值传递和引用传递:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- final:为什么内部类调用的外部变量必须是final修饰的?final的作用是什么,被final修饰的类,可以改变类里面的属性吗? final, finally, finalize 的区别?
03.IO流知识问题
- Byte字节:什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别?
- File:File类型中定义了什么方法来创建一级目录?File类型中定义了什么方法来判断一个文件是否存在?如何判断目录的存在?
- IO流:对文本文件操作用什么I/O流?对各种基本数据类型和String类型的读写,采用什么流?为了提高读写性能,可以采用什么流?
- 缓冲Buffer:直接缓冲区与非直接缓冲器有什么区别?怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么
- 案例:当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少?
- 流关闭:流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?
- IO分类:什么是同步IO?什么是异步IO?什么是阻塞IO?什么是非阻塞IO?
05.异常处理问题
- 异常体系:为什么要设置异常?Error和Exception有何区别?说一下它们各自的特点,可以举例场景来说明?
- 异常关键字:Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
- 异常分类:什么是受检查的异常,什么是运行时异常?运行时异常与一般异常有何异同?简述一个你最常见到的runtime exception(运行时异常)?
- finally:如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗?在什么情况下,finally语句不会执行?
- try代码块:try里有return,finally还执行么?那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
- catch:一旦某个catch捕获到匹配的异常类,其它的catch还会执行吗?catch异常匹配是如何执行?
- 异常:Exception和Error有什么区别?运行时异常与一般异常有什么区别?不要生吞异常?
- 异常捕获:try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的code会不会被执行,什么时候被执行,在 return 前还是后?
- 异常性能:try..catch..到底影响性能吗?从jvm层面分析下。在try-catch中for循环和在for循环中try-catch有何区别,性能损耗如何?
06.线程知识问题
- 线程生命周期:线程中start和run方法有什么区别?wait和sleep方法的不同?sleep() 、join()、yield()有什么区别?请绘制线程周期图……
- 死锁案例:用Java手写一个会导致死锁的程序,遇到这种问题解决方案是什么?那些场景用到了死锁机制?
- 线程dump:你将如何使用thread dump?你将如何分析Thread dump?
- 线程stop:Java 中如何停止一个线程?stop() 和 suspend() 方法为何不推荐使用?如何让正在运行的线程暂停一段时间?
- 线程start:调用start()方法时会执行run()方法,为什么不能直接调用run()方法?你是如何调用 wait(方法的)?使用 if 块还是循环?为什么
- 生产者消费者:说说生产者-消费者场景,如何保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时消耗数据?
- ThreadLocal:ThreadLocal作用是什么,平常怎么用它,线程为何需要这个东西,里面的副本是怎么拷贝的?
- 线程异常:线程中异常为何不能抛出到外部线程捕获?如何处理线程异常?
- 线程等待:wait()和sleep()的区别?各自有哪些使用场景?怎么唤醒一个阻塞的线程?Thread.sleep(0)的作用是啥?
07.并发知识问题
- 多线程:多线程为何会有bug?为什么会产生这种问题,又是如何解决的?
- volatile:volatile这个关键字是怎么理解的?在并发环境中如何确保程序的可见性、顺序性和一致性?
- Synchronized:谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解?有哪些使用场景?说一下锁如何升级和降级。
- 锁比较:Lock锁比synchronized块的优势是什么?各自用途是什么?有哪些不同点?
- 锁概念:公平锁/非公平锁如何理解?乐观锁/悲观锁如何理解?偏向锁/轻量级锁/重量级锁是如何理解?互斥锁/读写锁如何理解?
- 多线程规则:如何理解同步,异步,阻塞,非阻塞的概念。如何实现异步线程串列执行?
- 死锁:活锁和死锁有什么区别?什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?
- CAS乐观锁:什么是乐观锁?如何实现乐观锁?如何避免ABA问题?CAS乐观锁是如何实现的?CAS的问题有哪些?
- 读写锁:设计一个多线程,可以同时读,读的时候不能写,写的时候不能读(读写锁)。两个进程同时要求写或者读,能不能实现?
- 线程优先级:Java中用到的线程调度算法是什么?你对线程优先级的理解是什么?什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)?
- 线程安全:谈谈你对多线程同步机制的理解?如何保证多线程读写文件的安全,有哪些方式可以做到?
- 并发请求:如何控制某个方法允许并发访问线程的个数?多个线程如何同时请求,返回的结果如何等待所有线程数据完成后合成一个数据?
- 案例题:你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
- 案例题:假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到?
- 案例题:现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
- 案例题:一个int变量,用volatile修饰,多线程去操作++,线程安全吗?那如何才能保证i++线程安全?不用锁如何保证int自增安全?
08.类的加载问题
- 类加载:Person p = new Person()请写一下类的加载过程?在加载过程分别对Person类中的常量,变量,构造方法,成员方法做了什么处理?
- 内存分配:如何理解栈,堆,本地方法区……?堆内存设置的参数是什么?JVM中哪个参数是用来控制线程的栈堆栈小?
- 内存模型:说一下JVM的内存模型?程序计数器,本地方法栈,Java虚拟机栈,堆,方法区,详细说一下每个的作用,以及区别?
- 双亲委派:什么是双亲委派模型?为什么使用双亲委托模型?说一下ClassLoader中loadClass方法实现了双亲委派模型的思路?
- 类加载器:JAVA类加载器包括几种,作用是什么?它们之间的父子关系是怎么样的?如何自定义一个类加载器(那些场景会这样)?
- 类加载器:ClassLoader原理是什么?类加载器工作机制是什么?loadClass(String name, boolean resolve)第二个参数意义是什么?
- 类初始化:什么时候发生类初始化?遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,会做些什么?
- 类初始化:构造器的设计?成员初始化顺序?类名.变量和new对象初始化有何区别,分别是什么情况?
- 对象:说下对象的内存布局?对象头里面属性有哪些?如何访问对象?对象销毁是如何判断的?
- 异常:StackOverFlow异常有没有遇到过?一般你猜测会在什么情况下被触发?如何指定一个线程的堆栈大小?一般你们写多少?
- 工作内存:工作内存和主内存的关系?它们的作用分别是什么?说一下每个线程工作内存的设计原理?简述重排序,内存屏障,happen-before。
- 内存:说一下创建对象后,对象的内存布局,平常用到的锁,在内存对象布局哪里,怎么去判断对象中某个方法是否有锁
- GC机制:垃圾回收机制的原理是什么?如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
- GC机制:请从四大引用这块说一下GC的回收策略?引用计数法的思路是什么?引用计数法两个对象互相引用如何解决?
- 垃圾回收:什么情况下触发垃圾回收?如何选择合适的垃圾收集算法?JVM中最大堆大小有没有限制?吞吐量优先选择什么垃圾回收器?响应时间优先呢?
- JVM内存分哪几个区,每个区的作用是什么?一个对象从创建到销毁都是怎么在这些部分里存活和转移的?
- JVM自身会维护缓存吗?是不是在堆中进行对象分配,操作系统的堆还是JVM自己管理堆?什么情况下会发生栈内存溢出?
- JVM优化:做过那些jvm优化工作?优化的步骤是怎么进行的?
09.反射使用问题
- 反射概念:什么是反射机制?java反射机制提供了什么功能?在运行时如何调用任一对象的方法?反射优缺点有哪些?
- 反射使用:如何通过反射创建对象?如何反射获取内部类和调用内部类方法以及反射得到匿名内部类?如何通过反射获取和设置对象私有字段的值?
- 反射使用:new和反射创建对象有何区别?场景分析题:你需要控制学生、老师或家长唱歌行为,可是这些类又是由其他人设计,你只对开始与暂停操作进行控制。那么该如何做呢?
- 反射:如何防止反射序列化攻击单例?反射中有个暴力访问权限方法,这个方法怎么实现的?如何避免反射攻击?
- 反射跟泛型:如何通过反射获得泛型的实际类型参数?forName()源码设计思想是什么?getMethod源码设计思想是什么?
- 反射分析:什么是反射机制?反射机制的优缺点?通过设置setAccessible(true)暴力访问权限有什么危害?
- 反射性能:反射为何损耗性能,从jvm层面说一下你的看法?如何提高反射的效率?
10.枚举注解问题
- 注解作用:注解起到什么作用?注解有哪些?写过注解吗?比如分析下butterKnife在bind()时的原理……注解如何实现一个findViewById
- 注解分类:编译器注解和运行期注解使用场景有哪些?说一下编译期注解实践的场景?运行时注解:retrofit;编译时注解:EventBus
- 注解实践:注解如何获取,反射为何耗性能?了解动态注解吗,说一下Retrofit网络加载框架是如何进行动态注解的?
11.线程池问题
- 线程池设计:为什么要有线程池?线程池的核心设计思想是什么样的?线程池设计包含那些属性?线程池如何设计任务提交?
- 线程池:线程池的关闭方式有几种,各自的区别是什么?线程池中submit() 和 execute()方法有什么区别?
- 线程池:线程池内的线程如果全部忙,提交一个新的任务,会发生什什么?队列全部塞满了之后,还是忙,再提交会发生什么?
- 核心线程:线程池核心线程数一般定义多少,为什么?核心线程可以销毁吗,为什么?
- 线程池场景:说说几种常见的线程池及使用场景?线程池都有哪几种工作队列?怎么理解无界队列和有界队列?
- 线程池复用:线程池复用原理是什么?是执行完成后销毁,再新建几个放那;还是始终是那几个线程?
- 线程池设计:如何理解线程池是一种生产者&消费者模式?
12.其他知识问题
- 加解密:加解密有哪些方式?对称加密有哪些,使用场景是什么?非对称加密有哪些,使用场景是什么?如何理解单向加密?
- MD5:用途是什么?应用场景有哪些?如何增强md5的安全性?md5的算法大概是什么样的?如何设计一款算法?
- Base64:base64是加密算法吗?那些场景使用base64?它的本质是什么?它编码的好处是什么?为何说base64处理的数据有利于多设备传输?ASCII不可见字符有哪些?
- 四种引用:为何需要四种引用?说一下四中引用的区别和使用场景,什么情况下会导致应用内存空间不足?弱引用和软引用有什么区别?引用队列如何理解?
- 强引用:如何回收强引用?强引用有何特点?将对象引用赋值为null有何意义?将引用设置成null后jvm什么时候回收对象呢?
- 软引用:软引用的使用场景?如何判断内存空间是否足够?可能被回收,Jvm是如何处理软引用队列的回收逻辑?注意点有什么?
- 弱引用:弱引用有何特点?垃圾回收器如何处理弱引用回收策略?软引用和弱引用如何选择?
- 序列化:transient关键字作用是什么?使用场景是什么?它的实现原理是什么?