JAVA集合类框架

  351人阅读  评论(0)  收藏  举报

1 问题提出

       通常,程序总是根据运行时才知道的某些条件去创建新对象。在此之前,不会知道所需对象的数量,甚至不知道确切的类型。如何解决这个问题呢?即如何在任意时刻和任意位置创建任意数量的对象?

Java类库提供了一套完整的容器类/集合类来解决这个问题。


JAVA集合类框架_第1张图片

2 集合框架中的接口(java.util)

        所谓框架就是一个类库的集合。集合框架就是一个用来表示和操作集合的统一的架构,包含了实现集合的接口与类。

1)由此我们也可以看出来map接口和Collection是没有继承关系的。

2)Collection是所有序列容器的共性的根接口。Java.util.AbstractCollection类提供了Collection的默认实现,使得你可以创建AbstractCollection的子类型,而没有不必要的代码重复。

3)Map是所有键-值对的根接口。

4)规律:

Set是无序的,不能包含重复的元素。

List是一个有序(按一定次序排放)的集合,可以包含重复的元素。

Queue是队列,存取数据是按照先进先出原则(FIFO)。

Map是用来存储健—值对(key-value),Map不能包含重复的key。

Hash表示内部存储方式是采用哈希算法。

Link表示底层是链表数据结构。

Tree表示数据结构是树状结构。

Sort表示升序

3 用法举例

下面举例说明如何使用集合类

3.1 实现Set接口的类

1 Set如何判断元素是否重复

HashSet、LinkedHashSet、TreeSet

Set的实现类判断元素是否重复的方法差异很大,大致可以分为三种:使用equals,使用hashCode,使用compareTo。

1)HashSet依靠HashMap实现,类的对象作为HashSet的元素时,该类要重写父类的hashCode方法。

2)TreeSet是依靠TreeMap来实现的。类的对象作为TreeSet的元素时,该类要实现Comparable接口。

3)如果创建自己的类要添加到CopyOnWriteArraySet时,要重写equals方法。

类CopyOnWriteArraySet是java.util.concurrent包中的一个类,所以它是线程安全的。

CopyOnWriteArraySet是使用CopyOnWriteArrayList作为其盛放元素的容器。当往CopyOnWriteArrayList添加新元素,它都要遍历整个List,并且用equals来比较两个元素是否相同。 

2  HashSet和TreeSet的比较

HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。

3.2 实现List接口的类

1 ArrayList

 可以将ArrayList看作是能够自动增长容量的数组。

[java]  view plain copy
  1. <span style="font-size:18px">ArrayList al=new ArrayList();  
  2. al.add("google");  
  3. al.add("microsofte");  
  4.  for(int i=0;i<al.size();i++)  
  5. {  
  6.     System.out.println(al.get(i));  
  7. }//end for</span>  

数组与集合类间的转化

1)利用ArrayList的toArray()返回一个数组。

       Object[] objs=al.toArray();

2)Arrays.asList()返回一个列表。

      List l=Arrays.asList(数组名);

迭代器(Iterator) 给我们提供了一种通用的方式来访问集合中的元素。

1)每个集合类接口及其实现类都有一个iterator()方法,用来返回对应的Iterator方法。

    Iterator it=al.iterator(); //ArrayList的迭代器,利用它来访问集合中的元素

2)Iterator的三个方法:

hasNext()  //返回boolean,是否有一个元素

next()     //返回下一个元素

remove()  //删除next()方法返回的元素

[java]  view plain copy
  1. <span style="font-size:18px"//读取元素  
  2. public static void printElements(Collection c)  
  3. {  
  4.     Iterator it=c.iterator();  
  5.      while(it.hasNext())  
  6.      {  
  7.            System.out.println(it.next());  
  8.        }//end while  
  9. }//end printElements()  
  10.   
  11. //使用方法读取元素  
  12. printElements(al);</span>  
2 LinkedList

LinkedList是采用双向循环链表实现的。因为LinkedLis同时实现了List接口和Queue接口,所以可以用LinkedList实现单向链表、双向循环链表、栈、队列等数据结构,需要注意的是在操作元素(添加、删除、访问)的时候按照对应数据结构的方法进行操作。

descendingIterator() 方法返回以逆向顺序在此双端队列的元素上进行迭代的迭代器,可以通过该方法逆向访问元素

JAVA集合类框架_第2张图片

LinkedList源码分析

LinkedList 增删查改例子

[java]  view plain copy
  1. LinkedList ll=new LinkedList();  
  2.       
  3. public void insert(String key){  
  4.     ll.add(key);  
  5. }//end insert()  
  6.   
  7. public boolean delete(String key){  
  8.     return ll.remove(key);  
  9. }//end delete()  
  10.   
  11. public boolean find(String key){  
  12.     boolean isFound=false;  
  13.     String temp=null;  
  14.       
  15.     Iterator it=ll.iterator();  
  16.     while(it.hasNext()){  
  17.         temp=(String)it.next();  
  18.         if(temp.equals(key)){  
  19.             isFound=true;  
  20.         }//end if  
  21.     }//end while  
  22.       
  23.     return isFound;  
  24. }//end find()  

3.3 实现Queue接口的类

LinkedList、PrioirtyQueue

3.3 实现Map接口的类

HashMap、LinkedHashMap、TreeMap

4 总结

各数据结构与JSE中类的对应关系如下

JAVA集合类框架_第3张图片

其中有排序功能的类是TreeSet和TreeMap

集合增删查改方法总结

JAVA集合类框架_第4张图片

JAVA集合类框架_第5张图片

你可能感兴趣的:(JAVA集合类框架)