JavaSE核心技术(续)
Java基础与OOP模块
7. 什么是自动拆装箱?Integer 的缓存机制(-128~127)了解吗?
自动装箱:
基本类型 → 包装类,编译器自动调用 valueOf()将基本类型包装成对象
自动拆箱:
包装类 → 基本类型,编译器自动调用 xxxValue()将对象里的东西拿出来
Integer.valueOf() 取值时:-128~127复用缓存对象;超出范围新建对象;new Integer永远新建,不走缓存。
8. final、finally、finalize 三者有什么区别?
final(关键字)
final类:不能被继承
final方法:不能重写,可以重载
final变量:只能赋值一次,引用不可变
finally(关键字,异常的时候用)
try-catch-finally fianlly里的一定会执行
finalize() Object里的方法,已废弃了
9. Java 是值传递还是引用传递?方法参数传递的本质是什么?
Java是值传递
基本数据类型: 传的是数值的拷贝。方法里改形参,不影响外面原变量。
引用类型: 传的是对象地址的拷贝。传参是把地址复制一份给形参。
本质:所有传参,都是复制一份实参的值(要么是数据、要么是地址)给方法的形参。
10. 什么是浅拷贝和深拷贝?如何实现深拷贝?
-
浅拷贝:
新对象是新的;但引用类型的,只复制地址,共用同一个子对象。
改新对象里子对象的数据 → 原对象的子对象也跟着变。Object.clone() 默认就是浅拷贝!
-
深拷贝
从头到尾全部新建:新对象 + 它所有引用的子对象、子子对象……全是新的。
新旧对象互不影响。实现深拷贝3种方式:
- 重写 clone()
- 对象序列化→反序列化生成新对象
- 手动new每一个子对象,逐字段赋值
11 Java 集合框架的基本接口有哪些?
集合分为两大根接口:Collection 和 Map。
Collection: 存储单个对象,包含三个子接口:
- List:有序、可重复,带有索引;
- Set:无序、不可重复;
- Queue:队列,先进先出。
Map: 存储 key-value 键值对,key 不允许重复
实现类:HashMap、TreeMap
12 ArrayList 和 LinkedList 的区别及适用场景?
底层:ArrayList 底层是动态数组;LinkedList 底层双向链表。
特性:
-
ArrayList 根据索引查询速度快;在数组中间位置增删元素需要移动大量元素,速度慢。
-
LinkedList 查询需要从头遍历,查询慢;在首尾位置增删只修改节点指针,速度快。
适用场景:
ArrayList 适合大量查询、少量增删;
LinkedList 适合大量首尾增删、查询较少。
总结:数组查快中间增删慢;链表首尾增删快,随机查询慢。
13 HashMap 的底层原理是什么?JDK 8 为什么引入红黑树?
DK8 HashMap 底层是数组 + 链表 + 红黑树。
put 流程:
根据 key 算出 hash 值,定位数组下标。如果下标位置为空,直接存放;如果已有元素,发生哈希冲突。key 相同就覆盖 value;key 不同挂载到链表上。链表长度 >=8 并且数组长度 >=64 时,链表转为红黑树;红黑树节点减少到 6,退化为链表。
引入红黑树原因:冲突严重时链表过长,遍历查询时间复杂度 O (n)。红黑树增删查是 O (logn),提升大数据量下查询性能。
作者:bingbing-blog
出处:http://www.cnblogs.com/bingbing-blog/
本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

浙公网安备 33010602011771号