Java - 容器
本章学习,记住: 1 1 3 6(一张图、一个类、三个知识点、六个接口)
主要内容:
容器的概念:
容器 API:
Collection 接口:
重写 equals 方法,你应该也重写 hashCode 方法,这是为了程序执行效率着想!!!
补充说明:
Java中equals()和hashCode()有一个契约:
1. 如果两个对象相等的话,它们的hash code必须相等; (当对象被用做索引时,在比较其是否相等时,就会优先判断hashCode(),如果hashCode()都不相等,就不会去调用equals(),相当于:( A.hashCode()==B.hashCode() ) && ( A.equals(B) ),有短路效果!!!2. 但如果两个对象的hash code相等的话,这两个对象不一定相等。
1、自定义一个 hashCode() 方法是一个比较麻烦的事,与其不如用现成的,上图中实现 hashCode 方法就是用的 String 类已经实现了的,具体怎么实现我不去管它,Sun 公司已经帮我写好了。
2、有人又问了,Que:不是已经有 equals 方法了吗?为什么还要重写 hashCode 方法呢?Ans:若 equals 中比较的条件比较多或者比较的算法比较繁琐,这时用 equals 一个一个的比较,效率会很低,若先直接拿它 hashCode来作比较会增加比较的速度(附述一点:sun规定相等的对象应该具有相等的hash codes,这是前提,如上图红色标记!所以说如果hashCode都不相等就没有比较equals的必要了)。
3、有人又问了,Que:在什么时候使用这个hashCode 方法呢?Ans:当这个类的某个对象被当做索引(也就是key)的时候,一旦涉及到元素比较,Java运行时系统会优先调用hashCode方法进行比较,只有在hashCode相等的情况下,再去调用equlas方法进行比较,所以这样做效率大大的提升。
4、上图例子中重写java.lang.Object类的hashCode方法后,是用的Name类的firstName成员变量的hashCode作为hashCode返回(也就说我现在规定Name 类所new出来的实例对象之间判断是否相等的先决条件为:它们的firstName的hashCode一样),也可以规定多个(如果你想要把firstName和lastName的hashCode都一样视为相等的先决条件,这时返回值可以采用return firstName.hashCode() + lastName.hashCode();多个依此类推,把它们的hashCode全部相加,一并返回)。
5、所以有这样的总结:当类的对象做为索引时,需要比较类的两个实例是否一样:调用hashCode方法的优先级要比调用equlas方法高,编程时,hashCode相等一般为先决条件(先决条件:这里就要考虑返回哪些成员变量的hashCode之和了),只有在先决条件满足的情况下Java运行时系统才会调用equals方法,所以说equals的比较条件应该比hashCode的比较条件更为严格(至少要hashCode一样)。
Iterator 接口:
补充说明:这里的copy方法是将src容器中的元素下标0开始替换到dest容器中(dest容器中相应下标的位置的元素会被覆盖),而不是附加在dest之后;所有必须dest.size() > src.size(),否则抛出IndexOutOfBoundsException例外
map的key如果是字符型,识别大小写
Map 示例程序:统计不同的单词,并记录相同单词出现的次数