集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)

时间:2021-02-03 17:55:40

 

 

集合详解:

 1 /*
 2 Collection  3  |--List:元素是有序的,元素可以重复。因为该集合体系有索引。  4  |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。  5  |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。  6  |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。  7 
 8 
 9  |--Set:元素是无序,元素不可以重复。、 10 
11 
12 List: 13  特有方法。凡是可以操作角标的方法都是该体系特有的方法。 14 
15 16  add(index,element); 17  addAll(index,Collection); 18 
19 20  remove(index); 21 
22 23  set(index,element); 24 25  get(index): 26  subList(from,to); 27  listIterator(); 28  int indexOf(obj):获取指定元素的位置。 29  ListIterator listIterator(); 30 
31 
32 
33 
34 
35 List集合特有的迭代器。ListIterator是Iterator的子接口。 36 
37 在迭代时,不可以通过集合对象的方法操作集合中的元素。 38 因为会发生ConcurrentModificationException异常。 39 
40 所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的, 41 只能对元素进行判断,取出,删除的操作, 42 如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。 43 
44 该接口只能通过List集合的listIterator方法获取。 45 
46 */
47 
48 /*
49 |--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、 50  |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。 51  HashSet是如何保证元素唯一性的呢? 52  是通过元素的两个方法,hashCode和equals来完成。 53  如果元素的HashCode值相同,才会判断equals是否为true。 54  如果元素的hashcode值不同,不会调用equals。 55 
56  注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。 57 
58 
59  |--TreeSet: 60 
61 Set集合的功能和Collection是一致的。 62 
63 
64 
65 
66 */

 

集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)

 

 集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)

 

 

 1 /*
 2 Collection  3  |--List:元素是有序的,元素可以重复。因为该集合体系有索引。  4  |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。  5  |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。  6  |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。  7 
 8 
 9  |--Set:元素是无序,元素不可以重复。、  10 
 11 
 12 List:  13  特有方法。凡是可以操作角标的方法都是该体系特有的方法。  14 
 15  16  add(index,element);  17  addAll(index,Collection);  18 
 19  20  remove(index);  21 
 22  23  set(index,element);  24  25  get(index):  26  subList(from,to);  27  listIterator();  28  int indexOf(obj):获取指定元素的位置。  29  ListIterator listIterator();  30 
 31 
 32 
 33 
 34 
 35 List集合特有的迭代器。ListIterator是Iterator的子接口。  36 
 37 在迭代时,不可以通过集合对象的方法操作集合中的元素。  38 因为会发生ConcurrentModificationException异常。  39 
 40 所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,  41 只能对元素进行判断,取出,删除的操作,  42 如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。  43 
 44 该接口只能通过List集合的listIterator方法获取。  45 
 46 */
 47 
 48 
 49 import java.util.*;  50 class ListDemo  51 {  52     public static void sop(Object obj)  53  {  54  System.out.println(obj);  55  }  56     public static void method()  57  {  58         
 59         ArrayList al = new ArrayList();  60 
 61         //添加元素
 62         al.add("java01");  63         al.add("java02");  64         al.add("java03");  65         
 66         sop("原集合是:"+al);  67         //在指定位置添加元素。
 68         al.add(1,"java09");  69 
 70         //删除指定位置的元素。  71         //al.remove(2);  72 
 73         //修改元素。  74         //al.set(2,"java007");  75 
 76         //通过角标获取元素。
 77         sop("get(1):"+al.get(1));  78 
 79  sop(al);  80 
 81         //获取所有元素。
 82         for(int x=0; x<al.size(); x++)  83  {  84             System.out.println("al("+x+")="+al.get(x));  85  }  86 
 87         Iterator it = al.iterator();  88 
 89         while(it.hasNext())  90  {  91             sop("next:"+it.next());  92  }  93 
 94 
 95         //通过indexOf获取对象的位置。
 96         sop("index="+al.indexOf("java02"));  97 
 98         List sub = al.subList(1,3);  99 
100         sop("sub="+sub); 101  } 102 
103     
104     public static void main(String[] args) 105  { 106 
107         //演示列表迭代器。
108         ArrayList al = new ArrayList(); 109 
110         //添加元素
111         al.add("java01"); 112         al.add("java02"); 113         al.add("java03"); 114 
115  sop(al); 116 
117         
118         ListIterator li = al.listIterator(); 119 
120         
121         //sop("hasPrevious():"+li.hasPrevious());
122 
123         while(li.hasNext()) 124  { 125             Object obj = li.next(); 126 
127             if(obj.equals("java02")) 128                 //li.add("java009");
129                 li.set("java006"); 130 
131 
132  } 133 
134         while(li.hasPrevious()) 135  { 136             sop("pre::"+li.previous()); 137  } 138         //sop("hasNext():"+li.hasNext()); 139         //sop("hasPrevious():"+li.hasPrevious());
140 
141 
142  sop(al); 143 
144 
145 
146         /*
147  //在迭代过程中,准备添加或者删除元素。 148 
149  Iterator it = al.iterator(); 150 
151  while(it.hasNext()) 152  { 153  Object obj = it.next(); 154 
155  if(obj.equals("java02")) 156  //al.add("java008"); 157  it.remove();//将java02的引用从集合中删除了。 158 
159  sop("obj="+obj); 160 
161 
162  } 163  sop(al); 164         */
165         
166 
167 
168  } 169 }

 

 1 import java.util.*;  2 
 3 /*
 4 去除ArrayList集合中的重复元素。  5 
 6 */
 7 
 8 class ArrayListTest  9 { 10 
11     public static void sop(Object obj) 12  { 13  System.out.println(obj); 14  } 15     public static void main(String[] args) 16  { 17         ArrayList al = new ArrayList(); 18 
19         al.add("java01"); 20         al.add("java02"); 21         al.add("java01"); 22         al.add("java02"); 23         al.add("java01"); 24 // al.add("java03");
25 
26 
27         /*
28  在迭代时循环中next调用一次,就要hasNext判断一次。 29  Iterator it = al.iterator(); 30 
31  while(it.hasNext()) 32  { 33  sop(it.next()+"...."+it.next()); 34  } 35         */
36 
37         /**/ 38  sop(al); 39         
40  al = singleElement(al); 41 
42  sop(al); 43         
44 
45  } 46 
47  public static ArrayList singleElement(ArrayList al) 48  { 49  //定义一个临时容器。 50  ArrayList newAl = new ArrayList(); 51 
52  Iterator it = al.iterator(); 53 
54  while(it.hasNext()) 55  { 56  Object obj = it.next(); 57 
58  if(!newAl.contains(obj)) 59  newAl.add(obj); 60 
61  } 62 
63  return newAl; 64  } 65 }

 

 1 import java.util.*;  2 
 3 /*
 4 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。  5 
 6 比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。  7 
 8 
 9 思路:  10 1,对人描述,将数据封装进人对象。  11 2,定义容器,将人存入。  12 3,取出。  13 
 14 
 15 
 16 List集合判断元素是否相同,依据是元素的equals方法。  17 
 18 
 19 
 20 */
 21 
 22 
 23 
 24 class Person  25 {  26     private String name;  27     private int age;  28     Person(String name,int age)  29  {  30         this.name = name;  31         this.age = age;  32  }  33     
 34     public boolean equals(Object obj)  35  {  36 
 37         if(!(obj instanceof Person))  38             return false;  39 
 40         Person p = (Person)obj;  41         //System.out.println(this.name+"....."+p.name);
 42 
 43         return this.name.equals(p.name) && this.age == p.age;  44  }  45     /**/  46  public String getName()  47  {  48  return name;  49  }  50  public int getAge()  51  {  52  return age;  53  }  54 }  55 class ArrayListTest2  56 {  57  public static void sop(Object obj)  58  {  59  System.out.println(obj);  60  }  61  public static void main(String[] args)  62  {  63  ArrayList al = new ArrayList();  64 
 65  al.add(new Demo());  66 
 67  al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);  68  //al.add(new Person("lisi02",32));  69  al.add(new Person("lisi02",32));  70  al.add(new Person("lisi04",35));  71  al.add(new Person("lisi03",33));  72  //al.add(new Person("lisi04",35));  73 
 74         
 75  //al = singleElement(al);  76 
 77  sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。  78 
 79 
 80  Iterator it = al.iterator();  81 
 82 
 83  while(it.hasNext())  84  {  85  Person p = (Person)it.next();  86  sop(p.getName()+"::"+p.getAge());  87  }  88  }  89 
 90 
 91  public static ArrayList singleElement(ArrayList al)  92  {  93  //定义一个临时容器。  94  ArrayList newAl = new ArrayList();  95 
 96  Iterator it = al.iterator();  97 
 98  while(it.hasNext())  99  { 100  Object obj = it.next(); 101 
102  if(!newAl.contains(obj)) 103  newAl.add(obj); 104 
105  } 106 
107  return newAl; 108  } 109 }

 

 1 import java.util.*;  2 
 3 /*
 4 Collection定义了集合框架的共性功能。  5 1,添加  6  add(e);  7  addAll(collection);  8 
 9 2,删除  10  remove(e);  11  removeAll(collection);  12  clear();  13 
 14 3,判断。  15  contains(e);  16  isEmpty();  17 
 18 4,获取  19  iterator();  20  size();  21 
 22 5,获取交集。  23  retainAll();  24 
 25 6,集合变数组。  26  toArray();  27 
 28 
 29 
 30 1,add方法的参数类型是Object。以便于接收任意类型对象。  31 
 32 2,集合中存储的都是对象的引用(地址)  33 
 34 
 35 什么是迭代器呢?  36 其实就是集合的取出元素的方式。  37 如同抓娃娃游戏机中的夹子。  38 
 39 迭代器是取出方式,会直接访问集合中的元素。  40 所以将迭代器通过内部类的形式来进行描述。  41 通过容器的iterator()方法获取该内部类的对象。  42 
 43 
 44 
 45 
 46 */
 47 class CollectionDemo  48 {  49     public static void main(String[] args)  50  {  51         
 52  method_get();  53  }  54     public static void method_get()  55  {  56         ArrayList al = new ArrayList();  57 
 58         //1,添加元素。
 59         al.add("java01");//add(Object obj);
 60         al.add("java02");  61         al.add("java03");  62         al.add("java04");  63 
 64         /*
 65  Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。  66 
 67  while(it.hasNext())  68  {  69  sop(it.next());  70  }  71         */
 72 
 73         for(Iterator it = al.iterator(); it.hasNext() ; )  74  {  75  sop(it.next());  76  }  77  }  78 
 79 
 80     public static void method_2()  81  {  82         ArrayList al1 = new ArrayList();  83 
 84         al1.add("java01");  85         al1.add("java02");  86         al1.add("java03");  87         al1.add("java04");  88         ArrayList al2 = new ArrayList();  89 
 90         al2.add("java03");  91         al2.add("java04");  92         al2.add("java05");  93         al2.add("java06");  94 
 95         
 96         //al1.retainAll(al2);//去交集,al1中只会保留和al2中相同的元素。
 97  al1.removeAll(al2);  98 
 99         sop("al1:"+al1); 100         sop("al2:"+al2); 101 
102 
103 
104 
105  } 106 
107     public static void base_method() 108  { 109         //创建一个集合容器。使用Collection接口的子类。ArrayList
110         ArrayList al = new ArrayList(); 111 
112         //1,添加元素。
113         al.add("java01");//add(Object obj);
114         al.add("java02"); 115         al.add("java03"); 116         al.add("java04"); 117 
118         //打印原集合。
119         sop("原集合:"+al); 120 
121 
122         //3,删除元素。 123         //al.remove("java02"); 124         //al.clear();//清空集合。 125 
126 
127         //4,判断元素。
128         sop("java03是否存在:"+al.contains("java03")); 129         sop("集合是否为空?"+al.isEmpty()); 130 
131 
132         //2,获取个数。集合长度。
133         sop("size:"+al.size()); 134 
135         //打印改变后的集合。
136  sop(al); 137 
138  } 139 
140     public static void sop(Object obj) 141  { 142  System.out.println(obj); 143  } 144 }
 1 import java.util.*;  2 /*
 3 |--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、  4  |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。  5  HashSet是如何保证元素唯一性的呢?  6  是通过元素的两个方法,hashCode和equals来完成。  7  如果元素的HashCode值相同,才会判断equals是否为true。  8  如果元素的hashcode值不同,不会调用equals。  9 
10  注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。 11 
12 
13  |--TreeSet: 14 
15 Set集合的功能和Collection是一致的。 16 
17 
18 
19 
20 */
21 
22 
23 class HashSetDemo 24 { 25     public static void sop(Object obj) 26  { 27  System.out.println(obj); 28  } 29     public static void main(String[] args) 30  { 31         
32         HashSet hs = new HashSet(); 33 
34         sop(hs.add("java01")); 35         sop(hs.add("java01")); 36         hs.add("java02"); 37         hs.add("java03"); 38         hs.add("java03"); 39         hs.add("java04"); 40 
41         Iterator it = hs.iterator(); 42 
43         while(it.hasNext()) 44  { 45  sop(it.next()); 46  } 47  } 48 }

 

 1 import java.util.*;  2 
 3 /*
 4 往hashSet集合中存入自定对象  5 姓名和年龄相同为同一个人,重复元素。  6 
 7 
 8 
 9 
10 
11 */
12 class HashSetTest 13 { 14     public static void sop(Object obj) 15  { 16  System.out.println(obj); 17  } 18     public static void main(String[] args) 19  { 20         HashSet hs = new HashSet(); 21 
22         hs.add(new Person("a1",11)); 23         hs.add(new Person("a2",12)); 24         hs.add(new Person("a3",13)); 25 // hs.add(new Person("a2",12)); 26 // hs.add(new Person("a4",14)); 27 
28         //sop("a1:"+hs.contains(new Person("a2",12))); 29             
30 // hs.remove(new Person("a4",13));
31         
32 
33         Iterator it = hs.iterator(); 34 
35         while(it.hasNext()) 36  { 37             Person p = (Person)it.next(); 38             sop(p.getName()+"::"+p.getAge()); 39  } 40  } 41 } 42 class Person 43 { 44     private String name; 45     private int age; 46     Person(String name,int age) 47  { 48         this.name = name; 49         this.age = age; 50  } 51     
52     public int hashCode() 53  { 54         System.out.println(this.name+"....hashCode"); 55         return name.hashCode()+age*37; 56  } 57 
58     public boolean equals(Object obj) 59  { 60 
61         if(!(obj instanceof Person)) 62             return false; 63 
64         Person p = (Person)obj; 65         System.out.println(this.name+"...equals.."+p.name); 66 
67         return this.name.equals(p.name) && this.age == p.age; 68  } 69 
70     
71     public String getName() 72  { 73         return name; 74  } 75     public int getAge() 76  { 77         return age; 78  } 79 } 80 
81 /*
82 
83 
84 */
 1 import java.util.*;  2 
 3 /*
 4 LinkedList:特有方法:  5 addFirst();  6 addLast();  7 
 8 getFirst();  9 getLast(); 10 获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException 11 
12 removeFirst(); 13 removeLast(); 14 获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException 15 
16 
17 在JDK1.6出现了替代方法。 18 
19 offerFirst(); 20 offerLast(); 21 
22 
23 peekFirst(); 24 peekLast(); 25 获取元素,但不删除元素。如果集合中没有元素,会返回null。 26 
27 pollFirst(); 28 pollLast(); 29 获取元素,但是元素被删除。如果集合中没有元素,会返回null。 30 
31 
32 
33 
34 */
35 
36 class LinkedListDemo 37 { 38     public static void main(String[] args) 39  { 40         LinkedList link = new LinkedList(); 41 
42         link.addLast("java01"); 43         link.addLast("java02"); 44         link.addLast("java03"); 45         link.addLast("java04"); 46 
47         //sop(link); 48 // sop(link.getFirst()); 49 // sop(link.getFirst()); 50         //sop(link.getLast()); 51         //sop(link.removeFirst()); 52         //sop(link.removeFirst()); 53 
54         //sop("size="+link.size());
55 
56         while(!link.isEmpty()) 57  { 58  sop(link.removeLast()); 59  } 60 
61  } 62 
63     public static void sop(Object obj) 64  { 65  System.out.println(obj); 66  } 67 } 68 /*
69 
70 --- 71 java01 72 java02 73 java03 74 java04 75 
76 ---- 77 java04 78 java03 79 java02 80 java01 81 --- 82 */
/* 使用LinkedList模拟一个堆栈或者队列数据结构。 堆栈:先进后出 如同一个杯子。 队列:先进先出 First in First out FIFO 如同一个水管。 */

import java.util.*; class DuiLie { private LinkedList link; DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public Object myGet() { return link.removeFirst(); } public boolean isNull() { return link.isEmpty(); } } class LinkedListTest { public static void main(String[] args) { DuiLie dl = new DuiLie(); dl.myAdd("java01"); dl.myAdd("java02"); dl.myAdd("java03"); dl.myAdd("java04"); while(!dl.isNull()) { System.out.println(dl.myGet()); } } }