六、数组的反射 1、具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。数组字节码的名字:有[和数组对应类型的缩写,如int[]数组的名称为:[I 2、Object[]与String[]没有父子关系,Object与String有父子关系,所以new Object[]{“aaa”,”bb”}不能强制转换成new String[]{“aaa”,”bb”}; Object x =“abc”能强制转换成String x =“abc”。 3、如何得到某个数组中的某个元素的类型, 例: int a = new int[3];Object[] obj=new Object[]{”ABC”,1}; 无法得到某个数组的具体类型,只能得到其中某个元素的类型, 如: Obj[0].getClass().getName()得到的是java.lang.String。 4、Array工具类用于完成对数组的反射操作。 Array.getLength(Object obj);//获取数组的长度 Array.get(Object obj,int x);//获取数组中的元素 5、基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。 示例: [java] view plaincopy 1. package cn.itheima.Demo; 2. 3. import java.lang.reflect.Array; 4. import java.util.Arrays; 5. 6. public class ArrayReflect { 7. public static void main(String[] args) { 8. int [] a1 = new int[]{1,2,3}; 9. int [] a2 = new int[4]; 10. int[][] a3 = new int[2][3]; 11. String [] a4 = new String[]{"a","b","c"}; 12. System.out.println(a1.getClass().equals(a2.getClass()));//true 13. System.out.println(a1.getClass().equals(a3.getClass()));//false 14. System.out.println(a1.getClass().equals(a4.getClass()));//false 15. System.out.println(a1.getClass().getName());//[I 16. System.out.println(a4.getClass().getName());//[Ljava.lang.String; 17. System.out.println(a1.getClass().getSuperclass());//class java.lang.Object 18. System.out.println(a4.getClass().getSuperclass());//class java.lang.Object 19. 20. Object obj1=a1; 21. Object obj2=a3; 22. Object obj3=a4; 23. 24. // Object[] obj11=a1;//这样是不行的,因为a1中的元素是int类型,基本数据类型不是Object 25. Object[] obj13=a3; 26. Object[] obj14=a4;//这样可以,因为String数组中的元素属于Object 27. 28. System.out.println(a1);//[I@4caaf64e 29. System.out.println(a4);//[Ljava.lang.String;@6c10a234 30. System.out.println(Arrays.asList(a1));//[I@4caaf64e 31. System.out.println(Arrays.asList(a4));//[a, b, c] 32. 33. /* Arrays.asList()方法处理int[]和String[]时的差异。 34. * 打印Arrays.asList(a1);还是跟直接打印a1是一样的 35. 打印Arrays.asList(a4);就会把a3的元素打印出来。 36. 这是因为此方法在JDK1.4版本中,接收的Object类型的数组, 37. 而a3可以作为Object数组传入。但是a1不可以作为Object数组传入,所以只能按照JDK1.5版本来处理。 38. 在JDK1.5版本中,传入的是一个可变参数,所以a1就被当作是一个object,也就是一个参数, 39. 而不是数组传入,所以打印的结果还是跟直接打印a1一样。 40. */ 41. 42. //Array工具类用于完成对数组的反射操作。如打印任意数值 43. printObject(a1); 44. printObject(a4); 45. printObject("abc"); 46. 47. } 48. //打印任意数值 49. private static void printObject(Object obj) { 50. Class clazz=obj.getClass(); 51. //如果传入的是数组,则遍历 52. if(clazz.isArray()){ 53. int len =Array.getLength(obj);//Array工具类获取数组长度方法 54. for(int x=0;x<len;x++){ 55. System.out.println(Array.get(obj, x));//Array工具获取数组元素 56. } 57. } 58. else 59. System.out.println(obj); 60. } 61. } 七、HashCode的分析 覆写hashCode()方法的意义:只有存入的是具有hashCode算法的集合的,覆写hashCode()方法才有价值。 1、哈希算法的由来: 若在一个集合中查找是否含有某个对象,通常是一个个的去比较,找到后还要进行equals的比较,对象特别多时,效率很低。有这么一种HashCode算法,有一个集合,把这个集合分成若干个区域,每个存进来的对象,可以算出一个hashCode值,根据算出来的值,就放到相应的区域中去。当要查找某一个对象,只要算出这个对象的hashCode值,看属于第几个区域,然后到相应的区域中去寻找,看是否有与此对象相等的对象。这样查找的性能就提高了。 示意图: 2、要想HashCode方法有价值的话,前提是对象存入的是hash算法这种类型的集合当中才有价值。如果不存入是hashCode算法的集合中,则不用复写此方法。 3、如果没有复写hashCode方法,对象的hashCode值是按照内存地址进行计算的。这样即使两个对象的内容是想等的,但是存入集合中的内存地址值不同,导致hashCode值也不同,被存入的区域也不同。所以两个内容相等的对象,就可以存入集合中。 所以就有这样的说法:如果两个对象equals相等的话,你应该让他们的hashCode也相等。如果对象存入的不是根据hash算法的集合中,就不需要复写hashCode方法。
|