黑马程序员技术交流社区

标题: 【上海校区】常见面试题小结 [打印本页]

作者: 18037039769    时间: 2020-2-12 10:00
标题: 【上海校区】常见面试题小结
本帖最后由 18037039769 于 2020-2-12 10:04 编辑

ArrayList实现原理要点概括ArrayList是List接口可变数组非同步实现的,允许包括null在内的所有元素
底层使用数组实现
该集合可变长度数组,数组扩容时,会将老数组中的元素重新拷贝到新数组中,每次数组容量增长大约是其容量的1.5倍
remove方法会让下标到数组末尾的元素向前移动一位

LinkedList实现原理要点概括
LinkedList是双向链表非同步实现,并允许null在内的所用元素
底层采用双向链表
prev,next,item表示上一个节点,下一个节点,和该节点的值
插入和删除快

HashMap实现原理要点概括
HsdhMap是基于Map接口的非同步实现,允许使用null值和null键,但不保证有顺序
底层使用数组实现,当发生hash碰撞的时候在数组节点上向下产生链表结构,当链表结构>8时采用红黑树结构存储数据。
HashMap底层时key-value当成一个整体,这个整体就是一个Node对象,底层采用Node[]保持key-value对象。
根据key的hash算法来决定在数组中的位置。当去取数据的时也是根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Node
HashMap扩容后需要重新计算每个元素在数组中的位置

Hashtable实现原理要点概括
Hashtable是基于哈希表的Map接口的同步实现,不允许使用null值和null键
底层使用数组,数组每一项是个单链表,即数组和链表的结合体
Hashtable在底层将key-value当成一个整体进行处理。
synchronized是针对整张Hash表的,即每次锁住整张表让线程独占

ConcurrentHashMap实现原理要点概括
ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用锁分离技术
它使用了多个锁来控制对hash表的不同段进行修改
每段其实就是一个小的hashtable,他们有自己的锁,只要并发发生在不同的段上,他们就可以并发进行
与HashMap不同的是,ConcurrentHashMap使用多个子Hash表,也就是段(Segment)
ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁。如果使用传统的技术,如HashMap中的实现,如果允许可以在hash链的中间添加或删除元素,读操作不加锁将得到不一致的数据。ConcurrentHashMap实现技术是保证HashEntry几乎是不可变的。

为什么要使用代理模式?
答:代理模式为其他对象提供一种代理以控制对这个对象的访问,代理对象可以在客户端和目标对象之间起到一个中介作用。
比如我有一套房子要卖,但是我人在外地不能随时去带领客人去看房子,那我就需要一个中介,这个中介就相当于一个代理对象,
他有我赋予他的权力的同时还能增强自己的功能,比如过滤一些不是好的买家。最后将结果给我就好了。
代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,


讲讲静态代理模式的优点及其瓶颈?

静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。没有扩展性,指定代理类
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。


对java接口代理模式的实现原理的理解?
代理模式一般分为动态代理和静态代理,
静态代理指定了代理对象代理类和目标对象后只需要关注业务逻辑本身,保证了业务类的重要性
然而动态代理,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理,
动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法
动态代理







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2