您的位置:首页 > 运维架构

ArrayList 与HashSet的比较,及应用反射读取properties配置文件中的数据进行实例化再调用,以及类加载器的使用;还有HashCode的分析,及导致内存泄露,内存溢出的原因之一

2012-09-19 10:22 1241 查看
package com.lianxi;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Properties;
/**
* hashCode介绍:
* 	通过hashCode把集合中(该集合必须基于hashCode算法的才行,
* 	比如HashSet,HashMap等等)的数据分成多个区域,再插入新的数据时,
* 	按照区域查找要快的多,所以提高了效率
*
* @author zjw
*
*/
public class LianXi {
public static void main(String[] args) throws Exception {
method();
}
public static void method() throws Exception{
//用反射方式,读取配置文件的数据,再实例化调用,实现框架的初级使用
Properties p=new Properties();
//一般不用这种相对路径,最好用绝对路径,首先通过getRealPath获取项目绝对路径,在添加对应项目的相对路径即可
//这种方式,如果要对properties配置文件进行修改数据,可以用FileOutputStream进行操作
//		InputStream is=new FileInputStream("src/com/lianxi/reflect.properties");
//用类加载器加载,方式一:
//只要运行,LianXi.class就会自动加载到内存,通过该Class再加载其他文件
//类加载器只能加载配置文件,不能对配置文件进行修改操作
//		InputStream is=LianXi.class.getClassLoader().getResourceAsStream("../resource/reflect.properties");//这样用相对路径会报错,这个没有相对路径一说,必须用绝对路径
InputStream is=LianXi.class.getClassLoader().getResourceAsStream("com/resource/reflect.properties");
//类加载器方式二:
//类文件直接实现了类加载,内部封装了getClassLoader()方法,可直接调用getResourceAsStream()方法,
InputStream is2=LianXi.class.getResourceAsStream("reflect.properties");//可以直接用相对路径,此路径为LianXi。class的路径
InputStream is3=LianXi.class.getResourceAsStream("../reflect.properties");//可以直接用相对路径,此路径为LianXi。class上一级的路径
InputStream is4=LianXi.class.getResourceAsStream("../resource/reflect.properties");//可以直接用相对路径,此路径为LianXi。class上一级的路径resource包下的路径
//用类文件也可以用绝对路径加载
InputStream is5=LianXi.class.getResourceAsStream("/com/resource/reflect.properties");//注意顶级包前也要加上"/",这是绝对路径,可以不用随着LianXi.class这个类文件走
p.load(is5);
is5.close();
Collection list=(Collection)Class.forName(p.getProperty("ArrayList")).newInstance();
//用普通方式,直接实例化对象
//		Collection list=new HashSet();
Class_a f1=new Class_a(3,3);//创建几个实例对象
Class_a f2=new Class_a(4,4);
Class_a f3=new Class_a(5,5);
Class_a f4=new Class_a(3,3);
list.add(f1);
list.add(f2);
list.add(f3);
list.add(f4);
list.add(f1);

f1.b=88;//修改f1对象中的值
list.remove(f1);//从HashSet中移除该对象,但因为上面修改了f1对象的值,导致该对象的hashCode值改变,
//现在移除的话,会在另一个hashCode区域查找,但根本找不到,虽然表面上移除了该对象,
//但其实该对象还是在HashSet集合中,这样长久下去,会导致内存泄露,导致内存溢出

System.out.println(list.size());

//		list.add("aa");
//		list.add("bb");
//		list.add("cc");
//		list.add("dd");
//		list.add("aa");
System.out.println(list);
}
}
class Class_a{
private int a;
public int b;
public Class_a(int a, int b) {
this.a = a;
this.b = b;
}
//下面的hashCode和equals方法都是生成的,右键---》Source---》Generate HashCode() and Equals()
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Class_a other = (Class_a) obj;
if (a != other.a)
return false;
if (b != other.b)
return false;
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐