黑马程序员__数组反射及内存泄漏

--------------- 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培训、期待与您交流!---------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值