A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张健 中级黑马   /  2012-5-26 17:35  /  1511 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

怎样才能避免,既能修改集合中的元素,又避免造成内存泄漏?
该怎么处理?

public class Demo {
        public int x;
        public int y;
        public Demo(int x,int y){
       
                this.x = x;
                this.y = y;
        }
        @Override
        public int hashCode() {
                final int PRIME = 31;
                int result = 1;
                result = PRIME * result + x;
                result = PRIME * result + y;
                return result;
        }
        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                final Demo other = (Demo) obj;
                if (x != other.x)
                        return false;
                if (y != other.y)
                        return false;
                return true;
        }       
}

import java.util.*;
public class Test3 {
        public static void main(String[] args) {
                Collection collections  = new HashSet();
       
                Demo d1 = new Demo(3,3);
                Demo d2 = new Demo(5,5);
                Demo d3 = new Demo(3,3);
               
                collections.add(d1);
                collections.add(d2);  
                collections.add(d3);
                collections.add(d1);
               
                d1.y = 0;
                collections.remove(d1);
                System.out.println(collections.size());
               
        }
}

2 个回复

倒序浏览
那就先collections.remove(d1);
然后d1.y = 0;

回复 使用道具 举报

对于修改集合中的元素,建议采用列表,如ArrayList等。

而对于避免造成内存泄漏:

1、最基本的建议是尽早释放无用对象的引用。如:

  ……

  A a = new A();

  //应用a对象

  a = null; //当使用对象a之后主动将其设置为空

  …

  注:如果a 是方法的返回值,不要做这样的处理,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除

  2、尽量少用finalize函数。它会加大GC的工作量。

  3、如果需要使用经常用到的图片,可以使用soft应用类型。它尽可能把图片保存在内存中

  4、注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对GC来说,回收更为复杂。

  5、尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费

  6、尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间

  7、尽量避免显式申请数组空间

  8、尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。

  9、尽量在合适的场景下使用对象池技术以提高系统性能。
    这要根据程序的侧重面来用,俗话说:“二者不可得兼,舍鱼而取熊掌者也”。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马