- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Java面试题大全(含答案)
一、Java基础语法
Java中值传递和引用传递的区别?Java是值传递还是引用传递?
答案:
publicstaticvoidmain(String[]args){
inta=10;
changeInt(a);//传值,a还是10
Useruser=newUser(张三);
changeUser(user);//传引用的值副本,user的name变成李四
changeUserPoint(user);//修改副本指向,原user还是指向原来的对象
}
staticvoidchangeInt(intnum){num=20;}
staticvoidchangeUser(Useru){u.setName(李四);}
staticvoidchangeUserPoint(Useru){u=newUser(王五);}
值传递:传递的是变量的“副本”,修改副本不会影响原变量(如基本类型int、char);
引用传递:传递的是对象地址的“副本”,但地址指向同一个对象,修改副本指向的对象内容会影响原对象。
Java只有值传递!比如传递对象时,实际传的是对象引用的“值副本”——若在方法里修改“副本的指向”(如new一个新对象),原对象不会变;但修改“副本指向的对象内容”(如给对象的属性赋值),原对象会变。
举例:
String、StringBuilder、StringBuffer的区别?
答案:
String:不可变(底层是final修饰的char数组/JDK1.9后是byte数组),拼接字符串会产生新对象(如a+b实际是newStringBuilder().append(a).append(b).toString()),效率低,适合字符串不频繁修改的场景;
StringBuilder:可变,线程不安全,无同步锁,效率比StringBuffer高,适合单线程下频繁修改字符串;
StringBuffer:可变,线程安全(方法加了synchronized),效率低,适合多线程下频繁修改字符串。
二、Java集合框架
ArrayList和LinkedList的区别?
答案:
维度
ArrayList
LinkedList
底层结构
动态数组(初始容量10)
双向链表(JDK1.6前是循环链表)
访问效率
随机访问快(O(1))
随机访问慢(O(n))
增删效率
尾部增删快(O(1)),中间增删慢(需复制数组,O(n))
任意位置增删快(只需改指针,O(1))
内存占用
有扩容冗余(默认扩容1.5倍)
每个节点存前后指针,内存占用更高
适用场景
频繁查、少增删
频繁增删、少查询
HashMap的底层原理?JDK1.7和1.8有什么区别?
答案:
JDK1.7vs1.8区别:
维度
JDK1.7
JDK1.8
底层结构
数组+链表
数组+链表+红黑树
哈希计算
多次扰动(4次位运算+5次异或)
1次扰动(hashCode^(hashCode16))
扩容机制
头插法(会导致链表循环)
尾插法(避免循环)
阈值判断
先判断是否需要扩容,再插入
先插入,再判断是否扩容
红黑树
无
有(优化查询效率,O(logn))
核心功能:存储键值对,允许key为null(仅1个)、value为null,无序(不保证插入顺序)。
底层结构(JDK1.8):数组+链表+红黑树(当链表长度8且数组长度64时,链表转红黑树;当链表长度6时,红黑树转链表)。
哈希冲突解决:链地址法(数组下标由key的hashCode()计算,冲突时挂在同一数组元素的链表/红黑树下)。
ConcurrentHashMap为什么是线程安全的?JDK1.7和1.8的实现区别?
答案:
JDK1.7实现:
JDK1.8实现:
核心目标:解决HashMap线程不安全(并发扩容死循环、数据覆盖)问题,同时比Hashtable(全表锁)效率高。
底层:分段数组(Segment)+哈希表(每个Segment是一个小HashMap);
线程安全:基于“分段锁”(锁定单个Segment,其他Segment可并发访问),锁粒度比Hashtable小,效率高。
底层:数组+链表+红黑树(和HashMap结构一致);
线程安全:去掉Segment,改用“CAS+Synchronized”(锁定数组元素的链表头/红黑树根节点),锁粒度更细(
文档评论(0)