java - 应用程序中的可修改列表使用什么数据结构?

标签 java android list arraylist time-complexity

在某些应用中,您有项目列表,您可以在其中移动项目、删除项目、添加或插入项目等。

通常我会说 ArrayList 可以工作,但显然很多操作都是线性时间。

大多数人都使用更好的数据结构吗?

最佳答案

如果您的优先级是从保持任意顺序的集合中插入和/或删除元素,则LinkedList与 Java bundle 在一起的类满足了这一需求。您可以非常快速地插入或删除任何特定索引号处的任何元素。

双向链表链中的每个链接都知道其前任和后继。每个元素都包含一个指向前面元素的引用/指针和另一个指向后面元素的引用/指针。因此,插入意味着告诉链接对将新元素视为其后继或前驱。链的其余部分保持不变。

LinkedList 的缺点是通过索引号进行访问的成本很高,因为查找第 n 个元素意味着要遍历链中从一个元素到下一个元素的 n 个链接。链表本质上意味着顺序访问。因此,获取某个元素的成本很高,但一旦到达该元素,插入/删除的机制就很便宜。

出于类似的原因(顺序访问),LinkedList 的另一个缺点是搜索。由于排序是任意的且未排序,因此无法大致预测/预期可能在哪里找到元素。因此,搜索意味着从一个元素遍历链到下一个元素,并对每个元素进行比较。

另一方面,如果索引访问是您的首要任务,那么 ArrayList 就是最佳选择。直接访问第 n 个元素是 ArrayList 的特殊之处。插入和删除元素是非常昂贵的操作,需要重建后备数组,除非处理最后一个元素。对于大型数组,这会对内存管理产生影响,因为数组必须位于连续的内存中。

LinkedListArrayList 都允许重复。

LinkedList 和 ArrayList 都不是线程安全的。因此,如果从多个线程访问任一线程,则需要解决另一类问题。

要了解细微差别,请研究 linked listsarrays一般来说。

关于java - 应用程序中的可修改列表使用什么数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820620/

相关文章:

java - 针对正则表达式验证 null

java - 文件到 HashMap

android - 如何在单击 ListView 中的项目时创建复选框弹出窗口?

android - 从 Android 应用程序登录网页

jQuery:选择列表中的最后 4 项

java - Hystrix-javanica 在类级别动态设置属性

Java - @Before 和@test 注解

java - AsyncTask - 缺少一些东西

python - 解析列表中的 Python 字典

Python "join"位于字符串两侧?