志在指尖
用双手敲打未来

java面试题(java中高级面试题及答案)

java面试题

1.Collections.sort排序内部原理
Java6Arrays.sort()和Collections.sort()中使用MergeSort,在Java7中,内部实现被TimSort代替,这需要对对象之间的比较进行更严格的实现
2.HashMap原理,java8所做的更改
在结构实现方面,HashMap是通过数组+链表+红黑树(JDK1.8添加了红黑树部分)实现的。HashMap仅允许一个记录的键最多为空,而允许多个记录的值为空。HashMap不是线程安全的。ConcurrentHashMap是线程安全的。解决冲突:发生冲突时,请使用zipper方法在单链接列表中链接其关键字为同义词的节点。哈希表的长度为m,定义了一个由m个头指针组成的指针数组T,并将地址为i的节点插入到以T(i)作为头指针的单链表中。在Java8中,冲突元素超出了限制(8),并且链表被一棵红黑树取代。
3.String和StringBuilder之间的区别
1)可变且不可变:字符串不可变,并且每次执行“+”时都会生成一个新对象。因此,在频繁更改字符串以节省内存的情况下,不使用String。
2)是否是多线程安全的:StringBuilder不会向该方法添加同步锁,因此它不是线程安全的。StringBuffer和String都是线程安全的。
4.向量和数组的区别
1)当内存不足时,默认情况下ArrayList扩展50%+1,默认情况下Vector扩展1倍。
2)Vector属于线程安全级别,但是在大多数情况下,由于线程安全需要更大的系统开销,因此不使用Vector。java面试题
5.HashMap和Hashtable之间的区别
1)历史原因:Hashtable继承了Dictonary类,HashMap继承了abstractMap
2)HashMap允许空键/值对,但最多只能有一个空对象,而HashTable则不允许。
3)HashTable已同步,而HashMap未同步,这比HashTable更有效
6.ConncurrentHashMap和哈希表比较(两个线程同时访问映射中的同一链,一个线程在尾部删除,一个线程遍历并在前面找到它。请问为什么上一个线程可以正确地找到被删除的节点另一个线程稍后)
ConcurrentHashMap结合了hashtable和hashmap的优点。Hashtable是同步的,即线程安全的,并且hashmap不考虑同步。因此,哈希映射在单线程情况下更为有效。在哈希表有多个线程的情况下,同步操作可以确保程序执行的正确性。但是哈希表正在阻塞,并且每次同步执行时都必须锁定整个结构。ConcurrentHashMap诞生是为了解决这个问题。
ConcurrentHashMap允许同时执行多个修改操作。关键在于使用锁分离技术(一个数组保存多个对象,这些对象的锁用作单独的锁,并且在获取/放置时随机使用任何一个)。它使用多个锁来控制哈希表不同部分的修改。在JDK1.6中,有一个HashEntry结构。每次插入新添加的节点作为链的头节点(使用HashMap实现),并且每次删除节点时,在删除的节点之前的所有节点的副本将形成一个新链,并指向当前节点的前一个节点的下一个节点到当前节点的下一个节点,因此删除后有两个链,因此可以确保即使在同一链中,一个线程也要删除,而另一个线程遍历,它们都工作良好,因为遍历的线程可以继续使用原始链。
在Java8中,易失性HashEntry用于存储数据,而表元素用作锁。从表数组+单链列表中添加了红黑树。红黑树是一种特殊的二叉搜索树,具有以下特征:1.节点为红色或黑色2.根节点为黑色3.叶节点为黑色4.一个节点为红色,然后叶节点为黑色5。一个从一个节点到其子孙的所有路径上的黑色节点数相同。
更多面试题及答案:https://www.jianshu.com/p/ce1fb8497883

java中高级面试题及答案

列表和集合比较,各自子类的比较
比较1:比较Arraylist和LinkedList
1.ArrayList实现基于动态数组的数据结构,因为地址是连续的,所以一旦存储了数据,查询操作效率就会更高(它们被放置在内存中)。
2.由于地址是连续的,因此ArrayList需要移动数据,因此插入和删除操作的效率较低。
3.LinkedList基于链表的数据结构。该地址是任意的,因此在打开存储空间时无需等待连续地址。对于添加和删除操作,LinedList更具优势。
4.由于LinkedList需要移动指针,因此查询操作性能较低。
应用场景分析:
当需要访问数据时,使用ArrayList;当需要多次添加和删除数据时,使用LinkedList。
比较2:ArrayList和Vector的比较
1.向量方法都是同步且线程安全的,而ArrayList方法则不是,因为线程同步将不可避免地影响性能。因此,ArrayList的性能优于Vector。
2.当Vector或ArrayList中的元素超过其初始大小时,Vector会将其容量加倍,而ArrayList仅将其大小增加50%,因此。ArrayList有利于节省内存空间。
3.在大多数情况下不使用Vector,因为它的性能不好,但是它支持线程同步,也就是说,一次只能有一个线程可以写入Vector,以避免由于多个线程同时写入而导致的不一致。
4.向量可以设置增长因子,但是ArrayList不能。
应用场景分析:
1.向量是线程同步的,因此它也是线程安全的,而ArrayList是线程异步的并且是不安全的。如果不考虑线程安全性,则ArrayList通常更有效。
2.如果集合中元素的数量大于当前集合数组的长度,则在集合中使用相对大量的数据比使用Vector具有某些优势。java面试题
比较3:HashSet和TreeSet的比较
1.TreeSet由二叉树实现。Treeset中的数据会自动排序,并且不允许使用null值。
2.HashSet由哈希表实现。HashSet中的数据是无序的,可以放入null,但是只能放入一个null,并且不能重复两个中的值,就像数据库中的唯一约束一样。
3.HashSet要求放入的对象必须实现HashCode()方法。放置对象由哈希码标识,对于内容相同的String对象,哈希码相同,因此无法重复内容。但是同一类的对象可以放在不同的实例中。
应用场景分析:
HashSet是基于Hash算法实现的,其性能通常优于TreeSet。我们通常应该使用HashSet,仅在需要排序功能时才使用TreeSet。
HashMap和ConcurrentHashMap之间的区别
1.HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。
2.ConcurrentHashMap使用锁分段技术对整个哈希桶进行分段,即将这个大数组划分为几个小段,每个小段都有一个锁,然后在插入元素时,您需要找到哪个段应该是插入,然后将其插入到此段上,在这里您需要获取段锁。
3.ConcurrentHashMap使锁的粒度更细,并发性能更好。
HashTable和ConcurrentHashMap之间的区别
它们都可以在多线程环境中使用,但是当Hashtable的大小增加到一定程度时,性能将急剧下降,因为在迭代过程中需要长时间锁定它。因为ConcurrentHashMap引入了分段,所以无论分段有多大,它都只需要锁定地图的特定部分,其他线程不需要等待迭代完成就可以访问地图。简而言之,在迭代过程中,ConcurrentHashMap仅锁定地图的特定部分,而Hashtable锁定整个地图。
String,StringBuffer和StringBuilder之间的区别
1.在这方面,运行速度或执行速度:StringBuilder>StringBuffer>String。
2.就线程安全而言,StringBuilder是线程不安全的,而StringBuffer是线程安全的。
应用场景分析:
字符串:适用于少量的字符串操作
StringBuilder:适用于单个线程下字符缓冲区中的大量操作
StringBuffer:适用于多线程下字符缓冲区中的大量操作
更多面试题及答案:https://blog.csdn.net/zoucanfa/article/details/79559869

未经允许不得转载:IT技术网站 » java面试题(java中高级面试题及答案)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载