第十一天(集合框架)

来源:互联网 发布:win10如何卸载软件 编辑:程序博客网 时间:2024/06/17 09:14

   今天写较少,明日早上再续。因为看到这章将各种储存对象的引用的类,篇幅有点长,亦部分看了以后也只能明白一部分。

2011-05-30(集合框架)
1、Object中的toString()。先看一代码:

 本来正常情况下,println括号里面的东西是:a.toString(),但这里如此写是为了揭示一个编译器的行事方法:如果System.out.print()其中的引用不为空(为空直接打印null),则首先调用指向对象的toString()方法获取字符串。这也是println可以打印任何对象的原因。但是如果没有重写toString(),则自动调用Object类中的toString()打印,不过打印出来的结果不适合人来理解。
2、Object中的equals()。Object类中的实现代码如下:
由代码可以看出,Object类的的equals()并没有实现比较两个对象是否一样的功能,只是比较了引用是否指向同一对象。所以String类中的equals()方法时经过重写的。而前面提到,StringBuffer类中的equals()不能比较是否相同,说明这个类没有重写Object的equals()。
3、接下来是关于重写equals、hashCode两个方法的内容,该如何写此内容呢?因为我对此部分亦不熟悉。但从新瞄到本文的初衷:“笔记”,一切明了——只需摘抄部分自己任务要记住的部分。
I、重写equals()。这大概是与比较自定义的类的对象的比较。因为对象的的使用必读靠对象的引用来实现,所以对象内容的比较也是靠引用来实现的。而比较内容不是一件容易的事,需要遵循以下的步骤(在重写equals()的时候):
(1)测试引用是否为指向同一对象。这一把可以提高比较的性能。
(2)测试应用是否为null。我觉得1、2对换才对,不过书上是这样写得,可能改了不和原意。
(3)测试引用是否为本类的类型,或者是本类的子类的类型。这个当然要用instanceof关键词。这个使下面的比较有意义,也使下面不会运行错误。
(4)将传过来的引用强制转换为自己的类型,测试相关成员是否一样。
再给个例子,而后说明要注意的问题。

①equals方法的访问级别必须为public,因为Object类中的equals是public。②equals的参数类型必须为Objcet型,即是说任何类型的引用它都接受。若是类型为A,这不构成重写(因为Object中的equals就是Object),另一点是不能通过多态调用这个方法,失去灵活性。
II、重写hashCode()。重写了equals必须再重写hashCode()。否则就两个都不重写。与equals的关系是:①如果equals测试成立,则两个对象的返回的哈希码必然相同;②两个对象中的哈希码不同,则equals一定不成立。下面是个例子:
注意里面用了封装类Integer中静态工厂方法:valueOf()。这里不甚了解,书上说哈希表将来对象分类使其容易比较,其实我看只是将对象数字话,并没体现到分类这个动作。就这样过吧。
4、Ordered接口。还有一个接口是Sorted接口,均有排序之意,但语意上不同。Ordered是按某种有具体决定的情况的顺序进行排序,如先后顺序,是后天形成的顺序排列。Sorted是按天然的顺序进行排序,意味着可以按照某种先天规定的顺序历遍其中所以的元素。
按Ordered排序:ArrayList、Vector、LinkedList、List接口、LinkedHashSet;
按Sorted排序:TreeSet、TreeMap、SortedSed接口、SortedMap接口。

i、List接口。此接口继承Collection接口,其中元素按索引排序,实现这个接口的类都是属于Ordered类型。List中声明了很多实用的方法,如boolean add(Object o),void clear(),boolean contians(Object o),Object remove()。根据理解说几句吧:
(1)boolean add(Object o):将元素o(可可为null)添加到列表的尾部,操作成功返回true;
(2)boolean addAll(Collection c):与上面那个不同的是,这次添加的是一个集合(Collection接口是被很多像Vector的类实现的);
(3)boolean contains(Object o):是否含有o。当然对应的还有:boolean containsAll(Collection c);
(4)int indexOf(Object o):查找元素o,有则返回其索引,无则返回一负数。
(5)boolean retainAll(Collection c):将列表中有且c中没有的的元素移除。若有元素被移除,返回true。
(6)Object set(int index,Object o):将指定索引index中的元素换成o,成功后返回被替换的元素。
(7)Object[] toArray():将列表他中的元素装进对象数组中,顺序不变,返回改数组。
ii、ArrayList类。可添加包括null在内的所对象ide引用型元素,该类的对象引用自己亦可作为其中的元素。此类依赖数组,如果要进行大量的插入、删除操作,性能会很差。这个类是实现List接口的,方法基本是来自这个接口。考察下面代码:
                                              ArrayList al=new ArrayList();
                                              al.add(3);
                                              int i=al.get(0);
这里编译报错。因为在没有使用泛型(以后讲)的情况下,所有放进集合(实现Collection的类)元素取出来时,都是Object型的引用,需进行强制或类型转换。即,第三句改为:int i=(Integer)al.get(0)。当然,我们有自动解包打包,上面的三句是简写了很多,本来的写法应为:
                                              ArrayList al=new ArrayList();
                                              al.add(Integer.valueOf(3));
                                              int i=((Integer)al.get(0)).intValue();
即,放进去要引用类型,拿出来是Object型(没用泛型情况下),强行转换后是封装类,在使用使用各自的方法转化为基本数据类型。

 

明天再紧接着
 

原创粉丝点击