1.hashCode()作用
答:在实现Hash算法的集合里面,例如HashSet,该集合不能存放相同的数据,HashSet会根据对象的equals()和hashCode()方法来判断要存放的数据是否已经存在。Hash算法把HashSet划分成多个区域,每个区域就是以哈希码来作为该区域的唯一编码,而hashCode()的作用就是为某对象生成一个哈希码。Hash算法会认为如果两个对象的equals()比较后相等,那么它所对应的hashCode也应该相等,那么
HashSet会从该哈希码所对应的那个区域来查找是否已经存在该对象数据,不存在则放进去。而如果只提供equals方法,不提供hashCode()方法,就算判断出两个对象引用相等,但是HashSet会在不同的区域下寻找是否有该对象,这样,HashSet会把相同的对象引用存放在两个不同的区域里面。
注意:只有实现了Hash算法的集合hashCode才起作用。
2.Java类会造成内存的泄露吗?为什么?
答:会
例如:Set set = new HashSet();
ReflectPoint rp = new ReflectPoint(3,4);
//测试对象,根据其x,y属性来算出hashCode
set.add(rp);
如果现在不需要rp数据了,想从内存中删除掉该对象引用,可以用
set.remove(rp);
此时可以清理出内存空间。
但是如果修改了hashCode生成的x,y属性:
rp.x = 66;
此时调用set.remove(rp);,则无法删除该对象引用,因为改变了x属性的值,其
hashCode也会改变,假如本来rp对象存放在A区域里面,hashCode一变,此时set.remove(rp)会从改变后的hashCode所对应的那个区域下寻找是否存在rp对象,存在就删除,而此时并不能找到,则不能删除掉,rp对象引用还会存放在内存中,占用内存空间,不被释放,造成内存的泄露。
建议:不要轻易修改用于生成hashCode的属性。
3.Java能不能自己写个类叫java.lang.System类?
答:一般不行,根本原因是受到类加载器的委托机制影响。
大家都知道,每个Java类都需要一个类加载器把编译好的class文件加载进内存中生成一份字节码。而JVM中主要有三种类加载器,这三个类加载器是父子关系(parent->children):
BootStrap(负责加载JVM下jre/lib/rt.jar),
ExtClassLoader(负责加载jre/lib/ext
public static void main(String[] args) throws Exception{
//第二步:获取泛型的实际的类型参数
Method method = GenericTest.class.getMethod(“applyGeneric”, Vector.class);
Type[] types = method.getGenericParameterTypes();
//因为本例知道参数只有一个,所以直接简写下标[0]获取第一个
ParameterizedType pType = (ParameterizedType)types[0];
System.out.println(pType.getRawType());
System.out.println(pType.getActualTypeArguments()[0]);//实际的类型参数
}
//通过反射机制来获取到泛型中的类型参数实例
//因为泛型完全是应用于编译器的,当类加载器加载class文件进内存时,会自动擦除泛型信息,字节码中无泛型类型信息
//所以普通方法无法获取到该类型参数,可以采用反射中Method对象中的获取泛型参数列表方法获取
//第一步:定义一个应用泛型的方法
public static void applyGeneric(Vector<Date> v){
}
}



