持续坚持原创输出,点击蓝字关注我吧
作者:小傅哥博客:https://bugstack.cn
❝沉淀、分享、成长,让自己和他人都能有所收获!?
❞
一、前言
二、面试题
三、Collections 工具类
1. Collections.sort 排序
2. Collections.binarySearch 二分查找
3. Collections.shuffle 洗牌算法
4. Collections.rotate 旋转算法
5. 其他API介绍
四、总结
五、系列推荐
好的算法搭配上合适的数据结构,可以让代码功能大大的提升效率。当然,算法学习不只是刷题,还需要落地与应用,否则到了写代码的时候,还是会+。
当开发一个稍微复杂点的业务流程时,往往要用到与之契合的数据结构和算法逻辑,在与设计模式结合,这样既能让你的写出具有高性能的代码,也能让这些代码具备良好的扩展性。
「那么」,有了这些数据结构的基础,接下来我们再学习一下Java中提供的算法工具类,。
,今天怎么无精打采的呢,还有黑眼圈?
「答」:好多知识盲区呀,最近一直在努力补短板,还有面经手册里的数据结构。
「问」:那数据结构看的差不多了吧,你有考虑?过,数据结构里涉及的排序、二分查找吗?
「答」:二分查找会一些,巴拉巴拉。
「问」:还不错,那你知道这个方法在Java中有提供对应的工具类吗?是哪个!
「答」:这!?好像没注意过,没用过!
「问」:去吧,回家在看看书,这两天也休息下。
飞机悄然的出门了,但这次面试题整体回答的还是不错的,面试官决定下次再给他一个机会。
,是java集合框架的一个工具类,主要用于提供的通用算法;排序、二分查找、洗牌等算法操作。
「Collections.sort」
「Collections.indexedBinarySearch(list, key)」:
以上这段代码就是通过每次折半二分定位元素,而上面所说的耗时点就是,这在我们分析数据结构时已经讲过。《LinkedList插入速度比ArrayList快?你确定吗?》
「Collections.iteratorBinarySearch(list, key)」:
上面这段代码是元素数量大于5000个,同时是 LinkedList 时会使用迭代器 的方式进行二分查找操作。也算是一个优化,但是对于链表的数据结构,仍然没有数组数据结构,二分处理的速度快,主要在获取元素的时间复杂度上O(1) 和 O(n)。
3. Collections.shuffle 洗牌算法
「洗牌算法」,其实就是将 List 集合中的元素进行打乱,一般可以用在抽奖、摇号、洗牌等各个场景中。
3.1 功能使用
它的使用方式非常简单,主要有这么两种方式,一种直接传入集合、另外一种还可以传入固定的随机种子这种方式可以控制洗牌范围范围
3.2 源码分析
按照洗牌的逻辑,我们来实现下具体的核心逻辑代码,如下;
「运行结果:」
4.1 功能应用
这里我们将集合顺序;,顺时针旋转2位,测试结果如下;逆时针旋转为负数
「测试结果」
- Arraylist 或者元素数量不多时,,则通过算法实现。
- 如果是 LinkedList 元素数量又超过了 ROTATE_THRESHOLD,则需要使用算法实现。
「那么」,这两个算法有什么不同呢?
4.2.1 旋转算法,rotate1
这部分代码看着稍微多一点,但是数组结构的操作起来并不复杂,基本如上面圆圈图操作,主要包括以下步骤;
- ,获取旋转的位置。
- for循环和dowhile,配合每次的旋转操作,比如这里第一次会把0位置元素替换到2位置,接着在dowhile中会判断,满足条件继续把替换了2位置的元素继续往下替换。直到一轮循环把所有元素都放置到正确位置。
- 最终list元素被循环替换完成,也就相当从某个位置开始,正序旋转2个位置的操作。
4.2.2 旋转算法,rotate2
接下来这部分源码主要是针对大于个元素的LinkedList进行操作,所以整个算法也更加有意思,它的主要操作包括;
- 定位拆链位置,-distance % size + size,也就是我们要旋转后找到的元素位置
- 第一次翻转,把从位置0到拆链位置
- 第二次翻转,把拆链位置到结尾
- 第三次翻转,翻转整个链表
5.1 最大最小值
- 工具包可以进行最值的获取。
5.2 元素替换
- 可以把集合中某个元素全部替换成新的元素。
5.3 连续集合位置判断
在使用String操作中,我们知道,可以获取某个元素在什么位置。而在集合操作中,可以获取连续的元素,在集合中的位置。
5.4 synchronized
- 这个很熟悉吧,甚至经常使用,但可能会忽略这些线程安全的方法来自于 集合工具包。
- 本章节基本将工具包中的常用方法介绍完了,以及一些算法的讲解。这样在后续需要使用到这些算法逻辑时,就可以直接使用并不需要重复造轮子。
- 学习数据结构、算法、设计模式,这三方面的知识,重点还是能落地到日常的业务开发中,否则空、假、虚,只能适合吹吹牛,并不会给项目研发带来实际的价值。
- 懂了就是真的懂,别让自己太难受。死记硬背谁也受不了,耗费了大量的时间,知识也没有吸收,学习一个知识点最好就从根本学习,不要心浮气躁。
- DDD领域驱动设计落地方案
- 重学Java设计模式(22个真实开发场景)
- 面经手册(上最快的车,拿最贵的offer)
- 字节码编程(非入侵式全链路监控实践)
bugstack虫洞栈
沉淀、分享、成长,让自己和他人都能有所收获!