3

我知道,当我将对象添加到某些集合(例如 LinkedList)时,该元素不会直接添加到集合中;实际上,将一个节点添加到提供链接功能的集合中,并且该节点具有对我添加到集合中的对象的引用。对于所有 Java 集合类都是这样吗?例如,当我执行以下操作时:

List<String> list = new ArrayList<String>();
list.add("Car");

是直接将字符串对象“Car”添加到列表中,还是仅将一个节点添加到指向“Car”的列表中?

另外,我可以认为这是一种代理设计模式吗?

4

3 回答 3

5

Java 中的 ArrayList 使用数组来存储对对象的引用,因此它与 Proxy 模式无关。您可以自己查看,这里是它的 OpenJDK 实现的链接。第 103 行有相关的代码。

private transient Object[] elementData;

您还可以将其与LinkedList进行比较,后者使用 Nodes 来存储对List.

于 2013-01-27T00:05:49.677 回答
2

不向 LinkedList 添加元素不是代理模式。代理模式是一种创建模式。在 LinkedList 中没有关于它所包含的内容的创建。Node 包装一个 Object 的事实并不足以将其限定为代理。包装节点也没有实现与它和集合中包含的对象的共享接口。

代理是可以代替另一个对象的对象,因此共享接口很重要。这种替代对象可以通过按需创建真实对象来节省内存、时间或两者兼而有之。它还可以选择在不需要时销毁对象。代理控制它包装的对象的生命周期,这是代理模式的标志。集合中的节点不控制它指向的对象的生命周期,因为它被赋予了它包装的对象。

例如,假设我们有一个连接到许多数据库的应用程序,但它并不总是需要一次连接到所有数据库。我们可以实现一个特殊的 DataSource,它只会在请求连接时创建底层 DataSource。它还可以在您没有活动连接时关闭 DataSource(例如,当最后一个分发的连接关闭时)。

这类似于在大多数连接池库中实现连接池的方式。底层 DataSource 只是提供到 DB 的连接,但连接池位于 DataSource 之上,并在客户端没有意识到它发生的情况下提供池。

于 2013-01-27T00:38:05.270 回答
1

您实际上可以查看ArrayList等的源代码。

An在内部ArrayList使用Object[]数组,因此它不涉及额外的包装器,但它直接存储对象引用。所以这里绝对没有“代理”。

如果您输入原始类型,它们将被自动装箱为对象。我也不会将此称为代理模式的实例。

如果您寻找代理模式,请查看 RMI。

于 2013-01-27T00:18:38.240 回答