我知道当我将一个对象添加到某些集合(如LinkedList)时,该元素不会直接添加到集合中;实际上,一个节点被添加到提供链接功能的集合中,并且该节点具有对我添加到集合的Object的引用。这适用于所有Java集合类吗?例如,当我执行以下操作时:
List<String> list = new ArrayList<String>();
list.add("Car");
是否将String对象“Car”直接添加到列表中,或者只是将一个节点添加到指向“Car”的列表中?
另外,我可以将其视为代理设计模式吗?
答案 0 :(得分:5)
Java中的ArrayList使用数组来存储对象的引用,因此它与代理模式无关。您可以看到,here是您自己的OpenJDK实现的链接。第103行有相关的代码。
private transient Object[] elementData;
您还可以将其与使用节点存储List
中下一个和上一个元素的引用的LinkedList进行比较。
答案 1 :(得分:2)
不向LinkedList添加元素不是代理模式。代理模式是一种创造模式。 LinkedList中没有关于它包含的内容的创建。 Node包装Object的事实不足以将其限定为代理。包装节点也没有实现与它的共享接口以及Collection中包含的对象。
代理是一个可以代替另一个对象的对象,因此共享接口很重要。这个替换对象可以通过按需创建真实对象来节省内存,时间或两者。它也可以选择在不需要时销毁对象。代理控制它包装的对象的生命周期,这是代理模式的标志。集合中的节点不控制它指向的对象的生命周期,因为它被赋予它包装的对象。
例如,假设我们有一个连接到许多数据库的应用程序,但并不总是需要同时连接所有数据库。我们可以实现一个特殊的DataSource,它只在请求连接时创建底层的DataSource。当您没有活动连接时(例如,当最后一个连接发送关闭时),它也可以关闭DataSource。
这类似于大多数连接池库中实现连接池的方式。底层DataSource只提供与数据库的连接,但连接池分层在DataSource之上,并提供池化而客户端无法实现它的发生。
答案 2 :(得分:1)
您实际上可以查看ArrayList
等的源代码。
ArrayList
在内部使用Object[]
数组,因此它不涉及额外的包装器,但它直接存储对象引用。所以绝对没有“代理”。
如果你输入原始类型,它们将被自动装箱为对象。我不会将此称为代理模式的实例。
如果您寻找代理模式,请查看RMI。