集合学习笔记
集合框架总结:
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 }
1 输出结果为: 2 3 tyjk ikkl tyujy tukyukuil wse egrerrtuhtirefdhrtj uyku yukuilopcvg gteg 4 9 5 [tyjk, ikkl, tyujy, tukyukuil, wse, egrerrtuhtirefdhrtj, uyku, yukuilopcvg, gteg]
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 }
1 输出结果为: 2 a b c d 3 a b c d 4 [a, b, c, d]
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 }
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]
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具体类(链接映射表)
连接散列映射表与散列映射表的区别在于,链接散列映射表将用访问顺序,而不是用插入顺序,对映射表条目进行迭代。
各种具体类的比较:
集合类框架图:
当神已无能为力,那便是魔渡众生