Java中的向量选项
我用的是物体的矢量。我的问题是,从向量中删除是一个昂贵的操作(O(n^2))。在Java中,向量的替换是什么。在我的使用中,添加和删除是经常发生的Java中的向量选项,java,Java,我用的是物体的矢量。我的问题是,从向量中删除是一个昂贵的操作(O(n^2))。在Java中,向量的替换是什么。在我的使用中,添加和删除是经常发生的 我是C++人,不太懂java,/p> < p>可以在java中使用ARARYLAMP代替矢量。 < P> >,不应该使用向量类。Java中有很多可用的容器。其中很少有人: ArrayList适用于随机访问,但不适用于从列表中间插入或删除 LinkedList不利于随机访问,但对于迭代和从容器中间添加/删除元素非常有用。查看本文: LinkedLis
<>我是C++人,不太懂java,/p> < p>可以在java中使用ARARYLAMP代替矢量。 < P> >,不应该使用向量类。Java中有很多可用的容器。其中很少有人:
ArrayList
适用于随机访问,但不适用于从列表中间插入或删除
LinkedList
不利于随机访问,但对于迭代和从容器中间添加/删除元素非常有用。查看本文:
LinkedList可以在O(1)添加/删除项首先,向量删除时间复杂度是O(n)而不是O(n^2)。如果你想要更高性能的类,你应该选择LinkedList。它的时间复杂度是恒定的 对于您的用例,列表可能不是理想的数据结构-如果元素的顺序不重要,您是否最好使用哈希集?事实上,
Vector
和ArrayList
之间的区别在于Vector
是同步的,而ArrayList
不是。通常,您不需要同步,因此可以使用ArrayList
(很像StringBuffer
StringBuilder
)
更换主要取决于您打算如何使用该系列
将对象添加到ArrayList
非常快,因为如果需要更多的空间,通常会加倍,如果您事先知道大小要求,效果会更好
从ArrayList
中删除是O(n),但迭代和随机访问速度很快
如果您经常进行添加或删除操作,或者在列表上进行迭代,则可以使用LinkedList
您甚至可以考虑使用<代码> LinkedHashMap <代码>,它允许快速访问,并保留插入顺序。
我认为,向量使用System.arrayCopy,其复杂性为O(n^2) 正确的做法是,
Vector
将使用System.arrayCopy
移动元素。但是,System.arrayCopy()
调用最多复制Vector.size()
元素,因此是O(N)
,其中N
是向量的大小
因此,O(N^2)
对于单个插入/移除是不正确的
事实上,如果您想要比
O(N)
更好的插入和删除,您将需要使用某种带有光标抽象的链表类型,允许在“当前位置”插入和删除。即使如此,如果你能以正确的顺序进行插入/删除,你也只能比O(N)
更好;i、 不是随机顺序
FWIW,Java
List
api没有提供这样的游标机制。。。不仅仅是因为它使用起来很笨拙,而且只有在某些情况下/实现时才有效。感谢大家的贡献,帮助我解决了这个问题。我使用了一个循环队列,它是借助向量编写的 您关于删除操作运行时的信息是错误的。除此之外,使用ArrayList
而不是Vector
。ArrayList在添加和删除时的行为是什么?@Saurabh01与Vector
相同–基本相同,但没有无用的同步Vector
在很大程度上已经过时,并已被ArrayList
取代。正如我所说,remove
的运行时是线性的,所以它比O(n^2)好得多。@Saurabh:为什么你要“大量地添加和删除”。我可以知道谁在向量中添加和删除。它试图实现什么样的业务逻辑。你能从你的集合中添加更多关于你需要什么的信息吗?是否需要对其进行迭代并删除项目?您是否也添加了?你在乎秩序吗?访问项目是否需要O(1)?还是O(n)好?也许集合/映射更适合您?我想,Vector使用System.arrayCopy的复杂性是O(n^2)。我正在使用它添加积分数据类型以及一些自定义对象。我还想保留插入的顺序。我事先不知道大概的大小。所以你有一个对象列表,可以是任何类型的?嗯,那是个危险的设计。你能给我看看代码吗?