25届实习/秋招-java面试-JavaSe面试题整理-牛客网近一年
JavaSe
面向对象
-
- new初始化过程,和反射相比谁更快?
-
为什么要有封装类
-
static和final区别。
- static表示属于类,只有一个
- static修饰的字段什么时候初始化,放在哪
- 对于static变量的理解,有什么用
- static变量分配内存的时候发生在哪个环节?
- static加在类上和不加区别,除了修饰类、属性、方法还有吗? 代码块
- 使用static需要注意什么
- 写一个static main方法,能调用非静态方法吗?如果要调用要怎么调用?为什么不能不创建对象调用?
- 静态方法和非静态方法的区别
-
实例化:
-
class B { static B t1 = new B(); static B t2 = new B(); { System.out.println("代码块"); } static { System.out.println("静态块"); } } public class Main { public static void main(String[] args) throws Exception { B b = new B(); } } //输出什么
-
-
重载的重写的区别
- 构造方法的重载
-
多态用在哪里,有什么用处。
- 多态的原理
-
final
- final修饰变量和静态变量在哪里可以赋值
- final修饰类、方法(重写)、字段、对象的作用,fin al修饰一个对象是什么不变。
- final可以修饰接口吗。不可
- final修饰变量 不能改写 修饰list集合,可以加数据吗
-
继承:Java支持多继承吗?从开发的角度说一下为什么不支持多继承
-
接口和抽象类的区别?应用场景?
- 普通类和抽象类区别,可以被new吗
- 抽象类可以实现接口吗 -- 可以
- 两者是否可以实例化
- set接口可以定义私有成员变量吗
- 接口:多继承
-
Java权限修饰符
- 四个的区别
-
面向对象的三个特性
- 和面向过程编程有什么区别?
- 什么是结构化编程、面向对象编程以及函数式编程?
-
Object 类有什么方法--举出常用方法
-
== 和equals的区别
- equals是判断引用是否一样。看是否重写。
- 默认使用 ==
- String类里面的equals方法实现看过吗,源码解析
- 自己实现equals要注意什么
- equals是判断引用是否一样。看是否重写。
-
finalize方法
- JVM中自救
-
hashcode方法
- 什么时候要重写hashcode
- java底层集合框架中使用hashCode方法来确定元素的保存位置。
- 什么时候要重写hashcode
-
浅拷贝和深拷贝的区别,深拷贝怎么实现,引用拷贝。
- 深拷贝会在堆上创建一个新的对象。
- 基本类型浅克隆可以,引用类型
- 引用类型在浅克隆后,要对引用的变量再进行嵌套克隆。
- 可以看javaguide,引用/浅拷贝/深拷贝的区别
- 浅拷贝
- 深拷贝会在堆上创建一个新的对象。
-
Object[] o, 可以存放各种类型的数据,底层怎么存放的
- Object o = 1L 是怎么存储的
-
-
内部类--了解即可:
- 匿名内部类是局部内部类
- 匿名内部类访问外部成员变量时编译器会提示需要final修饰为什么
常用工具类String-Arrays
java原生类中用的最多的类
-
Arrays类(工具类),常用方法
-
String类
-
常用方法和构造,valueOf
-
java7 String 存储结构和API 变更
-
string为什么设计成不可变,好处
- private且final无法继承。
- java的string类的设计思想,jdk1.9前后区别。
- 底层char / byte,在 Java 9 之后,String 类的实现改用 byte 数组存储字符串
- 解释
- 换成不定长的存储数组会有什么问题, "12我是"12占用两个字节,我是占用应该是6个字节,这样存在什么问题。
- string为什么不能是基本数据类型
-
String直接赋值 stringpoll 和 new一个对象的区别。
String str = new String("abc")
创建字符串对象 --这里涉及两个对象new String("a") + new String("b")
涉及几个对象- String a = "a", String b = new String(a + "b"); 创建了几个对象
- String str = "i"; String str2 = new String("i") 一样吗
-
字符串常量池
- 字面量,字面量是对象吗,能调用方法吗
- 如何设置大小
- intern( )方法, 见JVM
- 内存位置在哪
- 方法区-元空间- 本地内存
- 探秘位置在哪 -- 真正意义上字符串常量池在堆中存储,元空间可能有引用堆中字符串常量,运行时常量池在方法区中
- 优化常量池的方法
-
StringBuffer(synchronized)和StringBuilder的区别和String的区别
-
StringBuilder的方法
-
StringBuffer和StringBuilder是如何实现可变的呢?底层原理是什么?如何优化 如果让你来实现StringBuffer和StringBuilder,你会怎么实现?
-
String的+=和stringBuilder哪个性能高?面试官答其实差不多,+=在一行的时候会隐性转换为stringbuilder
-
-
-
-
基本数据类型和包装类
-
String是什么类型
-
基本数据类型介绍
- 基本类型几种,分别占用空间
- 成员变量没有手动赋值,系统会默认赋值(局部变量不会)
- 除了基本数据类型,数组存放的都是对象的引用地址
- 基本类型几种,分别占用空间
-
包装类,为什么要包装类
- Number抽象类
- 非自动装箱和自动装箱拆箱
- 自动拆装箱会有什么问题
- 传输对象如RPC/Http要用包装类吗
-
包装类常量池
- Integer的范围,哪些有常量池
- 常量池是放在哪里的
- new Integer()与Integer.valueOf()的区别,谁块
- 判断相等的为什么不用 == ?
-
int和Integer区别,int有几个字节
- Integer的构造方法。
- Int i =1 和 integer i=1存储区别
- 如何声明一个int的List(不能,只能声明Integer的List)
- Integer是线程安全的吗,哪些类是线程安全的
- 给Integer最大值+1结果
- String int Integer直接相互转换 : 静态方法
- 类都是valueOf,到int不一样。
-
Long 缓存池,包装类
-
-
switch可以放哪些类型
- String / int, 但byte,short,char自动转成int
-
方法参数传递:JAVA中值传递还是引用传递
-
DateFormat
- 正则表达式略。
-
java中浮点数精度怎么解决,有了解过实现吗,为什么有精度问题
- 判断BigDecimal是否相等
- 如何进行计算、怎么四舍五入
-
常量池和包装类的缓存
-
为什么有常量池,思想
-
分类,两类。
- 符号引用和字面值的关系
-
包装类和常量池的区别
- 同样思考,为什么是安全的,为什么要安全
-
异常:
-
基本介绍
- exception和error区别
- 异常继承的根类
- 根类有哪些方法,处理错误
- Exception有哪些,从上往下说说看
- 编译期异常和非编译期异常区别
- 编译时异常是在编译阶段发生的吗
- 是否必须处理
- 异常的本质是什么,发生在什么时候
- 编译期异常和非编译期异常区别
-
编译异常:
-
运行时异常:
- 遇到过哪些异常,(空指针在哪遇到了、SQL 异常、类型转换异常)
-
谈谈 Java 异常处理机制,异常处理的两种方式:
-
throws的作用
- throw和throws的区别
-
try/catch机制
- try finally不用catch行吗
- finally一种情况下不会执行
-
为什么有些异常需要捕获try catch,有些直接往上抛就可以,面试官提示了一下编译那一块
-
-
final/finally/finalize
-
如何自定义异常
集合框架:
-
介绍Java集合(容器),什么是集合存什么
-
几个常用的数据结构的底层原理
- 特点,存储结构,红黑树。
-
介绍Java里面常见的集合、整体框架,父接口
-
如何升级成线程安全的容器--Collections
-
-
两个大的父类
-
Collection接口
-
继承了哪个接口:
- Iterator怎么用
- 本质是什么,remove的使用。ediary
-
哪些继承了Collection,特点和函数
-
常用方法方法:add clear remove toArray()
-
简单讲讲List和Set的区别(都是接口),都继承了哪个接口,Map继承了上述接口吗
-
-
List, Set, Queue, Map 四者的区别
- List 和 map的实现类 和各自的底层结构
-
Collections 和 Collection
- Collections.sort和Arrays.sort
- 集合的选用,是否排序
- collections有什么实现
List:
- List集合的特有方法(List是接口)
- ArrayList和LinkedList
-
区别,底层结构,优缺点和使用场景
-
为什么都用arraylist
- 无需同步,大部分尾插
-
arraylist对大片的连续内存有很高要求,linkedlist只需要碎片空间
-
- 知道容量,还要看位置
-
-
ArrayList:
-
惰性初始化,构造方法
-
arraylist扩容机制(初始容量,为啥扩容是1.5),底层arraycopy函数,删除和加入代价都很大
-
一个关于ArrayList扩容的场景题优化扩容,让自己设计增强类去实现。
-
-
为什么可以随机读取,
- 底层Object[]数组,为什么限制只能存一类
-
应用:
- ArrayList中删除偶数,不能用remove
- 多线程往ArrayList中写10万条数据,会出现什么问题
- ArrayList一边遍历一边删除的时候怎么做,remove
-
写时复制并发安全CopyOnWriteArrayList
- 写入操作的实现,不适用于哪种场景。参考
- Collections/vector
-
-
LinkedList
- LinkedList为什么是双端链表
- 便于查找和修改
- 个链表没有被引用,会被立马删除吗
- 分别分析一下插入、删除、查找的时间复杂度
- 可以通过什么数据结构来加快LinkedList的访问
- LinkedList为什么是双端链表
-
ArrayList和linkedlist的多线程问题如何解决
-
- Vector ,扩容
Map:
-
集合关系(Collection和Map)
-
Map集合的体系特点。
- 键的特点,键和值都是什么类型
-
map集合下常用的子类有哪些/实现类
- map接口,HashMap是实现
-
常用的api
- 如何获取键值对
- .values( ),参考
- 如何获取键值对
-
Map集合的遍历方式:有几种,效率
-
第一种获取key
- keySet,用什么承接
-
第二种,全部转成Set
- Map.Entry 是什么
- 怎么写
-
-
-
HashMap集合
-
源码
-
- 是否可为null,有几个,对并发的影响
- 是有序还是无序的
-
底层结构-哈希表优点
- Node是什么,里面存了什么东西,hashMap底层是什么数组
- contains方法底层用的什么,原理
- hashCode()和equals()有什么作用、区别。
- key通过hashCode得到hash值(怎么算的,为什么要扰动),怎么到下标-长度,hashMap数组长为什么是2的整数幂
- hash值与数组下标的关系
- equals的作用,不重复equals比对象的key,什么时候调用。
- 如果key指向的对象一样不用比较
- 什么时候要重写hashcode和equals
- key通过hashCode得到hash值(怎么算的,为什么要扰动),怎么到下标-长度,hashMap数组长为什么是2的整数幂
- 1.8之前为什么这么设置,解决hash冲突有别的办法吗
- 数组初始容量,为什么负载因子是0.75 ,怎么扩容
-
成员属性:
- 1.8之后:为什么引入红黑树(为什么不用avl树,而不是BST、B+、堆等等)? 红黑树自旋条件,平衡自旋怎么做的复杂度多少? 红黑树的性质、红黑树如何调节平衡
- 什么时候转红黑树,为什么红黑树阈值是8,不是6或者10
- 红黑树会退化成链表吗,什么时候
- 转红黑树的数组最小长度(64)见源码,先扩展数组,resize()为短链表
-
成员方法:
- 1.8的三个优化:红黑树,尾插,插入扩容逻辑还有位置
- Put操作流程,源码
- 并发异常
- java的hashmap的fastfail机制。
- 为什么不是线程安全的。它在什么情况下会出现线程不安全的问题,不安全情况下会出现什么现象?说一下场景
- jdk7/8有都什么问题?问题有什么区别?
- 平时使用hashmap要关注那些方面的东西
- 有措施能让Hashmap变得线程安全吗?
- ConcrrentHashmap,Hashtable,Collections.synchronizedMap
-
-
hashmap和treemap有什么区别,什么时候用?
- treemap底层数据结构是什么?
- 怎么实现有序
-
concurrentHashmap
- 见JUC
Set:
-
HashSet: hashset是怎么基于hashmap实现的。
- 如果自己什么设计
- 如何去重:
- hashcode比较和equals比较
- 一个自定义的对象的话,那我这个对象应该是有什么动作吗
-
LinkedHashSet为什么有序:
- 多一个顺序存储的链占据空间。
-
HashSet和TreeSet有什么区别?
- 集合是如何排序的
- 如果传入TreeMap的key值是对象,那么对象应该满足什么条件
- 为对象的类//用的集合设置比较器,实现Comparable接口,重写compareTo方法。
- 比较器底层原理Comparator,比较器类
- compare和compareTO
- 左>右,返回正。怎么区分交换。 一般升序就写左右即可。
- 代码如何写
- treeSet和treeMap的关系
Queue
- 常用的方法。
泛型
-
什么时候起作用
-
使用泛型有什么好处 ,理解和应用场景
-
类方法接口
-
通配符
- 泛型中如何确定上下限(
<? extends T
><? super T>
)
- 泛型中如何确定上下限(
-
泛型检查
-
Java语言的泛型是怎么实现的?为了解决什么问题而出现的?泛型的效率一定很低吗?
IO:
- File
- 打开一个文件的流程
- 怎么从文件中读写
- 打开一个文件的流程
- IO流都有哪些、继承关系和应用场景
-
追问I/O流的设计模式,IO流的作用
-
IO流用了什么设计模式
- 参考 ,理解适配器和装饰者模式
- 适配器继承被代理对象110v,实现目标对象接口220v,中间进行转化操作。
- 装饰器都有同一个父类和抽象方法,每次调用传入同一个对象调用例如addCost
- 参考 ,理解适配器和装饰者模式
-
- IO stream
反射
-
反射的理解
- 能干吗(例如配置文件如何new对象),优缺点
- 和思想
- Class类,四个类
-
应用场景:什么时候用,怎么用,用过吗
- 第一步: 获取这个类对应的字节码,几种方法
- tips不创建对象类加载
- 第二部构造,有了字节码能干嘛
- 你自己写过反射吗,反射可以调用私有构造函数吗
- 私有构造器
- 第一步: 获取这个类对应的字节码,几种方法
-
getClassLoader理解
- classpath理解,如何获取根路径
-
Field类
- 一个类的某个属性是私有的没有get/set方法,如何通过反射获取,代码上怎么具体实现
- 如何承接,如何反编译Fields
- 一个类的某个属性是私有的没有get/set方法,如何通过反射获取,代码上怎么具体实现
-
反射调用对象方法
-
反射可以调用私有构造函数,怎么调用
- 获取父类和接口
-
反射的原理
-
动态加载和静态加载
-
和方法区的关系
-
-
反射效率低将反射结果进行缓存有遇到过吗
注解
-
注解是什么,用在哪,@Retention
- 注解中的属性怎么设定。
- 反射机制获取注解的属性,条件。
- 分为从类中,方法中
-
注解的作用,反射的关系
Java新特性
- 用java哪个版本,jdk8新特性说一下
- java的lambda表达式
- 函数式接口。
- 匿名内部类
- 内部类就是new Student() {}; 多了大括号,代表匿名内部类,类中重写父类/接口的方法。
- java的lambda表达式
设计模式 --没看完后序补
-
单例模式:
-
是什么, 怎么实例化,什么时候用,为什么要静态static
-
两种分类:
-
各自的优缺点,分别应用在什么场景下
-
饿汉式:
-
懒汉式:
- 单例模式双check检查锁,太慢
- 为什么进行第二次非null判断
- 安全吗如何实现安全,锁加在哪
- 加锁比较影响性能,那除了加锁以外有什么其他方法吗
- 静态内部类实现单例模式为什么属于懒汉式的?
- 单例模式双check检查锁,太慢
-
手写单例模式,各种情况怎么保证线程安全
- 为什么要用DCL(双chek检查),为什么要用volatile-作用,为什么要用synchronized,为什么要锁住类的.class
-
-
代理模式:
-
代理模式的作用:代理包一层,通过代理对象访问原始对象
- 代理对象,访问对象
-
静态代理
-
动态代理原理
- 什么时候用
- JDK代理 和 CGLib 对比区别
- 优缺点,分别在什么情况下用。
- 常用处CGLib在哪用到了
- 如果被代理对象不实现接口怎么实现代理
- 具体实现
-
方式对比:
- 优缺点
- 动态代理和静态代理区别
-
-
观察者模式,说说怎么设计相应的类
-
工厂模式
-
装饰器模式,代理模式,以及两者的区别
-
适配器和装饰器模式的区别?装饰者模式和策略模式的区别
-
OOP设计模式六大原则
-
说一下模板模式,举一些例子
-
实现工厂模式
-
责任链模式在哪里用到了、模板方法
-
ocp开闭模式
JVM
JVM概述:
- 是什么-规范,有什么作用
- jvm jre jdk
- 整体的架构:
内存结构
-
内存结构/内存模型--即为运行时数据区:
- JVM了解过哪些版本,1.8和1.7内存结构不同的地方
- 方法区规范(8之前永久代实现堆上)改为了放在本地内存的 方法区(元空间实现),堆中剩下年轻和老年代,字符串常量池、静态变量
- 内存结构是怎样
- JVM了解过哪些版本,1.8和1.7内存结构不同的地方
-
JVM内存
-
程序计数器:
- 特定
-
虚拟机栈:
- 栈和栈帧的作用
- 栈里有什么,栈帧的结构
- 是否要垃圾回收
- OOM和StackOverflow是什么区别?
- OOM的可能,Java出现了OOM怎么排查
- 哪些区域会出现OOM?,程序计数器呢
- 有没有遇到OOM的问题,如何解决OOM的
- 分为堆和栈,异常类型
-
本地方法栈存储的什么
- 虚拟机栈和本地方法栈的区别?
-
堆:
- 特点
- 堆中有哪些对象
- 生成的Class对象存储在哪里
- Java8中方法区改为本地内存的元空间
- 堆内存工具,三个
-
方法区(元空间):
- 存了什么
- 字节码存储在哪个区域
- 类(静态)常量池,运行时常量池,字符串常量池
- 常量池== 常量池表,查表。
- 字符串常量池(StringTable):
- jdk 1.6之前StringTable是存在永久代中,属于运行时常量池一部分。但是由于使用很频繁,且永久代中垃圾回收效率很低。jdk 1.7之后将StringTable移除到了堆内存中,堆内存中垃圾回收效率更高。
- 什么是常量,什么是变量。为什么要常量池
- 存了什么
-
本地内存:
- 和虚拟机内存的区别
- 中的直接内存
-
变量的位置:
- private static final String 在哪个区域 --方法区
-
内存管理:
-
内存的分配:(结合javanote)
TLAB简单了解一下- 逃逸分析:
- 对象只能在堆上分配吗?如果在栈上分配除了逃逸分析外,还要有什么条件?
- 分代思想:
- 新生代和老年代,比例划分
- 新生代又分为什么
- MinorGC(YoungGC)和Full GC
- 晋升到老年代的条件:
- 阈值是几,大对象
- 大对象为什么不放在新生代
- 对象晋升是什么, 过早晋升会导致哪些危害
- 新生代和老年代,比例划分
-
回收策略:
-
各种GC什么时候触发:
-
MinorGC的触发时机是什么,触发STW
-
什么时候会FullGC
- 如何手动GC,担保
-
如何避免FullGC
-
MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW) Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有 FullGC: 新生代 + 老年代完整垃圾回收+方法区,暂停时间长(STW),应尽力避免
-
-
这两个GC的流程
-
GC的过程是由谁来调度和启动的
-
-
垃圾回收:
-
垃圾判断:
- 要对哪些进行垃圾回收(主要是堆中对象,部分方法区中)
- 判断对象存活(是否是)的两种方式:引用计数算法和可达性分析算法
- 引用计数法:
- 优点:循环引用问题
- 可达性算法:
- 什么是GCroots(引用),如何选gcroots(说全)
- 应该有哪些前置性的操作
- STW
- 可达性算法底层数据结构
- 三色标记原理--见ediary后面
- 并发标记:多标-浮动垃圾,漏标的处理了解。
- 引用分析:
- java的四大引用类型,引用队列
- 引用计数法:
-
回收算法:
- [大总结](Java 垃圾回收机制 - 迷路的圆 - 博客园 (cnblogs.com))
- 三种区别,优缺点,用在哪里:
- 分配担保机制,具体的回收要依赖回收算法
- JVM综合使用了上述算法,实现了分代垃圾回收机制
-
垃圾回收器:
-
1.8之前分代上下结合,不同的分代有不同的垃圾回收器,举出不同分代常用垃圾回收器
- - 红色虚线在 JDK9 移除、绿色虚线在 JDK14 弃用该组合、青色虚线在 JDK14 删除 CMS 垃圾回收器 - 之后就是分区,所有代只一个回收器
-
回收算法的具体实现:分为哪几类:
- 哪些是并行的-为什么要并行,GC的性能指标
- 卡表记忆集--了解,漏标写屏障-了解,跨代引用问题
- 常见的垃圾回收器组合,组合中使用的回收算法
- JDK各个版本使用的哪个垃圾回收器,jdk8
- 并行和并发的区别,STW
- CMS的工作流程,使用场景(用在哪一代)
- 和之前的区别,分为几步,哪步会STW
- 浮动垃圾和错标
- 为什么要STW,CMS为什么标记清除
- G1的工作流程,和CMS区别,优缺点
- g1有分代(区域吗),g1里除了新老生代,还新增了哪个区(大对象区)
- 浮动垃圾有解决吗,一定程度解决了(还有)|| 内存碎片呢
- CMS和G1如何选择。
- G1中新生代和老年代的比例是动态的吗 ,比例是多少,可以手动设置,会扩容有上限。避免手动调节,自动分配 。
-
-
-
调优见下面
类加载-编译
-
了解过热点代码吗? 你知道hotsport为什么要叫hotspot?
-
什么是类加载:
-
类文件的结构,javap反编译:了解
-
多态的原理,synchrondized的原理
-
-
语法糖,了解
-
类加载机制和过程:
- 加载阶段加载了哪两个。
- 连接的作用
- clinit执行几次,如果执行失败了怎么办这个类还能用吗?
- clinit()和单例模式
- InstanceKlass,Class类对象(作用--java_mirror),实例对象之间的关系
- 静态变量存哪
- 静态变量,静态代码块,成员变量,构造函数的执行先后顺序
- 什么操作会触发初始化,初始化和类加载的关系
-
类加载器:
-
有哪些类加载器:作用
- 可以参见ediary反射
-
加载模型:
-
三种类加载器:加载的目录,如何获取类加载器。
- jre/lib
-
为什么要有双亲委派,目的是什么,缺点
- 【Java】深入了解双亲委派机制(常说的类加载机制)_spring 双亲委派-CSDN博客
- 如何破坏双亲委派,为什么自定义类加载器,自己写的类和String类重名加载为啥报错
- 自定义类加载器可以加载java.lang包下的类吗-jvm安全检查
- 什么情况下需要自定义类加载器
-
线程类加载了解
-
-
运行期优化:了解
- 热点代码,逃逸分析-作用
JMM内存模型
- JMM描述的是什么
- 其他在JUC内存部分
系统优化:
-
性能调优:
-
JVM调优会不会:背景+思路+具体改动+验证方案,聊一次排查 JVM 的经历
-
了解过一些相关监测指令吗?
-
内存泄漏
- jvm内存溢出和内存泄露的区别,分别有哪些场景
- 内存泄漏的8种情况:
- 如何避免这几种情况
-
参数调优:
- 在哪设置
- 常用的JVM参数:
- 最大堆和堆初始大小设置
- Xmx和实际占用的内存大小,Xmx和xms的关系
- Java申请的1g内存全部是真实的内存吗
- Xmx和实际占用的内存大小,Xmx和xms的关系
- 说出常用参数
- 最大堆和堆初始大小设置
-
实际案例:
-
GC调优目标,相关工具,怎么看到参数。
- 调优的步骤,为什么这么做
- 新生代
-
新生代设置比例,为什么要折中
-
怎么优化
-
- 工具:jstat
-
时间比较久的Minor GC
-
- 新生代
- 调优的步骤,为什么这么做
-
老年代一直满?然后让我分析可能是哪些原因。
-
log4j2导致内存泄露: 记住用的工具,如jps
-
大对象直接进入老年代因此频繁 Full GC; 静态变量过多,变量生命周期过长,存活率过高,造成老年代过大; 内存泄露导致无用对象晋升老年代并无法被 GC 回收。
-
内存泄漏怎么诊断:
- 答了jmap、jvm参数堆转内存快照放到visual jvm中,会提示oom的位置。面试官说生产环境中不会等到宕机再看,在没宕机出现oom的时候可以看一下有哪些大对象或者长期未被回收的对象。
-
-
-
MetaSpace占用内存高一般是什么原因导致的
- 原理, 流程
-
-
eidary后的补充扩展了解