各位,我现在有一个整体的链表来存储所有的对象实例(链表中的对象在程序运行过程中不发生数量上的变化),但是在程序运行的过程中,需要从整体链表中get一个对象,然后将这些对象分类添加到不同的链表中去(该对象不从整体链表中删除)。由于分类的标准较多,整体链表中的同一对象会被引用到不同的分类链表中去(指添加到这个分类后的链表中)。 但我发现,向分类链表中发现每添加一个整体链表中对象,内存就会增加一次,这表明添加的是对象的拷贝。而且由于需求所限,需要保留这些分类链表,导致很快内存就溢出。 所以,虽然Java没有指针,但想请教大家,针对这种情况,如何在往链表中添加的过程中,实现类似于C++那种使用指针的引用方式,真正的对象只有一个,链表中存储的是对象的指针(或真正的引用)而非对象的拷贝呢? 多谢!
//存储所有的Agent对象
ArrayList<Agent> alAgents=new ArrayList();
(2)分类的链表
//示例为A
ArrayList<Agent> alPartA=new ArrayList();
ArrayList<Agent> alPartB=new ArrayList();(3)程序运行时,从整体链表alAgents选出符合条件的对象,添加到alPartA和alPartB中Agent agent1=(Agent)alAgents.get(0);
alPartA.add(agent1);Agent agent2=(Agent)alAgents.get(1);
alPartB.add(agent2);(4)在运行时,发现每执行一次(3),内存就增长一次,时间长了,导致内存溢出。
内存增产主要是因为get和set过程中的局部变量.
你确定会溢出么?从你给的代码看,如果溢出只能是因为栈空间满了,你的数据的数量级很大?可以在启动jvm时设定的.
你可以看成JAVA的引用就是对C++的指针的包装
只是你不是直接操作指针 而是透过引用去操作
引用也是要占空间的
回收有一点是要确定没有顶层引用
List<Agent> alPartA=new ArrayList();好处,网上查一下。比如,如果你频繁add/remove,且读的频率不比写的高,那么就用LinkedList
多谢指教,这一点我还真没有注意呢,呵呵。程序里使用的确实是LinkedList,因为需要频繁的增加操作,只是提问时我写成了ArrayList(查询比较快),呵呵。