`

集合与泛型

 
阅读更多
ArrayList

TreeSet
以有序状态保持并可防止重复

HashMap
可用成对的key/value来保存与取出

LinkedList
针对经常插入或删除中间元素所设计的高效率集合(实际上ArrayList还是比较实用)

HashSet
防止重复的集合,可快速地找寻相符的元素

LinkedHashMap
类似HashMap,但可记住元素插入的顺序,也可以设定成依照元素上次存取的先后来排序。

songList = new ArrayList<Song>()//Song是一个类;
Collections.sort(songList);//参数是List接口,而List中的元素必须是实现了Comparable接口的

为了让以上代码通过编译,则需要让Song实现Comparable接口,代码如下
class Song implemets Comparable<Song>{
    String title;
    ...
    public int compareTo(Song s)
    {
        return title.compareTo(s.getTitle());//String已经实现了Comparable
    }
}


调用单一参数的sort(List 0)方法代表由List元素上的compareTo()方法来决定顺序。因此元素必须要实现Comparable这个接口。
调用sort(List o,Comparator c)方法代表不会调用List元素的compareTo()方法,而会使用Comparator的compare()方法。这意味这List元素不需要实现Comparable接口。
class ArtistCompare implements Comparator<Song>
{
    public int compare(Song one,Sone two)
    { 
       return one.getArtist().compareTo(two.getArtist());
    }
}


3个主要接口
List 知道索引位置的集合,知道某物在系列集合中的位置,可以有多个元素引用相同的对象。
Set 注重独一无二的性质,不会有多个元素引用相同的对象。
Map key不能重复,典型的key会是String,但也可以是任何对象。

对象相等性
如果你想要把两个不同的对象是为相等的,就必须覆盖过从Object继承下来的hashCode()方法与equals()方法。
HashSet检查重复时,先检查hashCode()(用它先筛),若没有相同的,则不重复;若相同,则用equals方法确认(因为不同对象的hashCode可能相同)。

两个对象相等(equals()),则hashCode必须相等。因此如果equals()被覆盖,则hashCode()也必须被覆盖。


如果想要保持有序,使用TreeSet。TreeSet的元素必须实现Comparable或者用带Comparator参数的构造方法来创建TreeSet。

使用多态参数与泛型
数组参数:
public void takeAnimals(Animal[] animals)
{
   ...
}
takeAnimals(animals);//Animal的对象的数组
takeAnimals(dogs);//Dog是Animal的子类,dogs是Dog数组,也合法,但是Cat也可能会混入数组了,因为编译器看来,数组是Animal的,单个元素可以赋值Cat,但编译不会报错,倘若Cat真的进来了,运行期会报错,因为数组实际上是Dog数组。


集合参数:
public void takeAnimals(ArrayList<Animal> animals)
{
   ...
}
takeAnimals(animals);//ArrayList<Animal>,合法
takeAnimals(dogs);//ArrayList<Dog>,不合法,因为这样有可能导致Dog的集合里混入Cat。。。

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

//这样就可以传子类参数了,但是这样的话,编译器不允许加入任何东西到集合中,好吧,这样Cat就进不来了。也可以写成public<T extends Animal> void takeAnimals(ArrayList<T> list),这是为了参数多时,书写麻烦,只需一次声明就好了。
public void takeAnimals(ArrayList<? extends Animal> animals)
{
   ...
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics