zoukankan      html  css  js  c++  java
  • 集合学习笔记

       集合框架总结

     1 Collection接口:
     2     Set接口:
     3         HashSet//对象必须实现hashCode方法,元素没有顺序呢,效率比LinkedHashSet高
     4         LinkedHashSet//是HashSet的扩展,支持规则集内元素的排序,按元素插入集合的顺序进行提取
     5         TreeSet//保证集合中的元素是有序的,与HashSet相反
     6     List接口:
     7         ArrayList
     8         LinkedList
     9         Vector
    10         Stack//派生于Vector,栈
    11 Map接口:
    12     HashMap//效率高
    13     LinkedHashMap//按照添加顺序存储,可以按添加顺序取出
    14     TreeMap排序性

    1 Collection接口 

    1 这个接口是处理对象集合的根接口。它实现了几种方法:
    2     add();
    3     size();
    4     iterator();
    5     Iterator接口:
    6         next();
    7         hasNext();
    8         remove();

    2 Set接口

    2.1 HashSet具体类(散列集)
      散列集是没有重复元素的元素集合。散列表用链表数组实现,每个列表称为桶。可以用add方法添加元素。contains方法用来快速查看是否某个元素已经出现在集中,只在桶内查找元素,不必查看集合中所有元素。
      散列表迭代器将依次访问所有的桶。由于散列将元素分散在表的各个位置,所以访问顺序是随机的。只有不关心集合中的元素顺序时才应该使用HashSet。
      HashSetTest.java
     1 package General;
     2 import java.util.*;
     3 import java.io.*;
     4 public class hashSetTest{
     5     public static void main(String[] args) throws FileNotFoundException{
     6         Set<String> words=new HashSet<String>();
     7         //方法1:这个方法不需要抛出异常
     8         //InputStream inStream=SetTest.class.getResourceAsStream("C:/Users/Maria/Desktop/文件/SDN.txt");
     9         //方法2:这个方法需要抛出异常
    10         InputStream inStream = new FileInputStream("C:/Users/Maria/Desktop/文件/SDN.txt");
    11         Scanner in=new Scanner(inStream);
    12         while(in.hasNext())
    13             words.add(in.next());   
    14         Iterator<String> iter2=words.iterator();
    15         for(int i=0;i<words.size()&&iter2.hasNext();i++)
    16             System.out.print(iter2.next()+" ");  
    17         System.out.println();
    18         System.out.println(words.size());
    19         System.out.println(words);//使用toString输出集合
    20     }
    21 }
    HashSetTest.java
    1 输出结果为:
    2 
    3 tyjk ikkl tyujy tukyukuil wse egrerrtuhtirefdhrtj uyku yukuilopcvg gteg 
    4 9
    5 [tyjk, ikkl, tyujy, tukyukuil, wse, egrerrtuhtirefdhrtj, uyku, yukuilopcvg, gteg]
    View Code
    2.2 TreeSet具体类(树集)
      与散列集十分类似。树集是一个有序的集合。可以以任意顺序将元素插入到集合中。在对集合进行遍历时,每个值将自动的按照排序后的顺序呈现(这点与散列集相反)。如:
    1 SortedSet<String>sorter=new TreeSet<String>();
    2 sorter.add("Bob");
    3 sorter.add("Alice");
    4 sorter.add("Carl");
    5 for(String s:sorter)
    6     System.out.println(s+" ");

     

    1 结果为:
    2     Bob Alice Carl

      但是TreeSet如何知道希望元素怎样排序呢,第一种方法,树集假定插入的元素实现了Comparable接口。这个接口定义了一个方法。

    1 public interface Comparable<T>
    2     int compareTo(T other);//将这个对象(this)与另一对象(other)进行比较,如果this位于other之前则返回负值;如果两个对象在排序顺序中处于相同位置返回0;如果this位于other之后则返回正值。

      第二种方法,通过将比较器Comparator对象传递给TreeSet构造器来告诉树集使用不同的比较方法。

    1 public interface Comparable<T>
    2     int compareTo(T a,T b);
    3 List接口
    3.1 ArrayList具体类(数组列表)
      ArrayList是List的子类,它和HashSet相反,允许存放重复元素,因此有序。集合元素被访问的顺序取决于集合的类型。如果对ArrayList进行访问,迭代器从索引0开始,每迭代一次索引值加1。然而,如果访问HashSet中的元素,每个元素会按照随机次序出现。
      ArrayListSetTest.java
     1 package General;
     2 import java.util.*;
     3 import java.io.*;
     4 public class ArrayListSetTest{
     5     public static void main(String[] args) throws FileNotFoundException{
     6         Set<String> set=new HashSet<String>();
     7         set.add("a");
     8         set.add("b");
     9         set.add("c");
    10         set.add("c");
    11         set.add("d");             
    12         Iterator<String> iter1=set.iterator();
    13         while(iter1.hasNext())      
    14             System.out.print(iter1.next()+" "); //使用Iterator输出集合
    15         System.out.println();
    16         for(String e:set)
    17             System.out.print(e+" "); //使用For Each输出结合
    18         System.out.println();
    19         System.out.println(set);//使用toString输出集合
    20 }
    ArrayListSetTest.java
    1 输出结果为:
    2 a b c d 
    3 a b c d 
    4 [a, b, c, d]
    View Code
    3.2 LinkedLis具体类(链表)
      LinkedList是一种可以在任何位置进行高效的插入和删除操作的有序序列。
      LinkedListTest.java
     1 package General;
     2 import java.util.*;
     3 public class LinkedListTest {
     4     public static void main(String[] args) {
     5         List<String> a=new ArrayList<String>();
     6         a.add("a");
     7         a.add("b");
     8         a.add("c");
     9         System.out.println(a);
    10         
    11         List<String> b=new ArrayList<String>();
    12         b.add("d");
    13         b.add("e");
    14         b.add("f");
    15         b.add("g");
    16         System.out.println(b);
    17         
    18         //ListIterator在Iterator基础上添加了add(),previous()和hasPrevious()方法
    19         ListIterator<String> aIter=a.listIterator();
    20         //普通的Iterator只有三个方法,hasNext(),next()和remove()
    21         Iterator<String> bIter=b.iterator();
    22         
    23         //b归并入a当中,间隔交叉得插入b中的元素
    24         while(bIter.hasNext())
    25         {
    26             if(aIter.hasNext())
    27                 aIter.next();
    28             aIter.add(bIter.next());
    29         }
    30         System.out.println(a);
    31         
    32         //在b中每隔两个元素删除一个
    33         bIter=b.iterator();
    34         
    35         while(bIter.hasNext())
    36         {
    37             bIter.next();
    38             if(bIter.hasNext())
    39             {
    40                 bIter.next();//remove跟next是成对出现的,remove总是删除前序
    41                 bIter.remove();
    42             }
    43         }
    44         System.out.println(b);
    45         
    46         //删除a中所有的b中的元素
    47         a.removeAll(b);
    48         System.out.println(a);
    49     }
    50 }
    LinkedListTest.java
    1 结果为:
    2 [a, b, c]
    3 [d, e, f, g]
    4 [a, d, b, e, c, f, g]
    5 [d, f]
    6 [a, b, e, c, g]
    View Code
    3.3 Vector具体类
      Vector: 基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能走入Array的限制。性能也就不能超越Array。所以在可能情况下,我们要多运用Array。另外很重要的一点是Vector"sychrovized" 的,这个是Vector和ArroyList的唯一区别。
      它实现了一个类似数组一样的表,自动增加容量来容纳你所需要的元素。使用下表存储和检索对象就像在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类,当两个或多个线程同时访问时,性能也是良好的。
    3.4 Stack具体类
      这个类是从Vector派生而来,并且增加了方法实现栈操作,一种后进先出的存储结构。
    4 Map接口
    4.1 HashMap具体类(散列映射)
      这部分,参考另外一篇文章,HashMap实现原理
    4.2 LinkedHashMap具体类(链接映射表)
      连接散列映射表与散列映射表的区别在于,链接散列映射表将用访问顺序,而不是用插入顺序,对映射表条目进行迭代。
     
      各种具体类的比较:
      集合类框架图:
    当神已无能为力,那便是魔渡众生
  • 相关阅读:
    佛教-著作:《般若泼若密心经》
    学科-几何:分形几何学
    战国-散文:《生于忧患,死于安乐》
    北宋-词:《临江仙·送王缄》
    音乐:《河西走廊之梦》
    影视-纪录片:《河西走廊》
    汉语-汉字:黾
    动物-昆虫:水螳螂
    动物-昆虫:水黾
    主程的晋升攻略(3):IP、DNS和CDN
  • 原文地址:https://www.cnblogs.com/liuzhongfeng/p/5062465.html
Copyright © 2011-2022 走看看