黑马程序员-关于数组和集合的反射

 ------------Android培训     Java培训       期待与您的交流!---------

/*数组的反射 数组也是一种类型 
*如果相同的元素类型以及具有相同的维度的数组反射是同一个类型
*Array工具类针对完成对数组的反射操作的一个类

*/

//关于数组反射的一些基础知识
import java.util.*;
import java.lang.reflect.Array;
class  ArraysReflectTest
{
    public static void main(String[] args) 
    {
        int [] a1=new int[]{1,2,3};
        int [] a2=new int[4];
        
        int [][]a3=new int[2][3];
        String []a4=new String[]{"a","b","c"};

        System.out.println(a1.getClass()==a2.getClass());
        //System.out.println(a1.getClass()==a3.getClass());            //在jdk的高级版本中他们已经是不可比较类型
        //System.out.println(a1.getClass()==a4.getClass());            //不可比较类型
        System.out.println(a1.getClass().getName());                   //返回[I  [表示数据。I表示int
        System.out.println(a1.getClass().getSuperclass().getName());   //返回父类的名字
        System.out.println(a4.getClass().getSuperclass().getName());
        //父类的名字都是Object

        Object obj1=a1;                                                 //说明一维数组是Object
        Object obj2=a4;        
        //Object []obj3=a1;                                            //由于a1里面装的是int,int不是Object
        Object []obj4=a3;                                              //a3[]里面装的是int [],是Object
        Object []obj5=a4;                                              //Sring元素是Object 
        
        //Array.asList对处理int[]和String[]的差异
        System.out.println(Arrays.asList(a1));                        //打印[[I+哈希值,因为一维数组当做一个Object
        System.out.println(Arrays.asList(a4));                        //遍历数组

        printObject(a1);                                    
        printObject("dwda");


    }
    //只能得到数组元素的类型,a[0].getClass().getName();
    //不能得到数组a的类型        
    //数组反射的应用,将Object打印出来
    
    public static void printObject(Object obj)
    {
        Class cls=obj.getClass();
        if (cls.isArray())                            //如果是数组,就取出每一个
        {
            int len=Array.getLength(obj);
            for (int i=0;i<len;i++ )
            {
                System.out.println(Array.get(obj,i));//获取数组第i个元素
            }

            }else                                    //不是数组就直接打印obj
        {
            System.out.println(obj);
        }
    }

}


//反射的综合案例  ArrayList_HashSet的比较及Hashcode分析

import java.util.Collection;
import java.util.ArrayList;
public class ReflectTest2
{
    public static void main(String [] args)
    {
        Collection collections=new ArrayList();            //Collection collections=new HashSet();

        ReflectPoint pt1=new ReflectPoint(3,3);            //ReflectPoint pt1=new ReflectPoint(3,3);    
        ReflectPoint pt2=new ReflectPoint(5,5);            //ReflectPoint pt2=new ReflectPoint(5,5);    
        ReflectPoint pt3=new ReflectPoint(3,3);            //ReflectPoint pt3=new ReflectPoint(3,3);
        //当equals方法覆盖了,pt1==pt3
        collections.add(pt1);                            //collections.add(pt1);    
        collections.add(pt2);                            //collections.add(pt2);    
        collections.add(pt3);                            //collections.add(pt3);    
        collections.add(pt1);                            //collections.add(pt1);    
        //打印结果为4                                    //HashSet的打印结果为3
        System.out.println(collections.size());            //重写了hashCode和equals,hashSet就不能放进pt3,打印结果为2
                                                        //不重写hashCode,只重写equals结果还是3
    }
}                                                        

                                                        //内存泄露演示
                                                        //当重写了hashCode后
                                                        //pt1.y=7;                     改变了参与hashCode计算的y变量
                                                        //collections.remove(pt1);   移除失败
                                                        
                                                        //打印结果则还是2

//ArrayList与HashSet的区别
//ArrayList :
    /*
        有顺序的集合,就相当与数组,从第一个空位置开始按顺序放对象引用,同一变量多次放进去
        有放进去的先后顺序。
    */
//HashSet:  只能把之前pt1的remove了,才能放进相同的对象pt1
   

//面试题 hashCode的作用
    //把内存分成多个区域,每一个对象都能算出hashCode,根据hashCode确定你存在区域
    //查找时,根据hashCode迅速缩小搜索范围到某个区域,然后在这个区域进行查找

//关于内存泄露的问题
    /*
        当一个对象被存储进hashSet集合中后,就不鞥修改这个对象中的那些参与计算哈希值的字段了
        否则,对于修改后的哈希值和最初存储进HashSet集合中是哈希值就不同了,,你将无法通过当
        前的引用作为参数去检索对象,和从集合中单独移除当前对象。
        这便是所谓的内存泄露。
    */




//反射作用,实现框架的的一个小功能 通过反射实现对配置文件信息的获取,在MyEclipse
创建一个配置文件count.properties
里面写上
className=java.util.ArrayList            //也可以改为java。util.HashSet

class KJTest
{
    public static void main(String []args)
    {
        InputStream ips=new FileInputStream("count.properties");            //导入相应的包              
        Properties props=new Properties();                                  //导入相应的包
        props.load(ips);
        ips.close();
    
        String className=props.getProperty("className");                    //获取配置文件中classNamed的值
        Collection cols=(Collection)Class.forName(className).newInstance(); //反射类调用构造方法创建对象
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值