java学习--集合框架(1)

来源:互联网 发布:python处理csv数据 编辑:程序博客网 时间:2024/06/06 04:41

知识点

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)集合框架(概述)



02)共性方法

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


03)迭代器——Iterator

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


04)List集合共性方法

[java] view plaincopy
  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 ListDemo {  
  21.     public static void sop(Object obj){  
  22.         System.out.println(obj);  
  23.     }  
  24.     public static void main(String[] args) {  
  25.         method_1();  
  26.     }  
  27.     public static void method_1(){  
  28.         ArrayList a = new ArrayList();  
  29.         //添加元素。  
  30.         a.add("Java01");  
  31.         a.add("Java02");  
  32.         a.add("Java04");  
  33.         sop("原集合是: " + a);  
  34.           
  35.         //在指定位置添加元素。  
  36.         a.add(2"Java03");  
  37.         sop("第一次修改后是: " + a);  
  38.           
  39.         //删除指定位置元素。  
  40.         a.remove(3);  
  41.         sop("第二次修改后是: " + a);  
  42.           
  43.         //通过下标获取元素。  
  44.         sop("get(1): " + a.get(1));  
  45.         System.out.println("-----分割线-----");  
  46.           
  47.         //获取所有元素。  
  48.         for (int i = 0; i < a.size(); i++)  
  49.             System.out.println("a(" + i + ") = " + a.get(i));  
  50.         System.out.println("-----分割线-----");  
  51.         //迭代器,获取所有元素。  
  52.         Iterator it = a.iterator();  
  53.         while(it.hasNext())  
  54.             sop("next = " + it.next());  
  55.     }  
  56. }  
运行结果如下图所示:


05)ListIterator

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


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

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

07)Vector中的枚举

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


08)LinkedList

[java] view plaincopy
  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 LinkedListDemo {  
  23.     public static void sop(Object obj){  
  24.         System.out.println(obj);  
  25.     }  
  26.     public static void main(String[] args) {  
  27.         method_1();  
  28.         method_2();  
  29.     }  
  30.     public static void method_1(){  
  31.         LinkedList link = new LinkedList();  
  32.         link.addFirst("(2)Java01");  
  33.         link.addLast("(3)Java02");  
  34.         link.addFirst("(1)Java03");//将元素添加到此列表的开头。  
  35.         link.addLast("(4)Java04");//将元素添加到此列表的尾部。  
  36.         sop("add = " + link);  
  37.         sop("getFirst = " + link.getFirst());  
  38.         sop("getLast = " + link.getLast());  
  39.         System.out.println("------------------------------------------------------------------");  
  40.   
  41.     }  
  42.     public static void method_2(){  
  43.         LinkedList link = new LinkedList();  
  44.         link.offerFirst("(1)Java01");//将元素添加到此列表的开头。  
  45.         link.offerFirst("(2)Java02");  
  46.         link.offerFirst("(3)Java03");  
  47.         link.offerFirst("(4)Java04");  
  48.         sop("(原)add = " + link);  
  49.         sop("remove(0) = " + link.remove(0));//获取下标为0的元素,并且删除该元素。  
  50.         sop("(改)add = " + link);  
  51.         System.out.println("------------------------------------------------------------------");  
  52.           
  53.         for(; !link.isEmpty(); ){  
  54.             sop("jdk1.6 poolLast = " + link.pollLast());  
  55.         }  
  56.     }  
  57. }  
运行结果如下图所示:


09)LinkedList(练习)

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


10)ArrayList(练习一)

[java] view plaincopy
  1. /* 
  2.  * 去除ArrayList中重复的元素。 
  3.  */  
  4. public class ArrayListTest {  
  5.     public static void sop(Object obj){  
  6.         System.out.println(obj);  
  7.     }  
  8.     public static void main(String[] args) {  
  9.         method_1();  
  10.     }  
  11.     public static void method_1(){  
  12.         ArrayList al = new ArrayList();  
  13.         al.add("Java0");  
  14.         al.add("Java1");  
  15.         al.add("Java3");  
  16.         al.add("Java2");  
  17.         al.add("Java1");  
  18.         al.add("Java2");  
  19.         sop("Al = " + al);  
  20.         sop("show(NewAl) = " + show(al));  
  21.     }  
  22.     public static List show(ArrayList al){  
  23.         ArrayList newAl = new ArrayList();//创建一个新集合。  
  24.         for (Iterator<E> it = al.iterator(); it.hasNext();){  
  25.             Object obj = it.next();//依次打印元素  
  26.             if (!newAl.contains(obj))//如果新集合中包不含有原集合的元素  
  27.                 newAl.add(obj);//添加元素。  
  28.         }  
  29.         return newAl;//返回新集合。  
  30.     }  
  31. }  
运行结果如下图所示:


11)ArrayList(练习二)

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


12)HashSet

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


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

[java] view plaincopy
  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 HashSetTest_1 {  
  13.     public static void sop(Object obj){  
  14.         System.out.println(obj);  
  15.     }  
  16.     public static void main(String[] args) {  
  17.         method_1();  
  18.     }  
  19.     public static void method_1(){  
  20.         HashSet hs = new HashSet();  
  21.         hs.add(new Person_2("汤姆(1)"10));  
  22.         hs.add(new Person_2("汤姆(2)"10));  
  23.         sop(hs.add(new Person_2("汤姆(2)"10)));//判断为false  
  24.         hs.add(new Person_2("汤姆(3)"10));  
  25.         sop(hs.add(new Person_2("汤姆(3)"10)));//判断为false  
  26.         hs.add(new Person_2("汤姆(4)"10));  
  27.         for (Iterator it = hs.iterator(); it.hasNext();){  
  28.             Person_2 p = (Person_2)it.next();  
  29.             sop(p.getName() + " :: " + p.GetAge());  
  30.         }  
  31.     }  
  32. }  
  33. class Person_2{  
  34.     private String name;  
  35.     private int age;  
  36.     Person_2(String name, int age){  
  37.         this.name = name;  
  38.         this.age = age;  
  39.     }  
  40.     public int hashCode(){//细节:复写hashCode。集合底层内部自动调用。  
  41.         return name.hashCode() + age * age;  
  42.     }  
  43.     public boolean equals(Object obj){//细节:复写equals。集合底层内部自动调用。  
  44.         if (!(obj instanceof Person_2))  
  45.             return false;  
  46.         Person_2 p = (Person_2)obj;  
  47.         return this.name.equals(p.name) && this.age == p.age;  
  48.     }  
  49.     public String getName(){  
  50.         return name;  
  51.     }  
  52.     public int GetAge(){  
  53.         return age;  
  54.     }  
  55. }<span style="white-space:pre"> </span>  
运行结果如下图所示:


14)HashSet判断和删除的依据

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

0 0
原创粉丝点击