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

来源:互联网 发布:楚楚街和淘宝什么关系 编辑:程序博客网 时间:2024/05/18 16:39



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()@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + a;result = prime * result + b;return result;}@Overridepublic 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;}}


原创粉丝点击