---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
ArrayList、HashSet的比较及HashCode分析
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的HashCode方法,
但是只为它提供一个hashCode方法也不会有什么不好,没准以后又用到这个方法了,所以,通常要求hashCode和equals方法同时覆盖。
提示:
1.通常来说,一个类的两个实例对象用equals方法比较的结果相等时,它们的哈希码必须相等,反之则不成立,即equals方法
比较结果不想等的对象可以有相同的哈希码,或者说哈希码相同的两个对象的equals方法比较的结果肯定不想等。例如字符
串"BB" 和"Aa"的equals方法比较结果肯定不同,但是他们的hashCode方法返回值相等
2.当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希
值与最初存储进HashSet集合中的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去
HashSet中检索对象,也将返回找不到对象的结果,这会导致无法从HashSet中单独删除当前对象,从而造成内存泄漏。
package com.lee.demo;
import java.util.*;
public class ReflectTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//Collection coll = new ArrayList();
Collection coll = new HashSet();
ReflectPoint pt1 = new ReflectPoint(1, 1);
ReflectPoint pt2 = new ReflectPoint(2, 2);
ReflectPoint pt3 = new ReflectPoint(1, 1);
coll.add(pt1);
coll.add(pt2);
coll.add(pt3);
coll.add(pt1);
//pt1.x=3; 会导致内存泄漏
coll.remove(pt1);
System.out.println(coll.size());
}
}
反射的作用-->实现框架功能
工具类被用户调用,而框架则是调用用户提供的类
核心问题:因为写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而要用反射方式来做。
类加载器的使用方式看代码
package com.lee.demo;
import java.io.InputStream;
import java.util.*;
public class ReflectTest1 {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//由配置文件读取配置参数
//一定要记住用完整的路径,但完整路径不是硬编码,而是运算出来的。
//InputStream inputStream = new FileInputStream("config.properties");
InputStream inputStream = ReflectTest1.class.getClassLoader().getResourceAsStream("com/lee/demo/config.properties");
//InputStream inputStream = ReflectTest1.class.getResourceAsStream("config.properties");
Properties prop = new Properties();
prop.load(inputStream);
inputStream.close();
String className = prop.getProperty("className");
//反射的方式创建对象
Collection coll = (Collection)Class.forName(className).newInstance();
ReflectPoint pt1 = new ReflectPoint(1, 1);
ReflectPoint pt2 = new ReflectPoint(2, 2);
ReflectPoint pt3 = new ReflectPoint(1, 1);
coll.add(pt1);
coll.add(pt2);
coll.add(pt3);
coll.add(pt1);
System.out.println(coll.size());
}
}
内省及JavaBean
IntroSpector-->JavaBean-->特殊的java类
getAge->Age-->如果第二个字母是小写的,则把第一个字母变成小的-->age
gettime-->time
getTime-->time
getCPU-->CUP
package com.lee.demo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class IntroSpector {
/**
* 内省的操作
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
ReflectPoint2 pt = new ReflectPoint2(2,3);
String propertyName = "x";
//读取pt对象的属性
PropertyDescriptor pd = new PropertyDescriptor(propertyName , ReflectPoint2.class);
Method readMethod = pd.getReadMethod();
Object reVal = readMethod.invoke(pt);
System.out.println(reVal);
//设置pt对象的属性值
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName , ReflectPoint2.class);
Method writeMethod = pd2.getWriteMethod();
writeMethod.invoke(pt, 4);
System.out.println(pt.getX());
}
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详情请查看:http://edu.youkuaiyun.com