A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© viliv715 中级黑马   /  2014-9-2 20:26  /  1126 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 viliv715 于 2014-9-2 20:29 编辑

集合框架和泛型
一、集合框架
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合同是容器,有何不同?
数组虽然也可以存储对象,但是长度是固定的,而集合的长度是可变的。数组中可以存储基本数据类型,但集合只能存储对象。
集合类的特点:
集合只能用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合类关系图:重点掌握部分黑框表示。


为什么容器有这么多的划分?
因为每一个容器中对数据存储的方式不同,也就是说数据结构不同。
1、collection单列集合
Collection(参照CollectionDemo.java)
|---List(参照ListDemo.java):元素是有序的,元素可以重复,因为该集合体系有索引。
|---ArrayList(参照CollectionDemo.java或ListDemo.java):底层使用数组结构,查询速度快,增删速度较慢。线程不同步。
|---LinkedList(参照LinkedListDemo.java):使用链表结构,增删速度快,查询较慢,线程不同步。
|---Vector(参照VectorDemo.java):底层使用的是数组结构,线程同步,被ArrayList取代。
|---Set:元素是无序(存入和取出的顺序不一定一致)的,元素不可以重复。
|---HashSet(参照HashSetDemo.java)底层数据结构式哈希表。
|   |--元素唯一性的原因:通过hashCode和equals方法判断,如果hashCode值不同不调
|            用equals,hashCode值相同,调用equals方法。对于判断元素是否存在,以及删
|            除操作,也是依赖于hashCode和equals方法。线程不同步。
|---TreeSet(参照TreeSetDemo.java)底层数据结构式二叉树。可以对集合中的元素进行排序。线
程不同步。
|--元素唯一性原因:用compareTo方法比较。
|--TreeSet排序方式1:让元素自身具备比较性,元素需要实现Comparable接口并要
覆盖compareTo方法。
|--TreeSet排序方式2:当元素自身不具备比较性或者比较性不是所需要的,这时候需
要让集合容器自身具有比较性。定义一个类实现comparator接口并覆盖
compare方法。两种比较方法都存在以该比较器为主。
2、Map:双列集合,该集合存储的是键值对,一对对的存储,且必须保证键的唯一性。
Map:
|---HashTable:底层是哈希表结构,不允许使用NULL的键和值,该集合是同步的。
|---HashMap:底层是哈希表结构,允许使用NULL的键和值,该集合是不同步的。
|---TreeMap:底层是二叉树结构,线程不同步。可以用于给Map集合中的键进行排序。
二、泛型
JDK1.5之后,为了解决安全问题出现的新特性。
泛型优点:
         将运行时期出现的问题转移到了编译时期,方便解决。
         避免了类型的强制转换
泛型格式:
通过<>来定义要操作的类型,泛型定义在方法上时,写在返回值类型的前面,修饰符的后面。
泛型使用范围:
通常用在集合框架中,只要出现<>就要定义泛型。
泛型类和泛型方法:参考GenericMethodDemo.java
泛型接口:参考GenericInterDemo.java
泛型限定:参考GenericLimitDemo.java
代码实例:
CollectionDemo.java
  1. package day14;
  2. //collection常用方法
  3. import java.util.*;

  4. public class CollectionDemo {

  5.         public static void main(String[] args) {
  6.                
  7. //                baseMethod();
  8. //                advMethod();
  9. //                getMethod();
  10.         }
  11.         //基本方法
  12.         public static void baseMethod()
  13.         {
  14.                 // 创建一个集合容器,使用collection接口的子类ArrayList
  15.                 ArrayList al = new ArrayList();
  16.                 //添加元素
  17.                 //add方法的参数类型是object,便于接收任意类型对象;集合中存储的都是对象的引用(地址)
  18.                 al.add("java1");
  19.                 al.add("java2");
  20.                 al.add("java3");
  21.                 al.add("java4");
  22.                 //获取集合长度
  23.                 sop("size:" + al.size());
  24.                 //打印
  25.                 sop(al);
  26.                 //删除元素
  27.                 al.remove("java2");
  28.                 //清空集合
  29.                 al.clear();               
  30.                 //判断元素
  31.                 sop("判断java1是否存在:"+al.contains("java1"));
  32.                 sop("判断集合是否为空:"+al.isEmpty());
  33.         }
  34.         //其他方法
  35.         public static void advMethod()
  36.         {
  37.                 ArrayList al1 = new ArrayList();
  38.                 al1.add("java1");
  39.                 al1.add("java2");
  40.                 al1.add("java3");
  41.                 al1.add("java4");
  42.                
  43.                 ArrayList al2 = new ArrayList();
  44.                 al2.add("java1");
  45.                 al2.add("java3");
  46.                 al2.add("java5");
  47.                 al2.add("java6");
  48.                 //取交集:al1与al2的交集存放到al1中
  49.                 al1.retainAll(al2);
  50.                 sop("al1"+al1);
  51.                 sop("al2"+al2);
  52.                
  53.         }
  54.         //迭代器方法:是集合取出元素的方式
  55.         public static void getMethod()
  56.         {
  57.                 ArrayList al = new ArrayList();
  58.                 al.add("java1");
  59.                 al.add("java2");
  60.                 al.add("java3");
  61.                 al.add("java4");
  62.                 //获取迭代器,用于取出集合中的元素,在迭代时next调用一次就要判断一次hasNext。
  63.                 //while方式
  64.                 Iterator it = al.iterator();
  65.                 while(it.hasNext())//判断是否存在下一个元素
  66.                         sop(it.next());//返回下一个元素
  67.                 //for方式:it2属于for内部,循环完释放空间。
  68.                 for(Iterator it2 = al.iterator();it2.hasNext();)
  69.                         sop(it2.next());
  70.                
  71.         }
  72.         public static void sop(Object obj){
  73.                 System.out.println(obj);
  74.         }

  75. }
复制代码


9 个回复

倒序浏览
ListDemo.java

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. import java.util.ListIterator;
  5. /*
  6. List特有方法:凡是可以操作角标的方法都是该体系特有的方法

  7.         add(index,element)指定位置添加元素
  8.         addAll(index,collection)指定位置添加集合

  9.         remove(index)删除指定位置元素

  10.         set(index,element):修改指定位置元素

  11.         get(index):获取指定位置元素
  12.         subList(from,to):获取子集,包含头不包含尾
  13.         listIterator():List特有的迭代器,是Iterator的子接口。在迭代时不可以通过集合对象的
  14.         方法操作集合中的元素,会发生并发修改异常。所以在迭代时,只能用迭代器的方法操作元素,可是
  15.         Iterator的方法是有限的,只能对元素进行判断,取出和删除,如果想要其他的操作,如添加修改等
  16.         就需要使用其子接口listIterator,该接口只能通过List集合的listIterator方法获取
  17. 注意:List集合判断元素是否相同,依据的是元素的equals方法,contains和remove方法在底层都是
  18.         调用equals方法,自定义元素判断时需要复写equals方法。
  19. */
  20. public class ListDemo {

  21.         public static void main(String[] args) {
  22.                 // TODO Auto-generated method stub
  23. //                method();
  24.                 itmethod();
  25.         }
  26.        
  27.         //list基本方法
  28.         public static void method(){
  29.                 ArrayList al = new ArrayList();
  30.                 al.add("java1");
  31.                 al.add("java2");
  32.                 al.add("java3");
  33.                 //在指定位置添加元素
  34.                 al.add(1,"java9");
  35.                 //删除指定位置的元素
  36.                 al.remove(2);
  37.                 //修改元素
  38.                 al.set(2, "java7");
  39.                 //通过角标获取元素
  40.                 sop(al.get(1));
  41.                 //获取所有元素
  42.                 //方法1
  43.                 for(int x=0;x<al.size();x++)
  44.                 {
  45.                         sop(al.get(x));
  46.                 }
  47.                 //方法2
  48.                 Iterator it =al.iterator();
  49.                 while(it.hasNext())
  50.                 {
  51.                         sop(it.next());
  52.                 }
  53.                 //通过indexOf获取对象的位置
  54.                 sop("indexOf"+al.indexOf("java7"));
  55.                 //获取子List
  56.                 List sublist = al.subList(0,2);
  57.                 sop("sublist:"+sublist);
  58.                
  59.         }
  60.        
  61.         //列表迭代器
  62.         public static void itmethod(){
  63.                 ArrayList al = new ArrayList();
  64.                 al.add("java1");
  65.                 al.add("java2");
  66.                 al.add("java3");
  67.                
  68.                 ListIterator li = al.listIterator();
  69.                 while(li.hasNext())
  70.                 {
  71.                         Object obj = li.next();
  72.                         if(obj.equals("java2"))
  73.                         {
  74.                                 li.add("java9");
  75.                         }
  76.                 }
  77.                 //判断是否有前一个元素,与hasNext相反
  78.                 sop("hasPrevious:"+li.hasPrevious());
  79.                 sop(al);
  80.         }

  81.         public static void sop(Object obj){
  82.                 System.out.println(obj);
  83.         }
  84. }
复制代码

LinkedListDemo.java

  1. import java.util.*;
  2. /*
  3. LinkedList特有方法:
  4.         addFirst():添加元素到头部
  5.         addLast():添加元素到尾部
  6.         注意:以下四个方法若列表为空,返回NoSuchElementException异常
  7.         getFirst():获取第一个元素但是不删除元素
  8.         getLast():获取最后一个元素但是不删除元素
  9.         removeFirst():获取第一个元素并删除元素
  10.         removeLast():获取最后一个元素并删除元素
  11. JDK1.6后新增方法,建议用新增方法替代上述方法
  12.         offerFirst():添加元素到头部
  13.         OfferLast():添加元素到尾部
  14.         注意:以下四个方法若列表为空,返回NULL
  15.         peekFirst():获取第一个元素但是不删除元素
  16.         peekLast():获取最后一个元素但是不删除元素
  17.         pollFirst():获取第一个元素并删除元素
  18.         pollLast():获取最后一个元素并删除元素
  19. */
  20. public class LinkedListDemo {

  21.         public static void main(String[] args) {
  22.                 LinkedList link = new LinkedList();
  23.                 //在头部添加元素
  24.                 link.addFirst("java1");
  25.                 link.addFirst("java2");
  26.                 //在尾部添加元素
  27.                 link.addLast("java3");
  28.                 link.addLast("java4");
  29.                 sop(link);
  30.                 //获取第一个元素
  31.                 sop(link.getFirst());
  32.                 //获取最后一个元素
  33.                 sop(link.getLast());
  34.                 //删除第一个元素
  35.                 sop(link.removeFirst());
  36.                 //删除最后一个元素
  37.                 sop(link.removeLast());
  38.                 //获取集合长度
  39.                 sop("size:"+link.size());
  40.                
  41.                 //特有方法清空集合
  42.                 while(!link.isEmpty())
  43.                 {
  44.                         sop(link.removeFirst());
  45.                 }
  46.                
  47.         }
  48.        
  49.         public static void sop(Object obj){
  50.                 System.out.println(obj);
  51.         }

  52. }
复制代码

VectorDemo.java


  1. import java.util.Enumeration;
  2. import java.util.Vector;

  3. public class VectorDemo {

  4.         public static void main(String[] args) {
  5.                 Vector v = new Vector();
  6.                 v.add("java1");
  7.                 v.add("java2");
  8.                 v.add("java3");
  9.                 v.add("java4");
  10.                 //枚举是vector特有的取出方式。因为枚举的名称过长,被迭代器锁取代。
  11.                 Enumeration en = v.elements();
  12.                 while(en.hasMoreElements())
  13.                 {
  14.                         sop(en.nextElement());
  15.                 }
  16.         }

  17.         public static void sop(Object obj){
  18.                 System.out.println(obj);
  19.         }
  20. }
复制代码

HashSetDemo.java


  1. import java.util.HashSet;
  2. import java.util.Iterator;

  3. public class HashSetDemo {

  4.         public static void main(String[] args) {
  5. //                method_1();
  6.                 method_2();
  7.         }
  8.         //查看hashset基本特点,无需无重复元素。
  9.         public static void method_1(){
  10.                 HashSet hs = new HashSet();
  11.                 //添加数据,重复的数据不存储。
  12.                 sop(hs.add("java1"));
  13.                 sop(hs.add("java1"));
  14.                 hs.add("java2");
  15.                 hs.add("java3");
  16.                 hs.add("java4");
  17.                 hs.add("java4");

  18.                 Iterator it = hs.iterator();
  19.                 //打印出的数据时无序的
  20.                 while(it.hasNext())
  21.                 {
  22.                         sop(it.next());
  23.                 }
  24.         }
  25.        
  26.         //去除自定义对象的重复元素
  27.         public static void method_2(){
  28.                 HashSet hs = new HashSet();
  29.                
  30.                 hs.add(new Person("a1", 11));
  31.                 hs.add(new Person("a1", 11));
  32.                 hs.add(new Person("a2", 12));
  33.                 hs.add(new Person("a3", 13));
  34.                 hs.add(new Person("a4", 14));
  35.                
  36.                 Iterator it = hs.iterator();
  37.                
  38.                 while(it.hasNext())
  39.                 {
  40.                         Person p = (Person)it.next();
  41.                         sop(p.getName()+"----"+p.getAge());
  42.                 }       
  43.         }
  44.        
  45.         public static void sop(Object obj){
  46.                 System.out.println(obj);
  47.         }
  48. }
  49. class Person
  50. {
  51.         private String name;
  52.         private int age;
  53.         public Person(String name,int age) {
  54.                 this.name=name;
  55.                 this.age=age;
  56.         }
  57.         public int hashCode()
  58.         {
  59.                 return name.hashCode()+age;
  60.         }
  61.         public boolean equals(Object obj)
  62.         {
  63.                 if(!(obj instanceof Person))
  64.                         return false;
  65.                 Person p = (Person)obj;
  66.                 return this.name.equals(p.name)&&this.age==p.age;
  67.         }
  68.        
  69.         public String getName()
  70.         {
  71.                 return name;
  72.         }
  73.        
  74.         public int getAge()
  75.         {
  76.                 return age;
  77.         }
  78. }
复制代码

TreeSetDemo.java


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

  4. import javax.swing.SwingConstants;

  5. public class TreeSetDemo {

  6.         public static void main(String[] args) {
  7. //                TreeSet ts = new TreeSet();
  8.                 //排序方式2
  9.                 TreeSet ts = new TreeSet(new MyCompare());
  10.                
  11.                 ts.add(new Student("lisi8", 21));
  12.                 ts.add(new Student("lisi8", 24));
  13.                 ts.add(new Student("lisi2", 22));
  14.                 ts.add(new Student("lisi3", 23));
  15.                 ts.add(new Student("lisi5", 23));
  16.                 ts.add(new Student("lisi4", 24));
  17.                
  18.                 Iterator it = ts.iterator();
  19.                 while(it.hasNext())
  20.                 {
  21.                         Student stu = (Student)it.next();
  22.                         sop(stu.getName()+"----"+stu.getAge());
  23.                 }       
  24.         }
  25.        
  26.         public static void sop(Object obj){
  27.                 System.out.println(obj);
  28.         }
  29. }

  30. //排序方式1:让元素自身具备比较性,元素需要实现Comparable接口并要覆盖compareTo方法。
  31. class Student implements Comparable//该接口强制让学生具备比较性
  32. {
  33.         private String name;
  34.         private int age;
  35.        
  36.         Student(String name,int age){
  37.                 this.name = name;
  38.                 this.age = age;
  39.         }
  40.        
  41.         public String getName() {
  42.                 return name;
  43.         }
  44.        
  45.         public int getAge() {
  46.                 return age;
  47.         }
  48.        
  49.        
  50.         public int compareTo(Object obj){
  51.                 if(!(obj instanceof Student))
  52.                         throw new RuntimeException("不是学生对象");
  53.                 Student stu = (Student)obj;
  54.                
  55.                 if(this.age>stu.age)
  56.                         return 1;
  57.                 if(this.age==stu.age)
  58.                         //主要条件相同时比较次要条件。String复写了compareTo
  59.                         return this.name.compareTo(stu.name);
  60.                 return -1;
  61.                 //return this.age-stu.age;
  62.         }
  63. }

  64. //排序方式2:当元素自身不具备比较性或者比较性不是所需要的,这时候需
  65. //要让集合容器自身具有比较性
  66. class MyCompare implements Comparator//该接口强制让学生具备比较性
  67. {
  68.         public int compare(Object o1,Object o2){
  69.                 Student s1=(Student)o1;
  70.                 Student s2=(Student)o2;
  71.                
  72.                 int num = s1.getName().compareTo(s2.getName());
  73.                 if(num == 0)
  74.                 {
  75. //                        if(s1.getAge()>s2.getAge())
  76. //                                return 1;
  77. //                        if(s1.getAge()==s2.getAge())
  78. //                                return 0;
  79. //                        return -1;
  80.                         return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  81.                 }
  82.                 return num;
  83.         }
  84.         //不用覆盖equals方法,object已经实现了equals方法。
  85. }
复制代码

回复 使用道具 举报
GenericMethodDemo.java

  1. /*泛型方法
  2. 泛型类定义的泛型,在整个类中有效,那么泛型类的对象明确要操作的类型后
  3. 所要操作的类型就已经固定了。为了让不同方法可以操作不同类型,而且类型
  4. 还不确定,那么可以将泛型定义在方法上,既是泛型方法。
  5. */
  6. public class GenericMethodDemo {

  7.         public static void main(String[] args) {
  8.                 Demo<String> d = new Demo<String>();
  9.                 d.show("show string");
  10.                 d.print("print string");
  11.                 d.print(new Integer(5));
  12.                 d.method("hiehei");
  13.         }

  14. }
  15. //泛型方法和泛型类可以同时定义。
  16. class Demo <T>
  17. {
  18.         public void show(T t){
  19.                 System.out.println(t);
  20.         }
  21.         public <Q> void print(Q t){
  22.                 System.out.println(t);
  23.         }
  24.         //public static void method(T t)
  25.         //特殊点:静态方法不可以访问类上定义的泛型。
  26.         //如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
  27.         public static <W> void method(W w)
  28.         {
  29.                 System.out.println(w);
  30.         }
  31. }
复制代码

GenericInterDemo.java

  1. //泛型接口
  2. public class GenericInterDemo {

  3.         public static void main(String[] args) {
  4.                 InterImpl<Integer> i = new InterImpl<Integer>();
  5.                 i.show(6);
  6.         }

  7. }
  8. interface Inter<T>
  9. {
  10.         void show(T t);
  11. }

  12. class InterImpl<T> implements Inter<T>
  13. {
  14.         public void show(T t) {
  15.                 System.out.println(t);
  16.         }
  17. }
复制代码

GenericLimitDemo.java


  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. /*
  4. ?是通配符,也可以理解为占位符。
  5. ? extends E:可以接受E类型或者E的子类型。
  6. ? super E:可以接受E类型或者E的父类型。
  7. */
  8. public class GenericLimitDemo {

  9.         public static void main(String[] args) {
  10.                 ArrayList<Person> al = new ArrayList<Person>();
  11.                 al.add(new Person("aaa1"));
  12.                 al.add(new Person("aaa2"));
  13.                 al.add(new Person("aaa3"));
  14.                 printColl(al);
  15.                 ArrayList<Student> al2 = new ArrayList<Student>();
  16.                 al2.add(new Student("bbb1"));
  17.                 al2.add(new Student("bbb2"));
  18.                 al2.add(new Student("bbb3"));
  19.                 printColl(al2);
  20.         }
  21.        
  22.         public static void printColl(ArrayList<? extends Person> al){
  23.                 Iterator<? extends Person> it = al.iterator();
  24.                
  25.                 while(it.hasNext())
  26.                 {
  27.                         System.out.println(it.next().getName());
  28.                 }
  29.         }

  30. }

  31. class Person
  32. {
  33.         private String name;
  34.         Person(String name){
  35.                 this.name = name;
  36.         }
  37.        
  38.         public String getName(){
  39.                 return name;
  40.         }
  41. }
  42. class Student extends Person
  43. {
  44.         Student(String name)
  45.         {
  46.                 super(name);
  47.         }
  48. }
复制代码
回复 使用道具 举报
我是来看楼主头像的,强迫症的伤不起!!
回复 使用道具 举报
很详细啊 ,看看吧,
回复 使用道具 举报
我勒个去
回复 使用道具 举报
挺好的,不错
回复 使用道具 举报

帖子最大字数10000 放不下 只能在楼下回复了 回复框那么小 贴代码好麻烦啊
回复 使用道具 举报
☆枫の云 发表于 2014-9-2 20:54
我是来看楼主头像的,强迫症的伤不起!!

要的就是这个感觉--倍儿爽!
回复 使用道具 举报
我那个去,就是毕老师笔记的搬抄
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马