Java高频必背面试题基础篇03

一、Java 反射机制是什么?

Java 反射机制是指在程序的运⾏过程中可以构造任意⼀个类的对象、获取任意⼀个类的成员变量和成员⽅法、获取任意⼀个对象所属的类信息、调⽤任意⼀个对象的属性和⽅法。反射机制使得 Java 具有动态获取程序信息和动态调⽤对象⽅法的能⼒。可以通过以下类调⽤反射 API。
(1)Class 类:可获得类属性⽅法;
(2)Field 类:获得类的成员变量;
(3)Method 类:获取类的⽅法信息;
(4)Construct 类:获取类的构造⽅法等信息。

二、序列化是什么?

序列化是⼀种将对象转换成字节序列的过程,⽤于解决在对对象流进⾏读写操作时所引发的问题。序列化可以将对象的状态写在流⾥进⾏⽹络传输,或者保存到⽂件、数据库等系统⾥,并在需要的时候把该流读取出来重新构造成⼀个相同的对象。

三、简述 Java 序列化与反序列化的实现。

(1)序列化:将 java 对象转化为字节序列,由此可以通过⽹络对象进⾏传输。
(2)反序列化:将字节序列转化为 java 对象。
(3)具体实现:实现 Serializable 接⼝,或实现 Externalizable 接⼝中的 writeExternal()与 readExternal()⽅法。

四、简述 Java 的 List。

List 是⼀个有序队列,在 Java 中有两种实现⽅式:
(1)ArrayList 使⽤数组实现,是容量可变的⾮线程安全列表,随机访问快,集合扩容时会创建更⼤的数组,把原有数组复制到新数组。
(2)LinkedList 本质是双向链表,与 ArrayList 相⽐插⼊和删除速度更快,但随机访问元素很慢。

五、Java 中线程安全的基本数据结构有哪些?

(1)HashTable: 哈希表的线程安全版,效率低;
(2)ConcurrentHashMap:哈希表的线程安全版,效率⾼,⽤于替代 HashTable;
(3)Vector:线程安全版 Arraylist;
(4)Stack:线程安全版栈;
(5)BlockingQueue 及其⼦类:线程安全版队列。

六、简述 Java 的 Set。

Set 即集合,该数据结构不允许元素重复且⽆序。Java 对 Set 有三种实现⽅式:
(1)HashSet 通过 HashMap 实现,HashMap 的 Key 即 HashSet 存储的元素,Value 系统⾃定义⼀个名为PRESENT 的 Object 类型常量。判断元素是否相同时,先⽐较 hashCode,相同后再利⽤ equals ⽐较,查询 O(1);
(2)LinkedHashSet 继承⾃ HashSet,通过 LinkedHashMap 实现,使⽤双向链表维护元素插⼊顺序;
(3)TreeSet 通过 TreeMap 实现的,底层数据结构是红⿊树,添加元素到集合时按照⽐较规则将其插⼊合适的位置,保证插⼊后的集合仍然有序。查询 O(logn)。

七、简述 Java 的 HashMap。

(1)JDK8 之前底层实现是数组 + 链表,JDK8 改为数组 + 链表/红⿊树。主要成员变量包括存储数据的 table 数组、元素数量 size、加载因⼦ loadFactor。HashMap 中数据以键值对的形式存在,键对应的 hash 值⽤来计算数组下标,如果两个元素 key 的 hash 值⼀样,就会发⽣哈希冲突,被放到同⼀个链表上。
(2)table 数组记录 HashMap 的数据,每个下标对应⼀条链表,所有哈希冲突的数据都会被存放到同⼀条链表,Node/Entry 节点包含四个成员变量:key、value、next 指针和 hash 值。在 JDK8 后链表超过 8 会转化为红⿊树。
(3)若当前数据/总数据容量>负载因⼦,Hashmap 将执⾏扩容操作。默认初始化容量为 16,扩容容量必须是 2的幂次⽅、最⼤容量为 1<< 30 、默认加载因⼦为 0.75。

八、为何 HashMap 线程不安全?

(1)在 JDK1.7 中,HashMap 采⽤头插法插⼊元素,因此并发情况下会导致环形链表,产⽣死循环。
(2)虽然 JDK1.8 采⽤了尾插法解决了这个问题,但是并发下的 put 操作也会使前⼀个 key 被后⼀个 key 覆盖。
(3)由于 HashMap 有扩容机制存在,也存在 A 线程进⾏扩容后,B 线程执⾏ get ⽅法出现失误的情况。

九、简述 Java 的 TreeMap。

TreeMap 是底层利⽤红⿊树实现的 Map 结构,底层实现是⼀棵平衡的排序⼆叉树,由于红⿊树的插⼊、删除、遍历时间复杂度都为 O(logN),所以性能上低于哈希表。但是哈希表⽆法提供键值对的有序输出,红⿊树可以按照键的值的⼤⼩有序输出。

十、ArrayList、Vector 和 LinkedList 有什么共同点与区别?

(1)ArrayList、Vector 和 LinkedList 都是可伸缩的数组,即可以动态改变⻓度的数组。
(2)ArrayList 和 Vector 都是基于存储元素的 Object[] array 来实现的,它们会在内存中开辟⼀块连续的空间来存储,⽀持下标、索引访问。但在涉及插⼊元素时可能需要移动容器中的元素,插⼊效率较低。当存储元素超过容器的初始化容量⼤⼩,ArrayList 与 Vector 均会进⾏扩容。
(3)Vector 是线程安全的,其⼤部分⽅法是直接或间接同步的。ArrayList 不是线程安全的,其⽅法不具有同步性质。LinkedList 也不是线程安全的。
(4)LinkedList 采⽤双向列表实现,对数据索引需要从头开始遍历,因此随机访问效率较低,但在插⼊元素的时候不需要对数据进⾏移动,插⼊效率较⾼。

十一、HashMap 和 Hashtable 有什么区别?

(1)HashMap 是 Hashtable 的轻量级实现,HashMap 允许 key 和 value 为 null,但最多允许⼀条记录的key 为 null.⽽ HashTable 不允许。
(2)HashTable 中的⽅法是线程安全的,⽽ HashMap 不是。在多线程访问 HashMap 需要提供额外的同步机制。
(3)Hashtable 使⽤ Enumeration 进⾏遍历,HashMap 使⽤ Iterator 进⾏遍历。

十二、如何决定使⽤ HashMap 还是 TreeMap?

如果对 Map 进⾏插⼊、删除或定位⼀个元素的操作更频繁,HashMap 是更好的选择。如果需要对 key 集合进⾏有序的遍历,TreeMap 是更好的选择。

十二、HashSet 中,equals 与 hashCode 之间的关系?

equals 和 hashCode 这两个⽅法都是从 object 类中继承过来的,equals 主要⽤于判断对象的内存地址引⽤是否是同⼀个地址;hashCode 根据定义的哈希规则将对象的内存地址转换为⼀个哈希码。HashSet 中存储的元素是不能重复的,主要通过 hashCode 与 equals 两个⽅法来判断存储的对象是否相同:
(1)如果两个对象的 hashCode 值不同,说明两个对象不相同;
(2)如果两个对象的 hashCode 值相同,接着会调⽤对象的 equals ⽅法,如果 equlas ⽅法的返回结果为true,那么说明两个对象相同,否则不相同。

十三、fail-fast 和 fail-safe 迭代器的区别是什么?

(1)fail-fast 直接在容器上进⾏,在遍历过程中,⼀旦发现容器中的数据被修改,就会⽴刻抛出
ConcurrentModificationException 异常从⽽导致遍历失败。常⻅的使⽤ fail-fast ⽅式的容器有HashMap 和 ArrayList 等。
(2)fail-safe 这种遍历基于容器的⼀个克隆。因此对容器中的内容修改不影响遍历。常⻅的使⽤ fail-safe ⽅式遍历的容器有 ConcurrentHashMap 和 CopyOnWriteArrayList。

十四、Collection 和 Collections 有什么区别?

(1)Collection 是⼀个集合接⼝,它提供了对集合对象进⾏基本操作的通⽤接⼝⽅法,所有集合都是它的⼦类,⽐如 List、Set 等。
(2)Collections 是⼀个包装类,包含了很多静态⽅法、不能被实例化,⽽是作为⼯具类使⽤,⽐如提供的排序⽅法:Collections.sort(list);提供的反转⽅法:Collections.reverse(list)。

十五、形参与实参区别。

(1)实参(argument)
全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
(2)形参(parameter)
全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z_凌云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值