--------------- android培训、java培训、期待与您交流!---------------
1)数组中的反射
使用java.lang.reflect.Array实现。
private static void printObject(Object obj){
Class clazz = obj.getClass();
if (clazz.isArray) {
int len = Array.getLength(obj);
for (int i=0; i<len; i++) {
System.out.println(Array.get(obj, i);
}
}else {
System.out.println(obj);
}
}
.1) 具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
.2) 代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
.3) 基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;
非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用。
内存泄漏问题及其hashCode()和equals()方法的重写:
例子:
这是个“点”类
package net.reflect;
public class ReflectPoint {
privateint x;
publicint y;
//publicString str1="ball";
//publicString str2="basketball";
//publicList<Integer> lis;
publicReflectPoint(int x, int y) {
super();
this.x= x;
this.y= y;
}
//@Override
/*publicint hashCode() {
finalint prime = 31;
intresult = 1;
result= prime * result + x;
result= prime * result + y;
returnresult;
}*/
/* @Override
publicboolean equals(Object obj) {
if(this == obj)
returntrue;
if(obj == null)
returnfalse;
if(getClass() != obj.getClass())
returnfalse;
ReflectPointother = (ReflectPoint) obj;
if(x != other.x)
returnfalse;
if(y != other.y)
returnfalse;
returntrue;
}*/
}
这是个测试类:
package net.reflect;
import java.util.*;
public class ArrayTest {
/**
* @param args
*/
public static void main(String[] args) {
Collection co = new HashSet();
ReflectPoint p1 = new ReflectPoint(3, 3);
ReflectPoint p2 = new ReflectPoint(5, 5);
ReflectPoint p3 = new ReflectPoint(3, 3);
co.add(p1);
co.add(p2);
co.add(p3);
//p1.y=4;
//co.remove(p1);
System.out.println(co.size());
System.out.println(p1.equals(p3));
}
}
在没有重写hashcode()和equals()方法前打印结果:
3
False
重写了之后打印:
2
True
内存泄漏:在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
例如将上面的代码
再加上 //p1.y=4;
//co.remove(p1);
之后再执行结果是: 2 false
即是:再赋值之后,hashcode 改变,而删除还在原来的hashcode位置上删,就删不掉了。
--------------- android培训、java培训、期待与您交流!---------------