程序员面试干货来啦,今天小编就先为大家整理出5道大厂面试时常见关于 Java 的面试题。看看你能答对几道题呢!多多掌握此类面试题,就会增加面试通过的机率哦,后续还有其他类的面试题,请持续关注哟!
1.Java.util.Map的实现类 分析:Java中的java.util.Map的实现类 1、HashMap 2、Hashtable 3、LinkedHashMap 4、TreeMap 2.说出ArrayList、Vector、LinkedList 的存储性能和特性? 答: ArrayList 和Vector都是使⽤数组⽅式存储数据,此数组元素数⼤于实际存储的数据以便增加和插⼊元素,它们都允许直接按序号索引元素,但是插⼊元素要涉及数组元素移动等内存操作,所以索引数据快⽽插⼊数据慢,Vector由于使⽤了synchronized ⽅法(线程安全),通常性能上较ArrayList 差,⽽LinkedList使⽤双向链表实现存储(将内存中零散的内存单元通过附加的引⽤关联起来,形成⼀个可以按序号索引的线性结构,这种链式存储⽅式与数组的连续存储⽅式相⽐,其实对内存的利⽤率更⾼),按序号索引数据需要进⾏前向或后向遍历,但是插⼊数据时只需要记录本项的前后项即可,所以插⼊速度较快。Vector属于遗留容器(早期的JDK中使⽤的容器,除此之外Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),现在已经不推荐使⽤,但是由于ArrayList和LinkedListed都是⾮线程安全的,如果需要多个线程操作同⼀个容器,那么可以通过⼯具类Collections中的synchronizedList⽅法将其转换成线程安全的容器后再使⽤(这其实是装潢模式*好的例⼦,将已有对象传⼊另⼀个类的构造器中创建新的对象来增加新能)。 补充:遗留容器中的Properties类和Stack类在设计上有严重的问题,Properties是⼀个键和值都是字符串的特殊的键值对映射,在设计上应该是关联⼀个Hashtable并将其两个泛型参数设置为String类型,但是Java API中的Properties直接继承了Hashtable,这很明显是对继承的滥⽤。这⾥复⽤代码的⽅式应该是HAS-A关系⽽不是IS-A关系,另⼀⽅⾯容器都属于⼯具类,继承⼯具类本身就是⼀个错误的做法,使⽤⼯具类*好的⽅式是HAS-A关系(关联)或USE-A关系(依赖) 。同理,Stack类继承Vector也是不正确的。 3.List、Map、Set 三个接⼝,存取元素时,各有什么特点? 答:List以特定索引来存取元素,可有重复元素。 Set不能存放重复元素(⽤对象的equals()⽅法来区分元素是否重复) 。 Map保存键值对(key-value pair)映射,映射关系可以是⼀对⼀或多对⼀。 Set和Map容器都有基于哈希存储和排序树(红⿊树)的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),⽽基于排序树版本的实现在插⼊或删除元素时会按照元素或元素的键(key)构成排序树从⽽达到排序和去重的效果。 4.说明类java.lang.ThreadLocal的作⽤和原理。列举在哪些程序中⻅过ThreadLocal的使⽤? 作⽤:要编写⼀个多线程安全(Thread-safe)的程序是困难的,为了让线程共享资源,必须⼩⼼地对共享资源进⾏同步,同步带来⼀定的效能延迟,⽽另⼀⽅⾯,在处理同步的时候,⼜要注意对象的锁定与释放,避免产⽣死结,种种因素都使得编写多线程程序变得困难。 尝试从另⼀个⻆度来思考多线程共享资源的问题,既然共享资源这么困难,那么就⼲脆不要共享,何不为每个线程创造⼀个资源的复本。将每⼀个线程存取数据的⾏为加以隔离,实现的⽅法就是给予每个线程⼀个特定空间来保管该线程所独享的资源。 ⽐如:在Hibernate中的Session就有使⽤。 ThreadLocal的原理 ThreadLocal是如何做到为每⼀个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有⼀个Map,⽤于存储每⼀个线程的变量的副本。 5.说说乐观锁与悲观锁 答: 两种锁各有优缺点,不可认为⼀种好于另⼀种,像乐观锁适⽤于写⽐较少的情况下,即冲突真的很少发⽣的时候,这样可以省去了锁的开销,加⼤了系统的整个吞吐量。但如果经常产⽣冲突,上层应⽤会不断的进⾏retry,这样反倒是降低了性能,所以这种情况下⽤悲观锁就⽐较合适。 希望这些面试题对你有所帮助!下一期我们会有关于其他大厂面试题。别忘了关注我们的公众号哦,预防走丢! 最后愿你前程似锦,在冬深 在初春 在夏至在秋末 在码上未来! 码上未来,成就你更好的未来!