No.8 聚合

No.8 集合
所有Collection都会透过其iterator()产生一个Iterator
常用容器: Collection( List, Set), Map()
List: 次序是List的最重要的特性;它保证以某种特定次序来维护元素.List会产生ListIterator,透过它你可以从两个方向来对List进行走访,也可以在List之内进行元素的安插和移除
      ArrayList: 以array方式实现的List.允许快速随机访问,但是当元素的安插或移除发生于List中央位置时,效率便很差,面对ArrayList,你应该只拿ListIterator来进行向后或向前走访动作,而不应该拿它来进行元素安插和移除动作,因为后者所花的代价远较LinkedList高昂
      LinkedList: 提供最佳顺序访问,以及成本低廉的[List中央位置元素安插和移除],随机访问动作则相对缓慢(如果想进行随机访问,请改用ArrayList).具备的方法: addFirst(), addLast(), getFirst(), getLast(), removeFirst(), removeLast()

Set: 它拥有和Collection一模一样的interfaces,所以它不像上述两种lists一样地有额外功能.Set就是一个Collection,只不过其行为不同罢了(这是继承和多型的理想运用方式: 展现不同行为).Set拒绝持有重复的元素实值(value),并不保证以任何特定次序来维护其元素
Set需要某种方式以维护其元素次序,这意味你必须实现Comparable 接口,并定义compareTo()
使用HashSet和TreeSet时,你都得为你的class定义equals(),但只有当你的class将被置于HashSet时,才一定得定义hashCode()
Map: 维护key-value的关联性,使你可以使用key来搜寻value
    put(Object key, Object value): 会将value加入,并将它关联至key.
    get(Object key): 会传回key所对应的value. 你也可以使用containsKey()和containsValue()来检查Map内是否含有某个key和某个value
    HashMap: 不是缓慢地逐一搜寻某个key,而会使用hash code(将物件内的某些资讯转换为几乎独一无二的int)用以代表那个物件,利用hashCode()来快速找到key

你无法将基本数据类型置入容器内,只有object reference才行
如果你在HashMap中使用你自己撰写的classes作为key,你一定得同时覆写hashCode()和equals().因为,Object的hashCode()会被用来产生每个对象的hash code,而且在预设情况下它直接使用其对象的内存位址,HashMap会通过equals(),试着判断你所给定的key是否等于表格中的某个key,而Objects.equals()只会比较对象的内存位址