各位,我现在有一个整体的链表来存储所有的对象实例(链表中的对象在程序运行过程中不发生数量上的变化),但是在程序运行的过程中,需要从整体链表中get一个对象,然后将这些对象分类添加到不同的链表中去(该对象不从整体链表中删除)。由于分类的标准较多,整体链表中的同一对象会被引用到不同的分类链表中去(指添加到这个分类后的链表中)。    但我发现,向分类链表中发现每添加一个整体链表中对象,内存就会增加一次,这表明添加的是对象的拷贝。而且由于需求所限,需要保留这些分类链表,导致很快内存就溢出。    所以,虽然Java没有指针,但想请教大家,针对这种情况,如何在往链表中添加的过程中,实现类似于C++那种使用指针的引用方式,真正的对象只有一个,链表中存储的是对象的指针(或真正的引用)而非对象的拷贝呢?    多谢!

解决方案 »

  1.   

    因为代码比较多,我就把核心的功能代码摘出来。(1)整体的链表
    //存储所有的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),内存就增长一次,时间长了,导致内存溢出。
      

  2.   

    很明确的说.没有拷贝对象.
    内存增产主要是因为get和set过程中的局部变量.
    你确定会溢出么?从你给的代码看,如果溢出只能是因为栈空间满了,你的数据的数量级很大?可以在启动jvm时设定的.
      

  3.   

    不是拷贝
    你可以看成JAVA的引用就是对C++的指针的包装
    只是你不是直接操作指针 而是透过引用去操作
    引用也是要占空间的 
    回收有一点是要确定没有顶层引用
      

  4.   

    并且JDK集合不会变大后自动变小,不断增加当然会越来越大啦
      

  5.   

    你的alPartA/alPartB从来就只add,如果会remove的话,那没什么大问题。否则,时间长了自然就内存不够用了。另外,看了你的代码就想说你
    List<Agent> alPartA=new ArrayList();好处,网上查一下。比如,如果你频繁add/remove,且读的频率不比写的高,那么就用LinkedList
      

  6.   


    多谢指教,这一点我还真没有注意呢,呵呵。程序里使用的确实是LinkedList,因为需要频繁的增加操作,只是提问时我写成了ArrayList(查询比较快),呵呵。