黑马程序员技术交流社区

标题: 毕老师学习笔记之泛型2 [打印本页]

作者: 骑着毛驴去赶    时间: 2014-3-16 22:10
标题: 毕老师学习笔记之泛型2
本帖最后由 骑着毛驴去赶 于 2014-3-16 22:14 编辑

四:泛型接口
五:泛型限定
1.泛型中的<?>占位符
为什么要使用这个占位符那:例如当我们定义了两个不同类型的集合时,我们想要遍历这两个集合,我们就需要定义两个方法,两Iterator迭代器
试想,既然这两个方法的功能都是一样的我们可不可以定义一个方法一个迭代器来实现那?答案是肯定的,看实例:
  1. main;
  2. ArrayList<String> arr = new ArrayList<String>();
  3. arr.add("adb");
  4. ArrayList<Integer>arr1 = new ArrayList<Integer>();
  5. arr1.add(123);
  6. //定义遍历集合的方法
  7. public static void show(ArrayList<?> arr)
  8. {
  9. //定义迭代器
  10. Iterator<?> it =arr.iterator();
  11. while(it.hasNext())
  12. {
  13. sysout(it.next());
  14. }
  15. }
复制代码


解释:由实例我们可以看出我们在定义方法时在方法是参数里我们定义了一个带<?>占位符的ArrayList集合,同时迭代器也使用了该占位符
也就是说,当我们传入的参数不确定时,我们就使用这种方式来处理
当然我们也可以通过自定义泛型来实现,不过我们需要在方法中声明该泛型
例如:public static<T> void show(ArrayList<T> arr)
注意:当我们使用泛型时弊端就是我们不能使用传入类型的特有方法,因为我们传入的参入不明确
2.泛型限定
应用场景:当存在父子继承时,例如Person类和Student类,当我们创建了一个Person类的ArrayList集合并写出该集合的迭代器
进行遍历的方法,此时一切功能都不会出问题,可是当我们传入的是子类Student 的集合时就会反生错误,此时我们就需要通过泛型的限
定来实现
实例<1>:


  1. class Person
  2. {
  3. //省略getset方法
  4. }
  5. class Student extends Person
  6. {
  7. //省略getset方法
  8. }
  9. main:
  10. ArrayList<Person> arr = new ArrayList<Person>();
  11. arr.add(new Person());
  12. ArrayList<Student> arr1 = new ArrayList<Student>();
  13. arr1.add(new Student());
  14. //定义迭代器进行遍历
  15. public static void GenericShow(ArrayList<? extends Person> arr)
  16. {
  17. Iterator <? extends Person> it = arr.iterator();
  18. while(it.hasNext())
  19. {
  20. sysout(it.next().getName());
  21. }
  22. }
复制代码

解释:
①:方法public static void GenericShow(ArrayList<? extends Person> arr)中参数<>的含义是:该参数接受的
类型是Person类或者是继承子Person类的子类类型的集合(上限限定)
②:实例<? super E>可以接受E类型后E类型的父类类型(下限限定)
错误的形参:public static void GenericShow(ArrayList<Person> arr)当我们使用这种方式进行参数的接受时,只能接受Person
类的参数其子类是无法进行传递
3.利用泛型实现比较器
应用场景:当存在父子继承时,我们想要用一个比较器来实现父类和个个子类对象的比较,此时就用到了泛型和泛型的限定来实现
实例<3-1>:

  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;

  4. class Person
  5. {
  6. private String name;
  7. //省略构造器和getset方法
  8. Person(String name)
  9. {
  10. this.name=name;
  11. }
  12. public String getName()
  13. {
  14. return name;
  15. }

  16. }
  17. class Student extends Person
  18. {
  19. //省略构造器和getset方法
  20. Student(String name)
  21. {
  22. super(name);
  23. }

  24. }
  25. class Worker extends Person
  26. {
  27. //省略构造器和getset方法
  28. Worker(String name)
  29. {
  30. super(name);
  31. }

  32. }
  33. class GerenicDemo
  34. {
  35. public static void main(String[] args)
  36. {
  37. TreeSet<Person> ts1 = new TreeSet<Person>(new Comp());
  38. ts1.add(new Person("acb01"));
  39. ts1.add(new Person("acb02"));
  40. ts1.add(new Person("acb03"));
  41. TreeSet<Student> ts2 = new TreeSet<Student>(new Comp());
  42. ts2.add(new Student("sacb01"));
  43. ts2.add(new Student("sacb02"));
  44. ts2.add(new Student("sacb03"));
  45. TreeSet<Worker> ts3=new TreeSet<Worker>(new Comp());
  46. ts3.add(new Worker("wacb01"));
  47. ts3.add(new Worker("wacb03"));
  48. ts3.add(new Worker("wacb02"));

  49. GenericMethodf(ts1);
  50. GenericMethodf(ts2);
  51. GenericMethodf(ts3);
  52. }
  53. //定义遍历方法
  54. public static void GenericMethodf(TreeSet<? extends Person> arr)
  55. {
  56. Iterator<? extends Person> it = arr.iterator();
  57. while(it.hasNext())
  58. {
  59. System.out.println(it.next().getName());
  60. }
  61. }
  62. }
  63. //定义比较器
  64. class Comp implements Comparator<Person>
  65. {
  66. public int compare(Person p1,Person p2)
  67. {
  68. return p1.getName().compareTo(p2.getName());
  69. }
  70. }
复制代码

注意:我们调用的时候只能使用父类的方法例如:return p2.getName().compareTo().p2.getName();

六:Collection工具类
        1.Collection.sort(list)
                当我们在对list进行排序时,我们就用到了Collections工具类,Set集合的排序有了TreeSet的排序方法,但是
                list集合还没有专门的排序方法,所以Collections工具类就诞生了,
                Collection.sort(list)方法是对list的元素进行自然排序,如果想要进行自定义排序,则就需要定义一个比较器
                并实现Comparator接口中的comparator方法
                实例:

  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.List;

  6. /**
  7. * 利用比较器对list中的元素按字符串的长度
  8. * 进行排序
  9. * @author lenovo
  10. *
  11. */
  12. public class CllectionsSortDemo
  13. {
  14. public static void main(String[] args)
  15. {
  16. CollectionsStorMethod();
  17. }
  18. public static void CollectionsStorMethod()
  19. {
  20. List<String> list = new ArrayList<String>();
  21. list.add("aaaa");
  22. list.add("cedsg");
  23. list.add("bsbd");
  24. list.add("sbd");
  25. list.add("fbd");
  26. list.add("aa");
  27. sop("排序前:"+list);
  28. Collections.sort(list,new CollectionsSort());
  29. sop("排序后:"+list);
  30. }
  31. public static void sop(Object obj)
  32. {
  33. System.out.println(obj);
  34. }
  35. }
  36. class CollectionsSort implements Comparator<String>
  37. {
  38. public int compare(String obj1, String obj2) {
  39. if(obj1.length()<obj2.length())
  40. return -1;
  41. if(obj1.length()>obj2.length())
  42. return 1;
  43. return obj1.compareTo(obj2);
  44. }

  45. }
  46. 注意:只要是想实现对象间的比较就必须实现comparator或compareTo方法,不是用Comparator
  47. 接口就是Comparable接口
复制代码
2.Collections.max();//求集合中的最大值

  1. Collections.max(list);//当参数中不指定比较器的话,是按自然顺序获取最大值的
  2. 实例:
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6. import java.util.List;

  7. /**
  8. *
  9. * @author lenovo
  10. *
  11. */
  12. public class CollectionsMsxDemo
  13. {
  14. public static void main(String[] args)
  15. {
  16. CollectionsMaxMethod();
  17. }
  18. public static void CollectionsMaxMethod()
  19. {
  20. List<String> list = new ArrayList<String>();
  21. list.add("aaaa");
  22. list.add("cedsg");
  23. list.add("bsbd");
  24. list.add("sbd");
  25. list.add("fbd");
  26. list.add("aa");
  27. sop("排序前:"+list);
  28. Collections.max(list);
  29. sop("排序后:"+list);
  30. String max =Collections.max(list,new CollectionsSort());
  31. sop("最大值是:"+max);
  32. }
  33. public static void sop(Object obj)
  34. {
  35. System.out.println(obj);
  36. }
  37. }
  38. class CollectionsSort implements Comparator<String>
  39. {

  40. @Override
  41. public int compare(String obj1, String obj2) {
  42. // TODO Auto-generated method stub
  43. if(obj1.length()<obj2.length())
  44. return -1;
  45. if(obj1.length()>obj2.length())
  46. return 1;
  47. return obj1.compareTo(obj2);
  48. }

  49. }
复制代码

3.Collections.binarySearch();//查找指定元素在集合中的位置(使用二分查找法)
        注意要想使用Collections.binarySearch()方法进行list元素的查找,就必须要保证次list元素
        是按照一定的顺序进行排序的,否则查找结果会发生不正确现象
        实例:

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;

  4. /**
  5. *使用Collenctions.binarySearch()进行list元素的查找
  6. * @author lenovo
  7. *
  8. */
  9. public class CollectionsBinarySearchDemo
  10. {
  11. public static void main(String[] args)
  12. {
  13. binarySearchMethod();
  14. }
  15. public static void binarySearchMethod()
  16. {
  17. List<String> list = new ArrayList<String>();
  18. list.add("aaaa");
  19. list.add("cedsg");
  20. list.add("bsbd");
  21. list.add("sbd");
  22. list.add("fbd");
  23. list.add("aa");
  24. sop("排序前:"+list);
  25. Collections.max(list);
  26. sop("排序后:"+list);
  27. int index =Collections.binarySearch(list,"aaaa");
  28. sop("index:"+index);
  29. }

  30. public static void sop(Object obj)
  31. {
  32. System.out.println(obj);
  33. }

  34. }
  35. 解释:Collections.binarySearch(list,"")方法查找集合中的元素,放回的是该元素在集合中的位置从0开始
  36. 如果找到返回该元素的位置,没有找到返回负数(-(插入点) - 1)
  37. 解释:插入点:当前查找元素如果在集合中存在的话,其位置,即第一个大于此键的元素索引
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2