版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
115道Java高频面试题及详细答案一、Java基础语法(1-20题)1、Java的基本数据类型有哪些?区别是什么?Java一共8种基本数据类型,分为四类:整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)浮点型:float(4字节)、double(8字节)字符型:char(2字节)布尔型:boolean(1字节,只有true/false)核心区别:基本类型直接存储数值,存放在栈内存;默认有初始值,不需要new创建,赋值简单高效。和包装类相比,不存在对象创建的开销。2、int和long的区别?使用场景?int占4字节,取值范围-2^31~2^31-1,大概正负21亿,日常普通数值、计数、ID都够用。long占8字节,取值范围更大,适合超大数值,比如订单号、雪花ID、时间戳、大数据统计数值。定义long类型变量必须在数值后加L,否则默认是int。3、float和double的区别?为什么不推荐用float做精准计算?float单精度4字节,有效位数6-7位;double双精度8字节,有效位数15-16位,精度更高。二者都是浮点近似存储,二进制无法精准表示十进制小数,会出现精度丢失。比如0.1+0.2不等于0.3。商业金额计算绝对不能用浮点,必须用BigDecimal。4、char类型能不能存中文?为什么?可以。char占2字节,Java采用Unicode编码,绝大多数常用中文汉字的Unicode编码都在2字节范围内,所以单个char可以存储一个中文汉字。5、boolean类型可以赋值null吗?不可以。boolean是基本数据类型,默认值是false,只能存true或false。只有包装类Boolean可以赋值null。6、基本类型和包装类的区别?1、存储:基本类型存栈内存,直接存数值;包装类是对象,存堆内存,栈存引用地址。2、默认值:基本类型有固定默认值;包装类默认null。3、泛型:泛型只能用包装类,不能用基本类型。4、功能:包装类提供大量工具方法,比如类型转换、数值判断,基本类型没有。7、什么是自动装箱和拆箱?装箱:基本类型自动转为对应的包装类,比如Integera=10;拆箱:包装类自动转为基本类型,比如intb=a;JDK5之后自动支持,底层是调用valueOf、intValue等方法实现。8、Integer缓存机制了解吗?Integer默认缓存-128到127之间的数值。这个区间内的Integer对象,直接从缓存获取,不会新建对象,所以==比较结果为true。超出这个区间会新建对象,==结果为false。缓存上限可以通过JVM参数调整,下限不能改。日常开发中,包装类数值比较一律用equals,不要用==。9、String是基本类型吗?为什么?不是。String是引用类型,属于java.lang下的类,底层是字符数组(JDK9后是字节数组),可以new创建对象,默认值是null,不是基本类型。10、String、StringBuilder、StringBuffer的区别?1、String:不可变,每次拼接都会生成新对象,适合少量字符串操作。2、StringBuffer:可变,线程安全,方法加了synchronized,效率低,适合多线程场景。3、StringBuilder:可变,线程不安全,效率最高,单线程字符串拼接首选,日常开发最常用。11、String为什么不可变?底层存储字符的数组被final修饰,地址不可变;同时类被final修饰,不能被继承,避免被篡改。每次修改字符串都是生成新对象,原对象不会改变。12、==和equals的区别?==:基本类型比较数值是否相等;引用类型比较对象地址是否相同。equals:是Object的方法,默认和==一样比较地址。像String、Integer这类类重写了equals,用来比较内容是否相等。日常字符串、对象内容对比必须用equals。13、final、finally、finalize的区别?final:修饰符,修饰类不可继承、修饰方法不可重写、修饰变量不可二次赋值。finally:异常处理关键字,搭配try-catch使用,代码最终一定会执行(除了极端JVM退出场景)。finalize:Object中的废弃方法,JVM垃圾回收前调用,存在性能问题,JDK9之后废弃,基本不用。14、break、continue、return的区别?break:跳出当前循环或switch语句,终止循环。continue:跳过本次循环剩余代码,直接进入下一次循环。return:结束当前方法,返回结果,直接退出方法。15、Java中的位运算符有哪些?用途?主要有与&、或|、异或^、左移<<、右移>>、无符号右移>>>。位运算效率极高,常用在权限标识、状态位判断、快速乘除(左移乘2、右移除2)、哈希计算等场景。16、三元运算符的使用注意事项?格式:条件?表达式1:表达式2。必须有返回值,不能单独执行语句;优先级较低,复杂场景建议加括号;不建议多层嵌套,可读性差。17、Java的参数传递机制是什么?只有值传递。基本类型传递数值副本,方法内修改不影响原变量;引用类型传递地址副本,方法内修改对象内容会影响原对象,修改引用地址不会影响。18、变量的分类和作用域?局部变量:定义在方法、代码块内,仅当前作用域有效,必须手动初始化,存在栈内存。成员变量(实例变量):定义在类中方法外,属于对象,对象创建后存在,有默认值,存在堆内存。静态变量:被static修饰,属于类,类加载就初始化,全局共享,存在方法区。19、static关键字的作用?修饰变量:静态变量,类全局共享,所有对象共用一份。修饰方法:静态方法,可通过类名直接调用,不能访问非静态成员。修饰代码块:静态代码块,类加载时执行一次,用于初始化静态资源。修饰内部类:静态内部类,不依赖外部类对象。20、this和super的区别?this:代表当前对象,调用本类属性、方法、构造器。super:代表父类对象,调用父类属性、方法、构造器。二者调用构造器都必须放在第一行,且不能同时使用。二、面向对象OOP(21-40题)21、面向对象的四大特性?分别是什么?封装、继承、多态、抽象。封装:隐藏内部细节,对外提供统一访问接口,保证数据安全。继承:子类复用父类代码,减少冗余,实现代码复用。多态:同一行为,不同对象有不同实现,提高代码扩展性。抽象:抽取公共特性和行为,定义规范,不关注具体实现。22、什么是封装?开发中怎么体现?将类的成员变量私有化,用private修饰,通过public的get、set方法访问和修改数据。可以在set方法中做参数校验,避免非法数据赋值,保护内部数据完整性。23、继承的优缺点?优点:代码复用、减少冗余、便于统一维护、支持多态。缺点:耦合度高,父类修改会影响所有子类;单继承有局限性,类结构层级过深会降低可读性。24、Java为什么是单继承?避免多继承的冲突问题。如果一个类同时继承多个父类,多个父类有同名方法,编译器无法判断调用哪个,会产生歧义。Java用接口实现多继承的效果,兼顾安全和扩展。25、什么是多态?实现条件?多态就是父类引用指向子类对象,调用方法时执行子类的重写逻辑。实现条件:存在继承关系、方法重写、父类引用指向子类对象。26、重写和重载的区别?重载:同一个类中,方法名相同,参数列表不同,和返回值、修饰符无关,编译期多态。重写:父子类之间,方法名、参数、返回值完全一致,权限修饰符不能更严格,运行期多态。27、抽象类和接口的区别?1、抽象类有构造方法,接口没有构造方法。2、抽象类可以有普通变量、普通方法、静态方法;接口只能有常量、抽象方法(JDK8后有默认、静态方法,JDK9有私有方法)。3、类是单继承抽象类,可多实现接口。4、抽象类偏向代码复用,接口偏向行为规范定义。28、抽象类可以被实例化吗?不能直接new实例化,但可以通过子类向上转型创建对象。抽象类就是用来被继承的,专门定义通用模板。29、接口可以有构造方法吗?不可以。接口是行为规范,没有成员属性初始化的需求,也不能实例化,所以没有构造方法。30、JDK8、JDK9对接口的新特性?JDK8:支持默认方法、静态方法,解决接口升级后子类全部要重写的问题。JDK9:支持私有方法和私有静态方法,用来抽取接口内部重复代码,不对外暴露。31、构造方法的特点?方法名和类名完全一致、没有返回值、创建对象时自动调用、可以重载、子类构造器默认先调用父类无参构造。32、构造方法可以被重写吗?不可以。构造方法属于类独有,没有继承概念,只能重载,不能重写。33、私有方法可以被重写吗?不可以。私有方法仅本类可见,子类无法继承,自然不能重写,子类定义同名方法只是新方法,和父类无关。34、static方法可以重写吗?不可以。静态方法属于类,不属于对象,多态针对对象生效,静态方法不存在重写,子类同名静态方法只是隐藏父类方法。35、什么是向上转型和向下转型?向上转型:子类对象赋值给父类引用,自动转换,安全,多态核心。向下转型:父类引用强制转为子类对象,手动强转,不安全,容易报类型转换异常,一般先做instanceof判断。36、instanceof关键字的作用?判断对象是否是某个类或接口的实例,返回布尔值,主要用于向下转型前的类型校验,避免转型异常。37、内部类的分类?成员内部类、静态内部类、局部内部类、匿名内部类。日常开发匿名内部类用的最多,现在大多被Lambda表达式替代。38、匿名内部类的特点?没有类名、一次性使用、可以快速继承类或实现接口、编译后会生成独立的class文件,代码简洁,适合临时使用。39、对象的创建过程?1、类加载检查,确认类已加载;2、分配堆内存空间;3、成员变量默认初始化;4、代码块初始化;5、构造方法初始化;6、返回对象引用。40、类的加载顺序?父类静态代码块>子类静态代码块>父类普通代码块>父类构造方法>子类普通代码块>子类构造方法。静态内容仅加载一次。三、集合框架(41-60题)41、Java集合的体系结构?核心两大接口:Collection、Map。Collection单列集合:List(有序可重复)、Set(无序不可重复)、Queue(队列)。Map双列集合:键值对存储,键唯一,值可重复。42、ArrayList和LinkedList的区别?ArrayList:底层动态数组,查询快、增删慢,随机访问效率高,线程不安全。LinkedList:底层双向链表,增删快、查询慢,适合频繁插入删除操作,线程不安全。43、ArrayList的扩容机制?JDK8默认初始容量10,第一次添加元素初始化数组。每次扩容为原容量的1.5倍,扩容后复制原数组元素到新数组。批量添加时会按需扩容,避免多次扩容。44、ArrayList为什么线程不安全?多线程同时添加元素时,会出现数组越界、元素覆盖问题。没有加锁,并发写入无法保证原子性、可见性。线程安全场景推荐CopyOnWriteArrayList。45、Vector和ArrayList的区别?Vector线程安全,所有方法加了synchronized,效率低;扩容默认翻倍。ArrayList线程不安全,效率高,扩容1.5倍,日常开发不用Vector。46、HashSet的底层原理?HashSet底层就是HashMap,存储元素时把元素作为Map的key,value统一为固定常量。依靠hashCode和equals方法保证元素唯一性。47、TreeSet的特点?底层是TreeMap,基于红黑树,元素自动排序,支持自然排序和自定义比较器排序,元素不可重复。48、HashMap的底层原理?JDK7和JDK8区别?底层数组+链表+红黑树,通过哈希算法确定存储位置,解决哈希冲突。JDK7:数组+链表,头插法,链表过长查询慢,存在环形链表死循环问题。JDK8:数组+链表+红黑树,尾插法,链表长度大于8且数组容量大于64转为红黑树;链表长度小于6退化为链表,查询效率大幅提升。49、HashMap为什么线程不安全?并发put会导致数据覆盖、丢失;JDK7扩容会产生环形链表,导致死循环CPU飙升;并发扩容、节点迁移都会出现线程安全问题。线程安全用ConcurrentHashMap。50、HashMap的初始容量和负载因子?默认初始容量16,默认负载因子0.75。当元素数量达到容量*负载因子时触发扩容,扩容为原容量2倍。0.75是时间和空间效率的最优平衡值。51、为什么HashMap容量必须是2的幂次?为了优化哈希取模运算,用位运算替代取模,效率更高。同时保证元素分布更均匀,减少哈希冲突。52、hashCode和equals的关系?1、两个对象equals相等,hashCode一定相等。2、两个对象hashCode相等,equals不一定相等(哈希冲突)。3、重写equals必须重写hashCode,否则集合会出现去重失效问题。53、ConcurrentHashMap的原理?JDK7采用分段锁,将集合分为多个分段,每个分段独立加锁,并发度高。JDK8放弃分段锁,采用CAS+synchronized锁,锁定链表或红黑树的头节点,锁粒度更细,并发效率更高,支持高并发读写。54、HashMap和HashTable的区别?HashTable线程安全、效率低,不允许key、value为null;HashMap线程不安全,允许一个key为null、多个value为null,效率更高。HashTable基本已淘汰。55、LinkedHashMap的特点?继承HashMap,底层维护双向链表,保留元素插入顺序或访问顺序,可以实现LRU缓存淘汰策略。56、TreeMap的特点?底层红黑树,key自动排序,支持自定义排序,key不能为null,适合需要有序键值对的场景。57、Queue和Deque的区别?Queue是单向队列,先进先出;Deque是双端队列,两端都可以增删,可做队列和栈使用,日常推荐用ArrayDeque。58、集合遍历的方式有哪些?普通for循环、增强for循环、迭代器Iterator、Lambda遍历、stream流遍历。删除元素优先用迭代器,避免并发修改异常。59、什么是并发修改异常?怎么解决?遍历集合时,其他线程或当前线程修改集合结构(增删元素),触发ConcurrentModificationException。解决:用迭代器remove方法、使用线程安全集合、遍历时不修改结构。60、Collections和Collection的区别?Collection是集合顶层接口;Collections是集合工具类,提供静态方法实现集合排序、同步、空集合创建等功能。四、异常体系(61-68题)61、Java异常体系结构?顶层父类Throwable,分为Error和Exception。Error:系统级严重错误,比如OOM、栈溢出,程序无法处理,直接崩溃。Exception:可处理异常,分为编译期受检异常、运行期非受检异常。62、受检异常和非受检异常的区别?受检异常(编译期):必须捕获或抛出,否则编译报错,比如IO异常、SQL异常。非受检异常(运行期):继承RuntimeException,编译不报错,运行抛出,比如空指针、数组越界、类型转换异常。63、try-catch-finally执行顺序?先执行try代码块,出现异常匹配catch执行,最后一定会执行finally。即使try、catch有return,也会先执行finally再返回。64、finally一定会执行吗?大部分情况会执行,极端情况不执行:JVM退出、程序强制终止、线程死亡。65、throw和throws的区别?throw:手动抛出单个异常对象,写在方法内部。throws:声明方法可能抛出的异常,写在方法签名后,可声明多个异常,交给调用者处理。66、常见的运行时异常有哪些?NullPointerException空指针、ArrayIndexOutOfBoundsException数组越界、ClassCastException类型转换异常、IllegalArgumentException参数非法异常。67、自定义异常的使用场景?系统内置异常无法满足业务需求时使用,比如账号不存在、密码错误、订单状态异常等业务异常,便于统一异常处理、业务问题精准定位。68、异常处理的最佳实践?精准捕获异常,不捕获最大父类Exception;不忽略异常,必须打印日志;业务异常自定义统一处理;finally释放资源;少用异常做业务逻辑判断。五、多线程与并发(69-85题)69、线程和进程的区别?进程:系统资源分配的最小单位,独立内存,进程间互不干扰,开销大。线程:进程内的执行单元,CPU调度最小单位,共享进程资源,开销小、切换快。70、Java创建线程的方式?1、继承Thread类;2、实现Runnable接口;3、实现Callable接口+FutureTask;4、线程池创建。推荐接口方式,避免单继承限制,线程池效率最高。71、Runnable和Callable的区别?Runnable无返回值、不抛异常;Callable有返回值、可抛出异常,适合需要获取线程执行结果的场景。72、线程的生命周期?新建、就绪、运行、阻塞、死亡五大状态。新建:创建线程对象;就绪:等待CPU调度;运行:执行run方法;阻塞:暂停执行;死亡:线程执行完毕或异常终止。73、sleep和wait的区别?1、sleep是Thread方法,wait是Object方法。2、sleep不释放锁,wait释放锁。3、sleep自动超时唤醒,wait需要notify/notifyAll唤醒。4、sleep可在任意位置使用,wait必须在同步代码块使用。74、notify和notifyAll的区别?notify随机唤醒一个等待线程;notifyAll唤醒所有等待线程,避免线程永久等待死锁,开发优先用notifyAll。75、synchronized的原理和用法?内置锁,可修饰方法、代码块,保证原子性、可见性、有序性。底层依靠对象头的锁标记、监视器锁实现,锁升级机制(偏向锁、轻量级锁、重量级锁)保证性能。76、synchronized和Lock的区别?1、synchronized是内置关键字,自动加锁释放锁;Lock是接口,手动加锁解锁。2、Lock可中断等待锁、可超时获取锁、支持读写锁,功能更灵活。3、高并发场景Lock性能更好,synchronized优化后性能差距不大。77、volatile关键字的作用?保证变量可见性、禁止指令重排,不保证原子性。适合状态标记、单例双重检查锁场景,不能替代锁做并发计数。78、什么是原子性、可见性、有序性?原子性:操作不可拆分,要么全部执行要么不执行。可见性:一个线程修改变量,其他线程立即感知最新值。有序性:程序执行顺序和代码书写顺序一致,避免指令重排。79、CAS的原理和问题?无锁乐观锁,比较并交换,先比较内存值和预期值,一致则更新,失败重试。问题:ABA问题、自旋重试消耗CPU、只能保证单个变量原子性。可通过版本号解决ABA问题。80、什么是死锁?产生条件?如何避免?死锁是多个线程互相持有对方需要的锁,互相等待,永久阻塞。四大条件:互斥、请求保持、不可剥夺、循环等待。避免:破坏循环等待条件,统一锁的获取顺序、设置锁超时、减少嵌套锁。81、线程池的核心参数?核心线程数、最大线程数、空闲超时时间、任务队列、线程工厂、拒绝策略。核心线程常驻,任务超队列容量创建非核心线程,达到最大线程数触发拒绝策略。82、线程池的拒绝策略有哪些?默认中止策略、丢弃任务、丢弃最旧任务、调用者运行策略。可自定义拒绝策略适配业务。83、为什么不推荐Executors创建线程池?内置线程池参数固定,可能出现无界队列导致OOM、最大线程数过大导致CPU爆满。生产环境必须手动创建ThreadPoolExecutor,自定义参数。84、ThreadPoolExecutor参数如何配置?CPU密集型:核心线程数=CPU核心数+1;IO密集型:核心线程数=CPU核心数*2,根据业务IO阻塞程度微调,避免线程过多切换开销。85、ThreadLocal的原理和场景?线程本地变量,每个线程独有一份变量副本,线程间互不干扰。底层是ThreadLocalMap。常用于存储用户登录信息、事务上下文、避免参数传递冗余。必须手动remove,防止内存泄漏。六、JVM基础(86-95题)86、JVM的内存区域划分?程序计数器、虚拟机栈、本地方法栈、堆、方法区(元空间)。程序计数器唯一无OOM的区域;堆是垃圾回收核心区域;元空间存储类信息、常量、静态变量。87、栈和堆的区别?栈:线程私有,速度快,存放局部变量、方法栈帧,内存自动释放。堆:线程共享,速度慢,存放对象、数组,需要GC回收,容易发生OOM。88、垃圾回收的核心思想?回收堆中没有被引用的无效对象,释放内存,避免内存溢出,自动管理内存,无需手动释放。89、判断对象存活的方式?引用计数法:计数为0则回收,无法解决循环引用。可达性分析:从GC根节点遍历,不可达对象判定为垃圾,主流JVM采用此方式。90、GC的分类和特点?MinorGC:新生代回收,频率高、速度快。MajorGC:老年代回收,速度慢、耗时久。FullGC:整堆回收,包含新生代、老年代、元空间,尽量避免,会造成系统卡顿。91、新生代和老年代的比例?默认新生代:老年代=1:2,新生代分为Eden区、两个Survivor区,比例8:1:1。92、对象的晋升机制?对象在新生代经过15次GC存活,晋升到老年代;大对象直接进入老年代;Survivor区空间不足也会触发对象晋升。93、常见的垃圾收集器?Serial、Parallel、CMS、G1、ZGC。生产环境常用G1、ZGC,低延迟、高吞吐量,适配大内存场景。94、OOM常见原因和解决思路?原因:内存泄漏、大对象过多、线程数过多、集合无限扩容、静态集合常驻内存。解决:dump内存快照分析、排查内存泄漏、优化对象创建、调整JVM参数、限制资源大小。95、类的加载过程?加载、验证、准备、解析、初始化。加载获取class文件二进制数据,验证安全性,准备初始化静态变量,解析符号引用,初始化静态代码块和静态变量。七、IO、泛型、反射(96-105题)BIO:同步阻塞,一个线程处理一个连接,并发低。NIO:同步非阻塞,多路复用,一个线程处理多个连接,高并发首选。97、NIO的核心组件?Buffer缓冲区、Channel通道、Selector选择器。缓冲区读写数据,通道传输数据,选择器监听多路IO事件。98、泛型的作用和原理?编译期类型校验,避免类型转换异常,提高代码通用性、复用性。底层采用泛型擦除机制,运行时没有泛型类型信息。99、泛型通配符?和extends、super区别??任意类型;?extends上界通配符,只能读不能写;?super下界通配符,只能写不能读,遵循PECS原则。100、反射的作用和优缺点?运行时获取类、方法、属性信息,动态调用方法、修改属性。框架底层核心(Spring、MyBatis大量使用反射)。优点:灵活、扩展性强;缺点:性能低、破坏封装、安全性差。101、Class对象的获取方式?类名.class、对象.getClass()、Class.forName(全类名),三种方式效果一致。102、IO流的分类?按方向:输入流、输出流;按数据类型:字节流(万能)、字符流(仅文本);按功能:节点流、包装流。文本文件用字符流,图片、视频、压缩包用字节流。103、序列化和反序列化?序列化:对象转字节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CSES 197-2025 T/CHTS 10233-2025炉渣填筑路基应用技术规范
- 新媒体运营人员粉丝增长与互动考核表
- 化妆品销售顾问美容护肤品行业绩效考评表
- 多维智能教育平台建设方案
- 供应链经理供应链优化效率绩效考核表
- 广宁县2025-2026学年中考数学考前最后一卷含解析
- 酒店业客房部经理服务绩效衡量表
- 皮革护理师标准化考核试卷含答案
- 智慧园区能源管理全方案管理
- 通讯技术行业项目经理研发执行KPI考核表
- 2026年高邮市消防系统事业单位公开招聘工作人员3人笔试备考题库及答案解析
- 2026年高校辅导员经典面试题(含答案)
- 2026年东阳市城管辅助人员招聘真题(附答案)
- 肉联厂屠宰人员安全防护手册
- 关于支付拖欠工程款的催办函(8篇)
- 2026八年级劳动国家质量监测考试卷含答案
- AQ3035-2010危险化学品重大危险源安全监控技术规范关键条款解读
- T∕CHCIA 013-2023 液体香氛规范
- 2025版《广东省护理病历书写管理规范(试行)》
- 银行对公营销培训课件
- 冬季安全生产综合注意事项(防冻、防滑、防火、防爆、防中毒)课件
评论
0/150
提交评论