ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长。类似于C语言中的动态申请内存,动态增长内存。
当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。ArrayList在保留数组可以快速查找优势的基础上,还解决了自动扩容问题。
Posted by Wei on 2019-05-15, Last Modified on 2025-08-11
数组(Array),是线性表一种实现方式,用于存储逻辑关系为“一对一”的数据。
数组存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。
**算法(Algorithm)**是解决特定问题求解步骤的的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
对于给定的问题,是可以有多种算法来解决的。
数据(Data):从计算机的角度来看,数据是所有能被输入到计算机中且能被计算机处理的符号的集合。它是计算机操作的对象的总称,也是计算机处理信息的某种特定的符号表示形式(二进制码的抽象表示?)。
数据对象:数据对象是性质相同的数据元素的集合,是数据的子集。 什么叫性质相同呢,是指数据元素具有相同数量和类型的数据项,比如,人都有姓名、生日、性别等相同的数据项。
数据元素(Data Element):数据元素是数据中的一个个体,是数据的基本单位,在计算机中通常作为一个整体来进行考虑和处理。
数据项(Data Object):一个数据元素可以由多个数据项组成。数据项是具有独立含义的数据最小单位。
Posted by Wei on 2019-05-14, Last Modified on 2025-08-11
基本概念
线性表(List):由零个或多个数据元素组成的有限序列。
如果用数学语言来进行定义,可如下:
若将线性表记为(a1,…,ai-1,ai,ai+1,…an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
数组,链表、队列、栈等都是线性表结构。
而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。
我们知道,数据之间的关系有 3 种,分别是 “一对一”、“一对多” 和 “多对多”,前两种关系的数据可分别用线性表和树结构存储,本节学习存储具有"多对多"逻辑关系数据的结构——图存储结构。
Posted by Wei on 2019-05-14, Last Modified on 2023-03-23
String[] strs = {"apple",...}; Map<String, Integer> map = new HashMap<String, Integer>(); for (String str : strs) { if (map.containsKey(str)) { Integer integer = map.get(str); integer++; map.put(str, integer); } else { map.put(str, 1); } } for (Map.Entry<String, Integer> me : map.entrySet()) { String strKey = me.getKey(); Integer iCount = me.getValue(); System.out.println(strKey + "出现了" + iCount + "次"); }
选择排序的思路是这样的:首先,找到数组中最小的那个元素,其次,将它和数组的第 一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。
这种方法叫做选择排序(Selection Sort),因为它在不断地选择剩余元素之中的最小者。
如下所示,选择排序的内循环只是在比较当前元素与目前已知的最小元素(以及将当前索引加 1 和检查是否代码越界),这已经简单到了极点。交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是 N 。所以算法的时间效率取决于比较的次数。
二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一个猜字游戏。我随机写一个 0 到 99 之间的数字,然后你来猜我写的是什么。猜的过程中,你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为止。你来想想,如何快速猜中我写的数字呢?
假设我写的数字是 23,你可以按照下面的步骤来试一试(如果猜测范围的数字有偶数个,中间数有两个,就选择较小的那个)。
7 次就猜出来了,是不是很快?这个例子用的就是二分思想,按照这个思想,即便我让你猜的是 0 到 999 的数字,最多也只要 10 次就能猜中。不信的话,你可以试一试。
这是一个生活中的例子,我们现在回到实际的开发场景中。假设有 1000 条订单数据,已经按照订单金额从小到大排序,每个订单金额都不同,并且最小单位是元。我们现在想知道是否存在金额等于 19 元的订单。如果存在,则返回订单数据,如果不存在则返回 null。
最简单的办法当然是从第一个订单开始,一个一个遍历这 1000 个订单,直到找到金额等于 19 元的订单为止。但这样查找会比较慢,最坏情况下,可能要遍历完这 1000 条记录才能找到。而使用二分查找就能更快速地解决。
Posted by Wei on 2019-05-13, Last Modified on 2025-08-11
过滤条件:ssl && ip.addr == 180.101.53.2 && tcp.port == 55583
ssl && ip.addr == 180.101.53.2 && tcp.port == 55583
🐒 Software engineer | 📷 Photographer | 👹 Urban explorer