16.集合与泛型

2017-09-19  本文已影响0人  ccc_74bd
  1. 除了ArrayList外还有这些集合
  1. 可以用TreeSet或Collections.sort( )方法对数组进行按字母排序
  2. toString( )
public String toString(){ 
return title;
}
  1. 为什么要用泛型?(带有<>的就是泛型)
  1. 泛型使用须知
    (1)创建被泛型化类(如ArrayList)的实例new ArrayList<Song>();
    (2)声明与指定泛型类型的变量List<Song> songList = new ArrayList<Song>();
    (3)声明(与调用)取用泛型类型的方法。void foo(List<Song> list);
    6.ArrayList的说明文件
public class ArrayList<E> extends AbstractList<E> implements List<E>...{
  E部分会用你所声明与创建的真正类型来替代
public boolean add(E o);//E用来指示可以加入ArrayList的元素类型
}E代表用来创建与初始ArrayList的类型,当你看到ArrayList文件上的E时,就可以把它换成实际上的类型
  1. 使用泛型的方法
public class ArrayList<E> extends AbstractList<E>...{
        public boolean add(E o);只能在此使用E,因为它已经被定义成类的一部分
public <T extends Animal> void takeThing(ArrayList<T> list)
可以传入Animal或任何Animal的子型(如Cat或Dog),可以使用ArrayList<Dog>来调用该方法
  1. sort()方法只能接受Comparable对象的list。
public static <T extends Comparable<?  super T>> void sort(List<T> list)
             这表示它必须是Comparable           仅能传入继承Comparable的参数化类型的list

因此,只要让要排序的类(比如Song)实现Comparable就行了

class Song implements Comparable<Song>{
        public int comparaTo(Song s){
                return title.compareTo(s.getTitle());
用compareTo()方法将执行方法的Song与传入的Song比较并输出
  1. int compareTo(T o)
    比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
  2. Comparator
  1. compareTo()与Caomparator比较
class ArtistCompare implements Comparator<Song>{
        public int Compare(Song one,Song two){
        return one.getArtist().compareTo(two.getArtist());
    }              这会返回String ,以String来比较
}
public void go(){
...
        ArtistCompare artistCompare = new AritstCompare();
        Collections.sort(songList,artistCompare);
}

2

  1. 如何解决数据重复——用Set集合
  2. 集合中的三个主要接口——List Set Map
  1. 对象怎样才算相等?
  1. 覆盖过hashCode()equals()的Song类
public boolean equals(Object aSong){  //aSong是要被比较的对象
        Song s = (Song) aSong;
        return getTitle().equals(s.getTitle));
}//因为歌名是String,且String本来就覆盖过的equals(),所以我们可以调用它
public int hashCode(){
        return title.hashCode();
}//String也有覆盖过的hashCode(),注意到hashCode()与equals()使用相同的实例变量
  1. hashCodeequals()的相关规定
  1. TreeSet
    TreeSet在防止重复上面与HashSe一样。但它还会一直保持集合处于有序状态
public void go(){  //调用没有参数的构造函数来用TreeSet
...                //取代HashSet意味着以对象的compareTo()方法来进行排序
TreeSet<Song> songSet = new TreeSet<Song>();
songSet.addAll(songList);
}
  1. TreeSet的元素必须是Comparable
    要使用TreeSet,下列其中一项必须为真
class Book implements Comparable{
        String title;
        public Book(String t){
                title = t;
        }
        public int compareTo(Object b){
                Book book = (Book) b;
                return (title.compareTo(book.title));
        }
}
public class BookCompare implements Comparator<Book>{
      public int compare(Book one,Book two){
          return (one.title.compareTo(two.title));
      }
}
class Test{
        public void go(){
                BookCompare bCompare = new BookCompare();
                TreeSet<Book> tree = new TreeSet<Book>(bCompare);
        }
  1. Map
    Map中的元素实际上是两个对象:关键字和值,值可以重复,但是key不行
public static void main(String[] args){//hashMap需要两个参数,关键字和值
        hashMap<String,Integer> scores = new hashMap<String,Integer>();
        scores.put("kathy",42);
        scores.put("Bert",343);//使用put()取代add(),它需要两个参数
        System.out.println(scores);
        System.out.println(scores.get("Bert"));//get()取用关键字参数,返回它的值
}
  1. 数组的类型是在运行期间检查的,但集合的类型检查只会发生在编译期间
  2. 万用字符<?>
public void takeAnimals(ArrayList<? extends Animals> animals) {
...}       //此处的extends同时代表继承和实现
  1. 相同功能的另一种语法
public <T extends Animal> void takeThing(ArrayList<T> list)
public <T extends Animals> void takeThing(ArrayList<T> one,ArrayList<T> two)

而不必这样

public void takeThing(ArrayList<? extends Animal> one,ArrayList<? extends Animals> two)
上一篇 下一篇

猜你喜欢

热点阅读