16.数据结构

集合与泛型

排序在Java中只是雕虫小技

ArrayList不是唯一的集合

  1. TreeSet 已有序状态保持并可防止重复
  2. HaspMap 可成对的name/value来保存与取出
  3. LinkedList 针对经常插入或删除中间元素所设计的高效率集合
  4. HashSet 防止重复的集合,可以快速地找寻相符的元素
  5. LinkedHashMap 类似HashMap,但可记住元素插入的顺序,也可以设定依照元素上次存取的先后来排序

泛型意味着更好的类型安全

关于泛型

  1. 创建被泛型化类
    1. new ArrayList();
  2. 声明与指定泛型类型的变量
    1. List songList = new ArrayList();
  3. 声明(与调用)取用泛型类型的方法
    1. void foo(List)
    2. x.foo(songList)

使用泛型的类

  1. 类的声明
  2. 新增元素方法的声明
    任何类型指代
    指明是元素

运用泛型的方法

  1. 使用定义在类声明的类型参数
    1. public class ArrayList Extends AbstractList
    2. public boolean add(E o)
  2. 使用未定义在类声明的类型参数
    1. public void takeThing(ArrayList list )

集合

  1. LIST 对付顺序的好帮手
  2. SET 独一无二的性质
  3. MAP 用key来搜索的专家

对象要怎样才算相等

  1. 引用相等
  2. 引用不相等,hashCode()和equals()相等

hashCode()与euqals()的相关规定

  1. 如果两个对象相等,则hashcode必须相等
  2. 如果两个对象相等,对其中一个对象调用equals必须返回true
  3. 如果两个对象有相同的hashcode,他们也不一定相等.但如果两个对象相等,则hashcode也必须相等
  4. 因此若equals被覆盖过,则hashCode也必须被覆盖
  5. hashCode的默认行为是堆在heap上的对象产生的独特值.如果你没有override过hashcode,则class的两个对象怎样都不会被认为是相同的
  6. equals的默认行为是执行==比较,也就是说回去测试两个引用是否对上heap上同一个对象.如果equals没有被覆盖过,两个对象永远都不会被视为是相同的,因为不同的对象有不同的字节组合

数组的类型是在运行期间检查的,但集合的类型检查只会发生在编译期间

万用字符

public void takeAnimal(ArrayList<? extends Animal> animals){}
注意:

在方法参数使用万用字符时,编译器会阻止任何可能被破坏引用参数所指集合的行为.你能够调用list中任何元素的方法,但不能加入元素.也就是说,你可以操作集合元素,但不能新增集合元素.如此才能保障执行期间的安全性,因为编译器会阻止执行期的恐怖行动
所以遍历可以,add不行

相同功能的另一种语法

  1. public void takeThing(ArrayList list)
  2. public void takeThing(ArrayList<? extends Animal> list)
  3. 区别
    1. 多个参数的时候的写法
      1. (ArrayList one,ArrayList two)
      2. (ArrayList<? extends Animal>one,ArrayList<? extends Animal> two)