码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员——java基础---集合框架

时间:2015-07-16 02:05:13      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 

一、集合框架

  概念集合框架是Java中为了方便对集合进行存储、操作而形成的体系。集合是针对对象最常见的一种存储形式。

  数组和集合类同是容器,区别在哪里?
     相同点
               集合和数组都是容器,都可一存储对象(对象引用)。
     不同点
               数组长度固定,集合长度可变。
               数组可以存储基本数据类型,集合却只能存储对象;

  集合类的特点集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

   集合框架常用类关系图:

技术分享

  为什么会有这么多容器?

  答:因为每个容器对数据的存储方式都有所不同,这个存储方式就是常说的数据结构。

二、Collection接口  Collection 接口是集合框架中的顶层接口,所以其所有共性在其子接口中都可以得到体现。

  集合类中常用的方法:
      1、添加
       add(E e): 向集合中添加该元素。
            addAll(Collection<? extends E> c): 将指定集合中的所有元素都添加到此集合中。
      2、删除
        remove(Object o):从此集合中移除指定元素的单个实例,如果存在的话。
              removeAll(Collection<?> c):移除此集合中那些也包含在指定集合中的所有元素
            clear();清空集合中所有元素。
      3、判断
            contains(Object o): 判断集合中是否包含某个元素。
            containsAll(Collection<?> c):判断该集合是否包含另一集合中的所有元素。 
              isEmpty():判断集合是否为空。
      4、获取
                 iterator():返回在此集合的元素上进行迭代的迭代器。
                 size():获取集合长度。

     
5、取交集
             retainAll(Collection<?> c):保留本集合与另一集合的交集。  
      6、集合变数组
              toArray(T[] a) :返回包含此 collection 中所有元素的数组。

  注意:toArray(T[] a)返回数组的运行时类型与指定数组的运行时类型相同。此方法充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。如果指定的数组能容纳该 collection,则返回包含此 collection 元素的数组;否则,将分配一个具有指定数组的运行时类型和此 collection 大小的新数组;如果指定的数组能容纳 collection,并有剩余空间(即数组的元素比 collection 的元素多),那么会将数组中紧接 collection 尾部的元素设置为 null。所以数组长度与集合长度刚刚好最合适。
      因为Collection中有iterator()方法,所以每一个子类集合对象都具备迭代器。每个集合都具备取出的方式,而这个方式不足以用一个方法来描述,所以把取出动作封装成一个对象。因为数据结构不同,每个取出对象中取出的实现方式也不一样。取出的方式就通过类被描述。
     迭代器中的方法:
           next():返回迭代的下一个元素。
           hasNext():如果仍有元素可以迭代,则返回 true。
                 remove():从迭代器指向的 Collection 中移除迭代器返回的最后一个元素。
  注意
     1、迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration。迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException异常。迭代器的next方法返回值类型是Object,所以要记得类型转换。
     2、在迭代时循环中next调用一次,就要hasNext判断一次。next连续调用两次可能会发生NoSuchElementException异常。

三、List接口

  List接口是Collection的子接口。所以它在具备Collection共性的基础上,还有其自个儿的特性。它可以通过角标获取元素,也可以通过for循环获取元素。

    List特有方法

    1、添加
            add(int index,E element):在列表的指定位置插入指定元素。
                 addAll(int index, Collection<? extends E> c) :将指定 集合中的所有元素都插入到列表中的指定位置。
      2、删除
            remove(int index): 移除列表中指定位置的元素。
      3、修改
            set(int index, E element):用指定元素替换列表中指定位置的元素,返回以前在指定位置的元素。
  4、查找
             get(int index) :返回列表中指定位置的元素。
             subList(int fromIndex, int toIndex): 返回列表中指定的范围内的部分列表,含头不含尾。
             listIterator():返回此列表元素的列表迭代器。
                listIterator(int index):从列表的指定位置开始返回列表中元素的列表迭代器。

   ListIterator特有的方法
             add(E e):将指定的元素插入列表。
                previous():返回列表中的前一个元素。
                hasPrevious():如果逆向遍历列表,列表迭代器有多个元素,就返回 true。
                set(E e):用指定元素替换 next 或 previous 返回的最后一个元素。

四、Vector类和Enumeration接口

  Enumeration特有的方法

       hasMoreElements():测试此枚举是否包含更多的元素。
                nextElement():如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。

  可见其性能相当于迭代器,只不过方法比较少。

  Vector特有方法:

       elements() :返回此向量的组件的枚举。 返回的类型是Enumernation类型的。

  所以对于Vector来说有以下取出元素方式:

    1、for循环
    2、迭代器
    3、列表迭代器
    4、get方法,遍历for循环

    5、枚举

五、linkedList类

  概念底层数据结构是链表,查询慢,增删快,线程不安全,效率高。

  特有的方法

          addFirst(E e):将指定元素插入此列表的开头。
                addLast(E e):将指定元素添加到此列表的结尾。
                getFirst():返回此列表的第一个元素。
                getLast():返回此列表的最后一个元素。
                removeFirst():移除并返回此列表的第一个元素。
                removeLast():移除并返回此列表的最后一个元素。
      注意:获取元素的这些方法。如果集合中没有元素,会出现 NoSuchElementException异常。
      JDK1.6出现的新特性:
                offerFirst(E e)
                offerLast(E e)
                peekFirst()
                peekLast()
                pollFirst()
                pollLast()
     
用法与上面方法一致,但获取元素时,如果集合中没有元素,则会返回 null 。

LinkedList模拟队列代码:

 1 import java.util.LinkedList;
 2 
 3 public class LinkedListDemo {
 4 /*
 5  * 链表模队列,先进先出
 6  */
 7     public static void main(String[] args) {
 8         DuiLie dl = new DuiLie();
 9         dl.myAdd("aa");
10         dl.myAdd("bb");
11         dl.myAdd("cc");
12         dl.myAdd("dd");
13         
14         System.out.println(dl.myGet());
15     }
16 
17 }
18 
19 class DuiLie{
20     private LinkedList link;
21     
22     DuiLie(){
23         link = new LinkedList();
24     }
25     
26     public void myAdd(Object obj){
27         link.addFirst(obj);
28     }
29     
30     public Object myGet(){
31         return link.removeLast();
32     }
33     
34     public boolean isNull(){
35         return link.isEmpty();
36     }
37 }

 

六、ArrayList类

  概念:底层数据结构是数组,查询快,增删慢,线程不安全,效率高。是List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。

ArrayList去除重复对象代码:

 1 import java.util.ArrayList;
 2 import java.util.Iterator;
 3 
 4 public class ArrayListDemo {
 5 
 6     /**
 7      * 去除ArrayList的重复对象
 8      */
 9     public static void main(String[] args) {
10         ArrayList al = new ArrayList();
11         al.add("AA");
12         al.add("BB");
13         al.add("AA");
14         al.add("BB");
15         al.add("CC");
16         
17         System.out.println(getSingle(al));
18     }
19     public static ArrayList getSingle(ArrayList al){
20         ArrayList myAl = new ArrayList();
21         Iterator it = al.iterator();
22         while(it.hasNext()){
23             Object obj = it.next();
24             if(!myAl.contains(obj))
25                 myAl.add(obj);
26         }
27             return myAl;
28     }
29 }
30 /**
31  * 运行结果:[AA, BB, CC]
32  */

    上面比较的是字符串,所以可以成功。如果比较自定义对象时,那么就会失败。这是因为contains()方法底层是由equals()方法实现的,而Object类中的equals()方法比的是内存地址,所以我们如果相比较自定义对象,就需要复写equals()方法。

七、Set接口

  概念:一个不包含重复元素的 collection

     特点:

    1、无序(存入与取出的顺序不一致)

    2、唯一(存入集合的元素唯一)

八、HashSet类

  概念:不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

遍历HashSet代码:

 1 public class HashSetDemo 
 2  2 {
 3  3     public static void main(String[] args)
 4  4     {
 5  5         HashSet<String> hs = new HashSet<String>();
 6  6         hs.add("AA");
 7  7         hs.add("BB");
 8  8         hs.add("CC");
 9  9         hs.add("BB");
10 10         
11 11         for (String s : hs) 
12 12         {
13 13             System.out.println(s);
14 14         }
15 15     }
16 16 }
17 /*
18  *运行结果:
19  * BB
20  * AA
21  * CC 
22  */

 

HashSet中存储自定义对象代码:

 1 import java.util.*;
 2 public class HashSetDemo
 3 {
 4     public static void sop(Object obj)
 5     {
 6         System.out.println(obj);
 7     }
 8     public static void main(String[] args)
 9     {
10         HashSet hs = new HashSet();
11         //向HashSet集合中添加元素
12         hs.add(new Person("a1",11));
13         hs.add(new Person("a2",12));
14         hs.add(new Person("a3",13));
15         hs.add(new Person("a2",12));
16         //对集合进行迭代
17         Iterator it = hs.iterator();
18         while(it.hasNext())
19         {
20             Person p = (Person)it.next();           
21            
22             sop(p.getName()+"::"+p.getAge());
23         }
24     }
25 }
26 //定义一个Person类
27 class Person
28 {
29     private String name;
30     private int age;
31     public String getName()
32     {
33         return name;
34     }
35     public int getAge()
36     {
37         return age;
38     }
39     Person(String name,int age)
40     {
41         this.name = name;
42         this.age = age;
43     }
44     //覆盖hashCode方法
45     public int hashCode()
46     {
47         return name.hashCode()+age*3;
48     }
49     //这里的equals是复写Object类里的equals方法
50     public boolean equals(Object obj)
51     {
52         if(!(obj instanceof Person))
53             return false;
54         Person p = (Person)obj;
55         return this.name.equals(p.name) && this.age == p.age;
56     }
57     
58 }

     判断元素唯一性的方式:通过对象的hashCode和equals方法来完成元素唯一性

    如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。

    如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。

    如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

九、TreeSet类

  概念使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

demo代码:

 1 public class TreSetDemo 
 2 {
 3     public static void main(String[] args)
 4     {
 5         TreeSet<Integer> ts = new TreeSet<Integer>();
 6             ts.add(22);
 7             ts.add(17);
 8             ts.add(24);
 9             ts.add(19);
10             ts.add(18);
11             ts.add(20);
12             ts.add(18);
13             ts.add(23);
14         
15         
16         for(Integer i : ts)
17         {
18             System.out.print(i+" ");
19         }
20     }
21 }            
22 //运行结果:17 18 19 20 22 23 24 

 

 



           

 

黑马程序员——java基础---集合框架

标签:

原文地址:http://www.cnblogs.com/shadowW-W/p/4649914.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!