【问题标题】:In Java, which List implementation support insertion operation?在 Java 中,哪些 List 实现支持插入操作?
【发布时间】:2012-10-06 02:00:53
【问题描述】:

我试图为我的数据数组找到合适的数据结构。我更喜欢支持插入操作的(插入到列表中间)。

如果没有这种Java内置的数据结构,有什么好的实现方式呢?

例如如果我使用ArrayList<String>,它似乎不支持在列表中间插入,如何更好地实现insert(int pos, String str)

【问题讨论】:

    标签: java arrays list linked-list


    【解决方案1】:

    查看ArrayList.add 方法(在ArrayList 实现的List 接口中声明)

    在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将它们的索引加一)。

    【讨论】:

    • 注意:add NOT 特定于 ArrayList。每个实现 List 的类都支持这个操作。
    • @jahroy:是的,我添加了那个。问题实际上是文档还提到它是一个可选操作。
    • @BheshGurung - 我不明白接口中的方法如何是可选的(只需重新阅读文档)。我很想在另一个问题中问这个问题!
    • @jahroy:通常这应该被解释为“这个方法可能总是抛出一个UnsupportedOperationException”。该语言要求您实现它,但为您提供了永远不应该调用的始终失败实现的选项。 (对于List,这是明确记录的:“抛出:UnsupportedOperationException - 如果此列表不支持添加操作”)
    • 该方法将一直存在,但在某些情况下,它的实现会在运行时抛出一个标准异常。在这种情况下,它是为了支持诸如数组的 List 包装器之类的东西,它们不会(不能)将额外的元素插入到包装的数组中。
    【解决方案2】:

    任何实现List的类都可以做你想做的事。

    看看 List.add(),它在给定索引处插入一个对象。

    如果您想替换现有项目,请查看List.set()

    add() 方法是 List 接口的一部分...

    但是,正如 Bhesh Gurung 回答中的 cmets 所暗示的,并非所有列表都支持它。

    因此,我会接受 Bhesh Gurung 的回答(正如你已经回答的那样)。

    【讨论】:

    • SetList 有什么关系?
    • 方法集不是数据结构集。呵呵
    • 哦...嗯,setadd 是两个不同的操作。一个替换现有元素,另一个插入之前。
    • Set() 替换指定索引处的对象。我相信 OP 想要插入(在指定位置添加并将所有其他索引向右移动)。更糟糕的是,如果指定的索引不存在,set() 会抛出 IndexOutOfBoundsException
    • @Mike - 好的,我改变了切换我推荐两种方法的顺序:现在推荐 addset 之前。
    【解决方案3】:

    我认为你应该看看LinkedList add(int, E) 方法,与 ArrayList 相比,它在列表中间插入提供了更好的性能。

    【讨论】:

    • ...所有其他操作的性能更差,尤其是从中间删除。
    • 不要天真地使用 LinkedList。请参阅here 了解何时使用它。两种数据结构都有其优点和缺点。
    • List 接口的每个实现都可以在给定索引处插入元素。只要您不了解 OP 的要求,出于性能原因推荐一种实现而不是另一种实现似乎是值得怀疑的。
    • @Richard 我推荐它,因为问题是关于在列表中间插入。但无论如何,我确实明白你的意思。感谢您的评论。
    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多