一读小说 » 都市言情 » 蓝星文娱:从微末崛起的娱乐大亨 » 第十一章(集合框架篇)2024年Java求职面试与工作编程要点实录

第十一章(集合框架篇)2024年Java求职面试与工作编程要点实录

    【Java集合框架的3个核心问题】

    1、比较ArrayList、LinkedList和Vector的异同?

    2、谈谈HashMap和TreeMap的实现原理?

    3、如何选择合适的集合类?

    ……

    第四篇:集合框架(3个)

    1、比较ArrayList、LinkedList和Vector的异同?

    相同点:

    三者都实现了List接口,存储数据的方式都是基于动态数组的形式。

    当元素数量超过当前数组长度时,会在内存中分配一块更大的内存…

    将原有数组中的数据复制过去,释放原数组,然后将新元素放到新数组中。

    不同点:

    1)ArrayList和Vector是动态数组,LinkedList是双向链表。

    2)ArrayList和Vector支持随机访问元素,而LinkedList不支持。

    3)ArrayList在内存不足时,扩容为原来的1.5倍,Vector扩容为原来的2倍。

    而LinkedList在内存上更加优化,因为LinkedList的节点不需要连续存储。

    4)ArrayList和LinkedList不是线程安全的,而Vector是线程安全的。

    …

    2、谈谈HashMap和TreeMap的实现原理?

    HashMap和TreeMap,是Java中两种常用的Map实现。

    它们各自有着,独特的实现原理和使用场景。

    一、HashMap:

    HashMap是基于哈希表实现的Map接口。

    它允许使用null键和null值。

    HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。

    HashMap的实例,有两个参数影响其性能,即初始容量和加载因子。

    初始容量,是哈希表在创建时的容量;

    加载因子,是哈希表在其容量自动增加之前,可以达到多满的一种尺度。

    当哈希表中的条目数,超过了加载因子与当前容量的乘积时…

    哈希表就会进行rehash操作;

    也就是创建一个新的数组,然后将原数组中的数据,重新映射到新数组中。

    HashMap的核心数据结构,是一个Node数组。

    每个Node,都保存了键值对信息,以及指向下一个Node的引用。

    在HashMap中,通过key的hashCode经过一定的计算后得到数组下标…

    然后,在对应的数组位置上,进行存储。

    如果,计算出的数组下标位置,已经存在元素,那么就在这个位置形成链表。

    当链表长度太长(默认是8)时,链表就转换为红黑树,这样可以大大提高查询的效率。

    二、TreeMap:

    TreeMap是基于红黑树实现的Map接口。

    它根据键的自然顺序,对键进行排序;

    或者根据创建TreeMap时,提供的Comparator进行排序,具体取决于使用的构造方法。

    TreeMap不允许使用null键。

    红黑树,是一种自平衡的二叉查找树;

    通过对任何一条,从根到叶子的路径上,各个节点着色的方式的限制;

    红黑树确保从根到叶子的最长的可能路径,不会超过最短可能路径的两倍长。

    这种特性,使得红黑树在插入、删除和查找操作中,都保持了相对稳定的性能。

    在TreeMap中,每个键都关联一个值。

    你可以使用put(key,value)方法,将键值对添加到映射中;

    使用get(key)方法,获取与指定键关联的值。

    TreeMap的键集合(keySet方法返回)按照键的排序顺序(升序或降序)进行迭代。

    TreeMap的键和值都不能为null。

    三、综上所述

    HashMap和TreeMap的主要区别,在于其内部实现机制、性能特点以及使用场景。

    HashMap适用于需要快速插入、删除和查找的场景。

    而TreeMap,则适用于需要按照键的排序顺序,进行操作的场景。

    …

    3、如何选择合适的集合类?

    在Java中,选择合适的集合类,对于程序的性能和正确性至关重要。

    Java提供了丰富的集合类,每种集合类都有其特定的用途和性能特点。

    以下是选择合适集合类的四点建议:

    一、Lis

    1)ArrayLis

    适用于需要频繁访问元素(通过索引)的场景。

    ArrayList在内存中连续存储元素,因此随机访问速度快。

    但是,插入和删除元素(特别是在列表中间)时…

    可能需要移动大量元素,因此性能较差。

    2)LinkedLis

    适用于,需要频繁在列表中间,插入或删除元素的场景。

    LinkedList使用链表结构存储元素,因此插入和删除元素的操作复杂度为O(1)。

    但是,随机访问元素的速度较慢,因为需要从头节点开始遍历。

    3)Vector

    与ArrayList类似…

    但Vector,是线程安全的,因此性能相对较低。

    如果,你需要线程安全的List…

    可以考虑使用Collections.synchronizedList方法包装ArrayList,或其它List实现。

    二、Se

    1)HashSe

    适用于需要快速查找元素的场景。

    HashSet基于哈希表实现,插入、删除和查找操作的平均时间复杂度为O(1)。

    但是,HashSet不保证元素的迭代顺序。

    2)LinkedHashSe

    如果你既需要快速的查找操作,又需要保持元素的插入顺序,可以选择LinkedHashSet。

    LinkedHashSet在内部使用链表维护元素的插入顺序。

    3)TreeSe

    如果你需要对集合中的元素进行排序,可以选择TreeSet。

    TreeSet基于红黑树实现,可以自动对元素进行排序。

    三、Queue

    1)LinkedLis

    除了作为List使用外,LinkedList还可以作为队列(Queue)使用。

    它提供了add、remove、offer、poll等方法来实现队列的基本操作。

    2)PriorityQueue

    如果你需要一个能够自动对元素进行排序的队列,可以选择PriorityQueue。

    PriorityQueue基于堆实现,可以提供O(logn)的插入和删除操作。

    四、Map

    1)HashMap

    适用于需要快速查找键值对的场景。

    HashMap基于哈希表实现,提供了O(1)的平均查找时间。

    但是,HashMap不保证键值对的迭代顺序。

    2)LinkedHashMap

    如果,你既需要快速的查找操作,又需要保持键值对的插入顺序,或访问顺序…

    可以选择LinkedHashMap。

    3)TreeMap

    如果你需要对键进行排序,可以选择TreeMap。

    TreeMap基于红黑树实现,可以自动对键进行排序。

    4)ConcurrentHashMap

    如果,你需要在多线程环境下使用Map,并且需要保证线程安全和高性能…

    那么你可以选择ConcurrentHashMap。

    综上所述:

    在选择集合类时,还需要考虑集合的大小、元素是否可变、是否需要排序或保持插入顺序等因素。

    同时,也要注意避免,不必要的装箱和拆箱操作(例如在泛型集合中存储基本数据类型时),因为这可能会影响程序的性能。

    ……

    以上,就是今天的分享啦!

    希望,对你有那么一点点、一丢丢、一戳戳地帮助哈~

    所以哩…

    评论、收藏、关注一键三连可好?

    推荐票、月票、打赏,好伐?!

    嘻嘻…