用反射机制简单应用配置文件
2014-08-08 21:32
507 查看
首先在建立一个配置文件config.properties
如果配置文件写:className=java.util.HashSet 则输出结果是2
如果配置文件写:className=java.util.ArrayList 则输出结果是4
这是为什么呢?
ArrayList是有序集合,相当于数组。存放的是外面对象的引用。这里对象可以重复。而HashSet存放的对象不能重复
这个时候得分析一下hashCode的用处了,下面用简单代码说明?
这个时候输出的结果是2
要是我打开注释呢?
输出结果依旧是2
如果我我打开注释呢?
这是为什么呢?
hashcode在存储值得时候把数值分为若干值域,把将要存入的数据转化为HashCode码(通过一定的算法得到)后放入不同的区域,当有相同的对象的时候也根据hash算法算出具体的值,根据具体的值在对用的区域去匹配,而不是一个一个从头开始匹配,这样提高了存储效率。
当对象被存储进HashCode集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段,否则,对象修改后的哈希值与最近存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains 方法使用该对象当前的引用作为参数去HashSet集合检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露
package javatribe.fts.reflect; import java.io.FileInputStream; import java.io.InputStream; import java.util.Collection; import java.util.Properties; public class ReflectTest3 { /** * @param args */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub //InputStream ips=new FileInputStream("config.properties"); //InputStream ips=ReflectTest3.class.getClassLoader().getResourceAsStream("javatribe/fts/reflect/config.properties"); InputStream ips=ReflectTest3.class.getResourceAsStream("resources/config.properties"); Properties props=new Properties(); props.load(ips); ips.close(); String className=props.getProperty("className"); Collection cllections=(Collection) Class.forName(className).newInstance(); ReflectPoint pt1=new ReflectPoint(3,3); ReflectPoint pt2=new ReflectPoint(5,5); ReflectPoint pt3=new ReflectPoint(3,3); cllections.add(pt1); cllections.add(pt2); cllections.add(pt3); cllections.add(pt1); System.out.println(cllections.size()); } }
如果配置文件写:className=java.util.HashSet 则输出结果是2
如果配置文件写:className=java.util.ArrayList 则输出结果是4
这是为什么呢?
ArrayList是有序集合,相当于数组。存放的是外面对象的引用。这里对象可以重复。而HashSet存放的对象不能重复
这个时候得分析一下hashCode的用处了,下面用简单代码说明?
package javatribe.fts.reflect; public class ReflectPoint { private int x; public int y; public String str1="ball"; public String str2="basketball"; public String str3="itcast"; public ReflectPoint(int x, int y) { super(); 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 ReflectPoint other = (ReflectPoint) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } @Override public String toString(){ return str1+" : "+str2+" : "+str3; } }
package javatribe.fts.reflect; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; public class ReflectTest2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //Collection cllections=new ArrayList(); Collection cllections=new HashSet(); ReflectPoint pt1=new ReflectPoint(3,3); ReflectPoint pt2=new ReflectPoint(5,5); ReflectPoint pt3=new ReflectPoint(3,3); cllections.add(pt1); cllections.add(pt2); cllections.add(pt3); cllections.add(pt1); //pt1.y=7; //cllections.remove(pt1); System.out.println(cllections.size()); } }
这个时候输出的结果是2
要是我打开注释呢?
//pt1.y=7; //cllections.remove(pt1);
输出结果依旧是2
如果我我打开注释呢?
//cllections.remove(pt1);输出的结果是1
这是为什么呢?
hashcode在存储值得时候把数值分为若干值域,把将要存入的数据转化为HashCode码(通过一定的算法得到)后放入不同的区域,当有相同的对象的时候也根据hash算法算出具体的值,根据具体的值在对用的区域去匹配,而不是一个一个从头开始匹配,这样提高了存储效率。
当对象被存储进HashCode集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段,否则,对象修改后的哈希值与最近存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains 方法使用该对象当前的引用作为参数去HashSet集合检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露
相关文章推荐
- Java进阶之反射的简单应用:通过反射运行配置文件内容
- 配置文件+反射+简单工厂
- ArrayList 与HashSet的比较,及应用反射读取properties配置文件中的数据进行实例化再调用,以及类加载器的使用;还有HashCode的分析,及导致内存泄露,内存溢出的原因之一
- Java学习之道:mybatis简单应用(基于配置文件)
- mybatis简单应用(基于配置文件)
- 反射笔记:一种简单的基于配置文件的IoC实现
- mybatis简单应用(基于配置文件)
- hibernate-MySQL配置文件及简单应用(CRUD)
- mybatis简单应用(基于配置文件)
- hibernate-MySQL配置文件及简单应用(CRUD)
- JavaScript的反射机制介绍及简单应用
- mybatis简单应用(基于配置文件)
- LVS基于NAT机制的简单应用配置
- 反射机制的简单应用
- 配置文件和反射给抽象工厂带来的好处及在机房收费系统中应用的疑惑
- mybatis简单应用(基于配置文件)
- mybatis简单应用(基于配置文件)
- 反射与配置文件简单使用
- 利用反射机制通过配置文件在对象池创建对象
- [Java 15 反射机制 ] 工厂模式与 properties 读取配置文件