Java集合总结(List、Map、Set)

时间:2021-07-31 16:17:27

集合的引入

 当我们有种需求,需要存储多个元素的结构时,我们前面讲过数组,数组可以存储。但是数组也有它的弊端,使用的时候,必须先定义好长度,也就是数组的长度是固定,不能根据我们的需求自动变长或者变短。

我们看一个实例:先定义一个Student类:

 1 public class Student {
 2  
 3     private String name;
 4     private Integer age;
 5      
 6     public Student() {
 7         super();
 8         // TODO Auto-generated constructor stub
 9     }
10     public Student(String name, Integer age) {
11         super();
12         this.name = name;
13         this.age = age;
14     }
15     public String getName() {
16         return name;
17     }
18     public void setName(String name) {
19         this.name = name;
20     }
21     public Integer getAge() {
22         return age;
23     }
24     public void setAge(Integer age) {
25         this.age = age;
26     }
27      
28      
29 }

然后我们需要存储三个学生信息:我们给下测试类:

1 public class Test {
2  
3     public static void main(String[] args) {
4         Student students[]=new Student[3];
5         students[0]=new Student("张三",1);
6         students[1]=new Student("李四",2);
7         students[2]=new Student("王五",3);
8     }
9 }

这里我们很好的实现了用数组结构存储了三个学生,但是,假如我们需要再存储一个学生,就懵逼了,因为长度固定了。所以就引入了可变化长度的集合。

 

一、List集合

Collection接口是集合的老祖宗,定义了接口的基本方法,我们查看api 文档:

Java集合总结(List、Map、Set)

List是Collection接口的子接口,也是最常用的接口,此接口对Collection接口进行了大量的扩展,List集合里的元素是可以重复的。

 List接口的主要实现类有ArrayList,和LinkedList。在数据量不大的情况下,这两个类性能差别不大,一般情况下,集合里的元素很少变化的,一般用ArrayList,假如集合里元素经常变动,要用LinkedList;底层实现有差别的。我们给下实例:

 1 import java.util.ArrayList;
 2  
 3 public class TestArrayLit {
 4  
 5     private static void pringArrayList(ArrayList<String> arrayList){
 6         System.out.println("当前的集合元素:");
 7         for(int i=0;i<arrayList.size();i++){
 8             System.out.println(arrayList.get(i));
 9         }
10     }
11      
12     public static void main(String[] args) {
13         ArrayList<String> arrayList=new ArrayList<String>();
14         // 添加元素
15         arrayList.add("张三");
16         arrayList.add("李四");
17         pringArrayList(arrayList);
18         // 在指定位置插入元素
19         arrayList.add(1, "小张三");
20         pringArrayList(arrayList);
21         // 元素的替换
22         arrayList.set(2, "小李四");
23         pringArrayList(arrayList);
24         // 移除元素
25         arrayList.remove(0);
26         pringArrayList(arrayList);
27     }
28 }

运行输出:

当前的集合元素:

张三

李四

当前的集合元素:

张三

小张三

李四

当前的集合元素:

张三

小张三

小李四

当前的集合元素:

小张三

小李四

 1 import java.util.LinkedList;
 2  
 3 public class TestLinkedList {
 4  
 5     private static void pringLinkedList(LinkedList<String> linkedList){
 6         System.out.println("当前元素的集合:");
 7         for(int i=0;i<linkedList.size();i++){
 8             System.out.print(linkedList.get(i)+" ");
 9         }
10         System.out.println();
11     }
12      
13     public static void main(String[] args) {
14         LinkedList<String> linkedList=new LinkedList<String>();
15         linkedList.add("张三");
16         linkedList.add("李四");
17         linkedList.add("王五");
18         linkedList.add("李四");
19         linkedList.add("赵六");
20         pringLinkedList(linkedList);
21          
22         // indexOf 寻找位置
23         System.out.println(linkedList.indexOf("李四"));
24         pringLinkedList(linkedList);
25          
26         // peekFirst 获取第一个元素
27         System.out.println(linkedList.peekFirst());
28         pringLinkedList(linkedList);
29          
30         // peekLast 获取最后一个元素
31         System.out.println(linkedList.peekLast());
32         pringLinkedList(linkedList);
33          
34         // pollFirst 摘取第一个元素
35         System.out.println(linkedList.pollFirst());
36         pringLinkedList(linkedList);
37          
38         // pollLast 榨取最后一个元素
39         System.out.println(linkedList.pollLast());
40         pringLinkedList(linkedList);
41     }
42 }

运行输出:

当前元素的集合:

张三 李四 王五 李四 赵六 

1

当前元素的集合:

张三 李四 王五 李四 赵六 

张三

当前元素的集合:

张三 李四 王五 李四 赵六 

赵六

当前元素的集合:

张三 李四 王五 李四 赵六 

张三

当前元素的集合:

李四 王五 李四 赵六 

赵六

当前元素的集合:

李四 王五 李四 

 

二、集合的遍历

前面我们讲了最简单的集合遍历用for循环。今天再介绍两个 Iterator和foreach;

首先是Iterator遍历器,我们给下实例:

先给一个Student类:

 1 public class Student {
 2  
 3     private String name; 4 private Integer age; 5 6 7 8 public Student() { 9 super(); 10 // TODO Auto-generated constructor stub 11  } 12 public Student(String name, Integer age) { 13 super(); 14 this.name = name; 15 this.age = age; 16  } 17 public String getName() { 18 return name; 19  } 20 public void setName(String name) { 21 this.name = name; 22  } 23 public Integer getAge() { 24 return age; 25  } 26 public void setAge(Integer age) { 27 this.age = age; 28  } 29 30 31 }
 1 import java.util.Iterator;
 2 import java.util.LinkedList; 3 4 5 public class TestIterator { 6 7 public static void main(String[] args) { 8 LinkedList<Student> list=new LinkedList<Student>(); 9 list.add(new Student("张三",10)); 10 list.add(new Student("李四",20)); 11 list.add(new Student("王五",30)); 12 13 /** 14 * 用Iterator遍历集合 15 */ 16 Iterator<Student> it=list.iterator(); // 返回一个迭代器 17 while(it.hasNext()){ 18 Student s=it.next(); // 返回迭代的下一个元素。 19 System.out.println("姓名:"+s.getName()+"年龄:"+s.getAge()); 20  } 21  } 22 }

运行输出:

姓名:张三年龄:10

姓名:李四年龄:20

姓名:王五年龄:30

 

foreach遍历:

 1 import java.util.LinkedList;
 2  
 3 public class TestForeach { 4 5 public static void main(String[] args) { 6 LinkedList<Student> list=new LinkedList<Student>(); 7 list.add(new Student("张三",10)); 8 list.add(new Student("李四",20)); 9 list.add(new Student("王五",30)); 10 11 /** 12 * 用foreach遍历 13 */ 14 for(Student s:list){ 15 System.out.println("姓名:"+s.getName()+"年龄:"+s.getAge()); 16  } 17  } 18 }

运行输出:

姓名:张三年龄:10

姓名:李四年龄:20

姓名:王五年龄:30

 

三、Map集合

是存放一对值的最大接口,即接口中的每一个元素都是一对,以key->value键值对的形式保存;我们这里讲解下Map的常用实现类HashMap

我们给下演示代码:

 1 import java.util.HashMap;
 2 import java.util.Iterator;
 3  
 4 public class TestHashMap {
 5  
 6     public static void main(String[] args) {
 7         HashMap<String,Student> hashMap=new HashMap<String,Student>();
 8         hashMap.put("1号", new Student("张三",10));
 9         hashMap.put("2号", new Student("李四",20));
10         hashMap.put("3号", new Student("王五",30));
11          
12         // 通过key,获取value
13         Student s=hashMap.get("1号");
14         System.out.println(s.getName()+":"+s.getAge());
15          
16         Iterator<String> it=hashMap.keySet().iterator(); // 获取key的集合,再获取迭代器
17         while(it.hasNext()){
18             String key=it.next();  // 获取key
19             Student student=hashMap.get(key);  // 通过key获取value
20             System.out.println("key="+key+" value=["+student.getName()+","+student.getAge()+"]");
21         }
22     }
23 }

运行输出:

张三:10

key=3号 value=[王五,30]

key=2号 value=[李四,20]

key=1号 value=[张三,10]

 

四、Set集合

Set集合是Collection接口的子接口,没有对Collection接口进行扩展,里面不允许存在重复的内容

演示代码:

 1 import java.util.HashSet;
 2 import java.util.Iterator;
 3  
 4 public class TestHashSet {
 5  
 6     public static void main(String[] args) {
 7         /**
 8          * 1,HashSet是无序
 9          * 2,不循序有重复的值
10          */
11         HashSet<String> hs=new HashSet<String>();
12         hs.add("21221");
13         hs.add("112");
14         hs.add("312");
15         hs.add("421");
16         hs.add("312");
17          
18         /**
19          * 用Iterator遍历集合
20          */
21         Iterator<String> it=hs.iterator();
22         while(it.hasNext()){
23             String s=it.next();
24             System.out.println(s+" ");
25         }
26     }
27 }

运行输出:

112 

421 

312 

21221