2013-04-17 27 views
0

考虑到Java动态列表或地图(如LinkedList,LinkedHashMap,TreeMap等),我想任何对象都有对下一个对象的引用(next->)(对吗?) 。为什么没有办法(例如,一种方法)在Java中访问这些引用(next->)?在Java动态列表或映射中更改对象引用

我担心的是,如果可能的话,LinkedList可以像魅力一样分成两个列表,节省大量的CPU开销。我现在所做的是复制列表的一部分(新的子列表()...),然后清除原始列表中的相应条目。

+0

LinkedArrayList?这是否存在? – hvgotcodes

+0

谢谢,我刚刚编辑,我的意思是LinkedList。 – aLogic

+1

不要忘记,Java附带的集合是*通用集合*。换句话说:它们是为了*用于大多数*用例,并不一定适用于所有用例。如果对列表进行破坏性拆分是一种常见(和性能相关的)用例,那么您可以考虑实施自己的列表(或者使用类似[pcollections](https://code.google.com/p/) pcollections /))。 –

回答

2

我担心的是,如果这是可能的,那么LinkedArrayList可以将 分割成两个列表,像一个魅力,节省大量的CPU开销。 我现在所做的是复制清单(新子清单()...)的一部分和 ,然后清除原清单中的相应条目。

如果您这样做了,您将在列表的API之外修改列表的内部数据结构,因此列表的其他内部参数将不同步。换句话说,组成链表并且保存放入列表中的对象的节点对列表来说是私有的;即当您创建一个LinkedList实例时,您无法访问节点。

+0

确实令人信服。谢谢。 – aLogic

1

访问“下一个”指针是一个实现细节。你说得对,它可以节省性能,但是从面向对象的角度来看,你不应该依赖这样的细节。毕竟,实现可能完全不同,甚至没有下一个指针。 如果您担心性能,您应该实施自己的特定解决方案,或使用不同的方法/语言。

0

不同的集合类对于如何访问集合中的单个对象有不同的实现。例如。 Arraylist类将单个对象存储为Object数组,而LinkedList类使用内部类Entry来存储单个对象。但是,这些成员被封装并标记为私有的,以便它们对程序员不可见。这背后的主要原因是为程序员提供了一套简单的方法来执行各种操作,而不必关心该方法是如何实现的。

我担心的是,如果可能的话,LinkedList可以像魅力一样分成两个列表,节省大量的CPU开销。我现在所做的是复制列表的一部分(新的子列表()...),然后清除原始列表中的相应条目。

通常情况下,您不会掌握管理您的收藏和执行分割等操作的成员。但是,如果你仍然想访问这些成员来提高性能,你总是可以创建自己的类,这可以让你获得'下一个'。您可以随时调整预定义类中的现有代码,如LinkedList,并创建自己的类,例如MyLinkedList。或者你可以扩展这些类并编写你自己的方法。