- 什么是抽象类 什么是接口 (0.5d)
- ArrayList 和 linkedList区别 (1d)
- 你对HashMap了解吗 ?介绍一下它的底层数据结构,它是如何减少hash冲突的 什么时候变为链表 ?什么时候变为红黑树 ?负载因子是多少 ?(1.5d)
- HashSet的底层数据结构介绍一下?(0.5d)
一:1.抽象类是java中一种特殊的类,并不能实例化,提高了代码的复用性和实现多态,在抽象类中可以定义抽象方法和非抽象方法,但没有具体的方法实现体。接口也是一种特殊的类,它只包含常量和抽象方法。与抽象类不同,接口可以被实现,并且实现类必须实现接口中的方法。一个类只可以继承一个抽象类,但能有多个接口。
抽象类一些实用场景:
1.抽象类可以定义一些通用性的行为,例如在一个图形界面库中的图形组件的抽象父类中定义一些通用行为,如移动、重绘等。
2.共享代码的实现:比如在一个游戏中,玩家的生命,属性,以及装备这些都可以在不同的角色中复用。
3.约束和规范:有些时候,必须指定哪些接口和使用哪些数据结构。
4.代码的组织和结构:有时候,我们希望将一些相关的类组织在一起,形成一个结构化的代码结构。例如,在一个电子商务系统中,可以有一个抽象的订单类,它包含订单的基本属性和行为,然后根据不同的业务场景,可以定义不同的子类,如普通订单、促销订单等。这些子类都继承自订单类,因此它们都具有订单的基本属性和行为,同时也具有各自特殊的属性和行为。
二:ArrayList和linkedList都是java中的集合类,都实现了List的接口,ArrayList是基于可变的动态数组实现的,它可以动态的调整大小,ArrayList的默认大小为10个元素。当ArrayList中的元素数量超过了内部数组的容量时,它会自动扩容,将内部数组的大小增加一倍。具体来说,当ArrayList中的元素数量达到了容量的一半(即capacity/2)时,它会自动扩容,将内部数组的大小增加一倍。扩容操作是通过重新分配内部数组的大小并逐个复制元素来实现的。arraylist的查询比linkedlist更高效,因为ArrayList是基于数组实现的,可以随机访问元素,所以在进行查询操作时,可以通过给定的索引直接定位到元素的位置,时间复杂度为O(1)。而LinkedList则是基于链表实现的,在查询元素时需要从头节点开始遍历到目标节点,时间复杂度为O(n)。
三:hashmap是基于数组和链表/红黑树来实现的,在发生map执行put操作时,会针对key执行hash.code()方法,计算出hash值,并向右位移十六位,得出一个新的二级制,针对新的二进制和旧的二级制进行异或运算,得出在数组中的位置,如果发生hash冲突,即在那个位置上有相应的值,首先遍历链表/红黑树,若key一样代替,斌返回旧的value值,若不一样,原来的链表中的节点next指针指向他。当链表长度大于8且数组长度大于64时(防止数据过小,转换红黑树的消耗比原有的数据更多),就会变成红黑树的形式,退链则是红黑树长度小于6时(因为留个7的中间值能减少频繁的转链操作)。负载因子为0.75,扩容是原来的二倍。
四:hashset是基于hash表来实现的。哈希表:
- JDK8之前,底层采用数组+链表实现。
- JDK8以后,底层进行了优化。由数组+链表+红黑树实现。
文章介绍了Java中的抽象类和接口的概念及其应用场景,包括抽象类不能实例化、提高代码复用性,以及接口的常量和抽象方法。接着,对比了ArrayList和LinkedList两种集合类的实现方式和查询效率。此外,详细阐述了HashMap的底层数据结构,包括如何处理哈希冲突,何时转换为链表或红黑树,以及负载因子的设定。最后提到了HashSet的实现原理。

被折叠的 条评论
为什么被折叠?



