知识点


Java集合框架支持规则集、线性表、队列和图,他们分别定义在接口Set、List、Quene和Map中。


规则集用于存储一组互不相同的元素。


线性表用于存储一个有序的元素集合。


图(Map)中存储的是键/值对。


Java集合框架中的所有实例类都实现了Cloneable和Serializable接口。所以,它们的实例都是可以复制和可序列化的。


规则集存储的是不重复的元素。若要在集合中存储重复的元素,就需要使用线性表。线性表不仅可以存储重复的元素,而且允许用户指定存储的位置。用户可以通过下标来访问线性表中的元素。


Java集合框架支持三种类型的规则集:散列集HashSet、链式散列集LinkedHashSet和树型集TreeSet。HashSet以一个不可预知的顺序存储元素;LinkedHashSet以元素被插入的顺序存储元素;TreeSet存储已排好的元素。所有方法都继承自Collection接口。


Java集合框架支持两种类型的线性表:数组线性表ArrayList和链表LinkedList。ArrayList是实现List接口的可变大小的数组。ArrayList中的所有方法都是在List接口中定义的。LinkedList是实现List接口的一个链表。除了实现List接口,该类还提供了可从线性表两端提取、插入以及删除元素的方法。


Vector类实现了List接口。Vector类和ArrayList是一样的,所不同的是它所包含的访问和修改向量的方法是同步的。Stack类扩展了Vector类,并且提供了几种对栈进行操作的方法。


Queue接口表示队列。PriorityQueue类为优先队列实现Queue接口。


Collection接口表示存储在规则集或线性表中元素的集合。Map接口将键值映射到元素,键值类似于下标。在List中,下标是整数。而在Map中,键值可以是任意类型的对象。图中不能包含重复的键值。一个键值至多可以对应一个值。Map接口提供了查询、更新、获取值集合和键值集合的方法。


Java集合框架支持三种类型的图:散列图HashMap、链式散列图LinkedHashMap和树形图TreeMap。对于定位一个值、插入一个映射和删除一个映射而言,HashMap是很高效的。LinkedHashMap支持图中的条目排序。HashMap类中的条目是没有顺序的,但LinkedHashMap中的条目可以按某种顺序来获取,该顺序既可以是它们插入图中的顺序(称为插入顺序),也可以是它们最后一次访问的时间顺序,从最早到最晚(称为访问顺序)。对于遍历排好序的键值,TreeMap是高效的。键值可以使用Comparable接口来排序,也可以使用Comparator接口来排序。




01)集合框架(概述)


规则框架java 规则框架结构_规则框架java




02)共性方法

1. /*
2.  * 1:add方法的参数类型都是Object。以便于接受任意类型的对象。
3.  * 2:集合中存储的都是对象的引用(地址)。
4.  */
5. public class
6. public static void
7.         System.out.println(obj);  
8.     }  
9. public static void
10.         method_1();  
11. "---------------分割线---------------");  
12.         method_2();  
13.     }  
14. public static void
15. //创建一个容器。使用Collection接口的子类。ArrayList。
16. new
17. //1:添加元素
18. "Java01");  
19. "Java02");  
20. "Java03");  
21. "Java04");  
22. //2:打印集合
23. "原集合 = "
24. "原集合 = "
25. //3:判断元素。
26. "判断Java02是否存在 = " + al.contains("Java02"));  
27. "判断集合是否为空 = "
28. //3:删除元素
29. "Java03");//删除指定元素。
30. 1);//删除下标为1的元素。
31. "删除后 = "
32. //4:获取个数。集合长度。
33. "清空前长度 = "
34. //5:清空集合。
35.         al.clear();  
36. "清空后集合 = "
37. "清空后长度 = "
38.     }  
39. public static void
40. new
41. "Java01");  
42. "Java02");  
43. "Java03");  
44. "Java04");  
45. "改变前a = "
46.           
47. new
48. "Java06");  
49. "Java05");  
50. "Java04");  
51. "Java03");  
52. "改变前b = "
53. "---------------分割线---------------");  
54.           
55. //取交集,a只会保留和b中相同的元素。
56.         sop(a.retainAll(b));  
57. "改变后a = "
58. "改变后b = "
59. "---------------分割线---------------");  
60.     }  
61. }


规则框架java 规则框架结构_List_02



03)迭代器——Iterator

    
   
1. public class
2. public static void
3.         System.out.println(obj);  
4.     }  
5. public static void
6.         method_get();  
7.     }  
8. public static void
9. new
10. "Java01");//add(Object obj)
11. "Java02");  
12. "Java03");  
13. "Java04");  
14.           
15. //获取迭代器,用于取出集合中的元素。
16. while(it_1.hasNext()){//如果仍有元素可以迭代,则返回 true。
17. "While: " + it_1.next());//while代码相较for而言显的更少
18.         }  
19. "-----分割线-----");  
20. for
21. "For: " + it_2.next());//细节:for能尽可能的少用内存空间。
22.         }  
23.     }  
24. }


规则框架java 规则框架结构_迭代器_03



04)List集合共性方法

1. /*
2.  * Collection
3.  *      |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
4.  *      |--Set:元素是无序,元素不可以重复。
5.  * 
6.  * List:特有方法。凡是可以操作角标的方法都是该体系特有的方法。
7.  * 
8.  * 增:add(index, element):在列表的指定位置插入指定元素。
9.  *      addAll(index, Collection):添加指定 collection 中的所有元素到此列表的结尾。
10.  * 删:remove(index):移除列表中指定位置的元素。
11.  * 改:set(index, element):用指定元素替换列表中指定位置的元素。
12.  * 查:get(index):返回列表中指定位置的元素。
13.  *      subList(from, to):返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
14.  *      listIterator();返回此列表元素的列表迭代器(按适当顺序)。
15.  *      int indexOf(obj):获取指定元素的位置。
16.  *      ListIterator listIterator():
17.  * 
18.  *
19.  */
20. public class
21. public static void
22.         System.out.println(obj);  
23.     }  
24. public static void
25.         method_1();  
26.     }  
27. public static void
28. new
29. //添加元素。
30. "Java01");  
31. "Java02");  
32. "Java04");  
33. "原集合是: "
34.           
35. //在指定位置添加元素。
36. 2, "Java03");  
37. "第一次修改后是: "
38.           
39. //删除指定位置元素。
40. 3);  
41. "第二次修改后是: "
42.           
43. //通过下标获取元素。
44. "get(1): " + a.get(1));  
45. "-----分割线-----");  
46.           
47. //获取所有元素。
48. for (int i = 0; i < a.size(); i++)  
49. "a(" + i + ") = "
50. "-----分割线-----");  
51. //迭代器,获取所有元素。
52.         Iterator it = a.iterator();  
53. while(it.hasNext())  
54. "next = "
55.     }  
56. }


规则框架java 规则框架结构_System_04




05)ListIterator

1. /*
2.  *  List集合特有的迭代器。
3.  *      ListIterator是Iterator的子接口。
4.  * 
5.  * 在迭代时,不可以通过集合对象的方法操作集合中的元素。
6.  * 因为会发生ConcurrentModificationException异常。
7.  * 
8.  * 所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
9.  * 只能对元素进行判断,取出,删除的操作。
10.  * 如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
11.  * 
12.  * 该接口只能通过List集合的listIterator方法获取。
13.  */
14. public class
15. public static void
16.         System.out.println(obj);  
17.     }  
18. public static void
19.         method_1();  
20. "----------------------分割线----------------------");  
21.         method_2();  
22. "----------------------分割线----------------------");  
23.         method_3();  
24.     }  
25. public static void
26. new
27. //添加元素。
28. "Java01");  
29. "Java02");  
30. "Java03");  
31. "Java04");  
32. "原a = "
33.           
34. for
35. "(前面是否有元素)hasPrevious = " + it.hasPrevious());//判断前面是否有元素。
36.             Object obj = it.next();  
37. if (obj.equals("Java01"))  
38. "Java添加");  
39. if (obj.equals("Java03"))  
40. "Javahah");  
41. "(打印元素)obj = "
42. "------------------------------------------------");  
43.         }  
44. "修改后a = "
45.     }  
46. public static void
47. new
48. //添加元素。
49. "Java01");  
50. "Java02");  
51. "Java03");  
52. "Java04");  
53.           
54. //在迭代过程中,准备添加或者删除元素。
55. for
56. //          sop("Next = " + it.next());
57. //取出元素。
58. if(obj.equals("Java01"))  
59. //将Java01的引用在集合中删除。
60. "obj = "
61.         }  
62. "a = "
63.     }  
64. public static void
65. new
66. //添加元素。
67. "Java01");  
68. "Java02");  
69. "Java03");  
70. "Java04");  
71.           
72. //通过indexOf获取对象的位置。
73. "indexOf = " + a.indexOf("Java03"));  
74. //通过指定下标获取集合中的元素。
75. 1, 3);  
76. "sup = "
77.     }  
78. }


规则框架java 规则框架结构_List_05




06)List集合具体对象的特点


1. /*
2.  * Collection
3.  *      |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
4.  *          |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
5.  *          |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
6.  *          |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
7.  *      |--Set:元素是无序,元素不可以重复。
8.  */


07)Vector中的枚举


1. /*
2.  * 枚举就是Vector特有的取出方式。
3.  * 发现枚举和迭代器很像。其实枚举和迭代器是一样的。
4.  * 
5.  * 因为枚举的名称以及方法的名称都过长。所以枚举被迭代器取代了。
6.  */
7. public class
8. public static void
9.         System.out.println(obj);  
10.     }  
11. public static void
12.         method_1();  
13.         method_2();  
14.     }  
15. public static void
16. new
17. "Java01");  
18. "Java02");  
19. "Java03");  
20. "Java04");  
21. "v1 = "
22. "-----------------------------------------");  
23. for
24. "it = " + it.next());//取数据
25.         }  
26. "-----------------------------------------");  
27.     }  
28. public static void
29. new
30. "Java01");  
31. "Java02");  
32. "Java03");  
33. "Java04");  
34. "v2 = "
35. "-----------------------------------------");  
36. for (Enumeration<E> en = v2.elements(); en.hasMoreElements();){//早期方式。
37. "en = "
38.         }  
39. "-----------------------------------------");  
40.     }  
41. }


规则框架java 规则框架结构_List_06



08)LinkedList

1. /*
2.  * LinkedList特有方法:1.6之前。
3.  *      addFirst():将指定元素插入此列表的开头。
4.  *      addLast():将指定元素添加到此列表的结尾。
5.  *      getFirst():返回此列表的第一个元素。
6.  *      getLast():返回此列表的最后一个元素。
7.  *          :获取元素,但不删除元素。长度不变。
8.  *          :如果集合中没有元素,会出现NoSuchElementException。
9.  *      removeFirst():移除并返回此列表的第一个元素。
10.  *      removeLast():移除并返回此列表的最后一个元素。
11.  *          :获取元素,并且删除元素。
12.  *          :如果集合中没有元素,会出现NoSuchElementException。
13.  * 
14.  * 1.6开始出现的替代:
15.  *      offerFirst():
16.  *      offerLast():
17.  *      peekFirst():
18.  *      peekLast():
19.  *      poolFirst():
20.  *      poolLast():
21.  */
22. public class
23. public static void
24.         System.out.println(obj);  
25.     }  
26. public static void
27.         method_1();  
28.         method_2();  
29.     }  
30. public static void
31. new
32. "(2)Java01");  
33. "(3)Java02");  
34. "(1)Java03");//将元素添加到此列表的开头。
35. "(4)Java04");//将元素添加到此列表的尾部。
36. "add = "
37. "getFirst = "
38. "getLast = "
39. "------------------------------------------------------------------");  
40.   
41.     }  
42. public static void
43. new
44. "(1)Java01");//将元素添加到此列表的开头。
45. "(2)Java02");  
46. "(3)Java03");  
47. "(4)Java04");  
48. "(原)add = "
49. "remove(0) = " + link.remove(0));//获取下标为0的元素,并且删除该元素。
50. "(改)add = "
51. "------------------------------------------------------------------");  
52.           
53. for(; !link.isEmpty(); ){  
54. "jdk1.6 poolLast = "
55.         }  
56.     }  
57. }


规则框架java 规则框架结构_迭代器_07



09)LinkedList(练习)

1. /*
2.  * 使用LinkedList模拟一个堆栈或者队列数据结构。
3.  * 堆栈:先进后出。如同一个杯子。
4.  * 队列:先进先出。如同一根水管。
5.  */
6. public class
7. public static void
8.         System.out.println(obj);  
9.     }  
10. public static void
11.         useDuiLie();  
12. "-----------------------");  
13.         uesDuiZhan();  
14.     }  
15. public static void
16. new
17. "Java01");  
18. "Java02");  
19. "Java03");  
20. "Java04");  
21. while
22. "队列: "
23.     }  
24. public static void
25. new
26. "Java01");  
27. "Java02");  
28. "Java03");  
29. "Java04");  
30. while
31. "堆栈: "
32.     }  
33. }  
34. class
35. private
36.     DuiLie(){  
37. new
38.     }  
39. public void
40. //添加元素在队列最开头。
41.     }  
42. public
43. return link.pollLast();//从队列尾部开始取元素。
44.     }  
45. public boolean
46. return
47.     }  
48. }  
49.   
50. class
51. private
52.     DuiZhan(){  
53. new
54.     }  
55. public void
56. //添加元素在队列最开头。
57.     }  
58. public
59. return link.pollFirst();//从队列开头开始取元素。
60.     }  
61. public boolean
62. return
63.     }  
64. }


规则框架java 规则框架结构_System_08



10)ArrayList(练习一)

1. /*
2.  * 去除ArrayList中重复的元素。
3.  */
4. public class
5. public static void
6.         System.out.println(obj);  
7.     }  
8. public static void
9.         method_1();  
10.     }  
11. public static void
12. new
13. "Java0");  
14. "Java1");  
15. "Java3");  
16. "Java2");  
17. "Java1");  
18. "Java2");  
19. "Al = "
20. "show(NewAl) = "
21.     }  
22. public static
23. new ArrayList();//创建一个新集合。
24. for
25. //依次打印元素
26. if (!newAl.contains(obj))//如果新集合中包不含有原集合的元素
27. //添加元素。
28.         }  
29. return newAl;//返回新集合。
30.     }  
31. }


规则框架java 规则框架结构_迭代器_09



11)ArrayList(练习二)


1. /*
2.  * 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
3.  * 比如:存人元素。同姓名,同年龄,视为同一元素。
4.  * 
5.  * 思路:
6.  * 1:对人描述,将数据封装人对象。
7.  * 2:定义容器,将人存入。
8.  * 3:取出。
9.  * 
10.  * List集合判断元素是否相同,依据的是元素的equals方法。
11.  */
12. public class
13. public static void
14.         System.out.println(obj);  
15.     }  
16. public static void
17.         method_1();  
18.         method_2();  
19.     }  
20. public static void
21. new
22. new Person("汤姆01号", 10));  
23. new Person("汤姆02号", 10));  
24. new Person("汤姆01号", 10));  
25. new Person("杰瑞01号", 11));  
26. new Person("杰瑞02号", 11));  
27. new Person("杰瑞01号", 11));  
28.         List al2 = show(al);  
29. for
30.             Person p = (Person)it.next();  
31. " "
32.         }  
33.     }  
34. public static void method_1(){//示例
35. new
36. new Person("汤姆01号", 10));  
37. new Person("汤姆02号", 10));  
38. new Person("汤姆01号", 10));  
39. new Person("杰瑞01号", 11));  
40. new Person("杰瑞02号", 11));  
41. new Person("杰瑞01号", 11));  
42. for
43.             Person p = (Person)it.next();  
44. " "
45.         }  
46. "------------------------------");  
47.     }  
48.       
49. public static
50. new ArrayList();//创建一个新集合。
51. for
52. //依次打印元素
53. if (!newAl.contains(obj))//如果新集合中包不含有原集合的元素
54. //添加元素。
55.         }  
56. return newAl;//返回新集合。
57.     }  
58. }  
59.   
60. class
61. private
62. private int
63. int
64. this.name = name;  
65. this.age = age;  
66.     }  
67. public boolean
68. if (!(obj instanceof
69. return false;  
70.         Person p = (Person)obj;  
71. return this.name.equals(p.name) && this.age == p.age;  
72.     }  
73. public
74. return
75.     }  
76. public int
77. return
78.     }  
79. }


规则框架java 规则框架结构_List_10



12)HashSet


1. /*
2.  * |--Set:元素是无序(存入顺序和元素的位置不一致),元素不可以重复。
3.  *      |--HashSet:底层的数据结构是哈希表。
4.  *      |--TreeSet:
5.  * 
6.  * Set集合的功能和Collection接口的功能是一致的。
7.  */
8. public class
9. public static void
10.         System.out.println(obj);  
11.     }  
12. public static void
13.         method_1();  
14.     }  
15. public static void
16. new HashSet();//创建一个HashSet集合。无序。
17. "Java01"));//判断为true
18. "Java01"));//判断为false
19. "Java02");  
20. "Java03");  
21. "Java03"));//判断为false
22. "Java04");  
23. for
24.             sop(it.next());  
25.         }  
26.     }  
27. }

运行结果如下图所示:

规则框架java 规则框架结构_System_11





13)HashSet存储自定义对象——复写hashCode和equals方法


1. /*
2.  * |--Set:元素是无序(存入顺序和元素的位置不一致),元素不可以重复。
3.  *      |--HashSet:底层的数据结构是哈希表。
4.  *          HashSet是如何保证元素唯一性的呢?
5.  *          是通过元素的两个方法,hasCode和equals来完成的。
6.  *          如果元素的hashCode值相同,才会判断equals是否为true。
7.  *          如果hashCode的值不同,就不会判断equals。
8.  *      |--TreeSet:
9.  * 
10.  * Set集合的功能和Collection接口的功能是一致的。
11.  */
12. public class
13. public static void
14.         System.out.println(obj);  
15.     }  
16. public static void
17.         method_1();  
18.     }  
19. public static void
20. new
21. new Person_2("汤姆(1)", 10));  
22. new Person_2("汤姆(2)", 10));  
23. new Person_2("汤姆(2)", 10)));//判断为false
24. new Person_2("汤姆(3)", 10));  
25. new Person_2("汤姆(3)", 10)));//判断为false
26. new Person_2("汤姆(4)", 10));  
27. for
28.             Person_2 p = (Person_2)it.next();  
29. " :: "
30.         }  
31.     }  
32. }  
33. class
34. private
35. private int
36. int
37. this.name = name;  
38. this.age = age;  
39.     }  
40. public int hashCode(){//细节:复写hashCode。集合底层内部自动调用。
41. return
42.     }  
43. public boolean equals(Object obj){//细节:复写equals。集合底层内部自动调用。
44. if (!(obj instanceof
45. return false;  
46.         Person_2 p = (Person_2)obj;  
47. return this.name.equals(p.name) && this.age == p.age;  
48.     }  
49. public
50. return
51.     }  
52. public int
53. return
54.     }  
55. }<span style="white-space:pre"> </span>


规则框架java 规则框架结构_迭代器_12



14)HashSet判断和删除的依据


对于元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。