在某些应用中,您有项目列表,您可以在其中移动项目、删除项目、添加或插入项目等。
通常我会说 ArrayList 可以工作,但显然很多操作都是线性时间。
大多数人都使用更好的数据结构吗?
最佳答案
如果您的优先级是从保持任意顺序的集合中插入和/或删除元素,则LinkedList
与 Java bundle 在一起的类满足了这一需求。您可以非常快速地插入或删除任何特定索引号处的任何元素。
双向链表链中的每个链接都知道其前任和后继。每个元素都包含一个指向前面元素的引用/指针和另一个指向后面元素的引用/指针。因此,插入意味着告诉链接对将新元素视为其后继或前驱。链的其余部分保持不变。
LinkedList 的缺点是通过索引号进行访问的成本很高,因为查找第 n 个元素意味着要遍历链中从一个元素到下一个元素的 n 个链接。链表本质上意味着顺序访问。因此,获取某个元素的成本很高,但一旦到达该元素,插入/删除的机制就很便宜。
出于类似的原因(顺序访问),LinkedList
的另一个缺点是搜索。由于排序是任意的且未排序,因此无法大致预测/预期可能在哪里找到元素。因此,搜索意味着从一个元素遍历链到下一个元素,并对每个元素进行比较。
另一方面,如果索引访问是您的首要任务,那么 ArrayList
就是最佳选择。直接访问第 n 个元素是 ArrayList 的特殊之处。插入和删除元素是非常昂贵的操作,需要重建后备数组,除非处理最后一个元素。对于大型数组,这会对内存管理产生影响,因为数组必须位于连续的内存中。
LinkedList
和 ArrayList
都允许重复。
LinkedList 和 ArrayList 都不是线程安全的。因此,如果从多个线程访问任一线程,则需要解决另一类问题。
要了解细微差别,请研究 linked lists和 arrays一般来说。
关于java - 应用程序中的可修改列表使用什么数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820620/