集合的引入
当我们有种需求,需要存储多个元素的结构时,我们前面讲过数组,数组可以存储。但是数组也有它的弊端,使用的时候,必须先定义好长度,也就是数组的长度是固定,不能根据我们的需求自动变长或者变短。
我们看一个实例:先定义一个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 文档:
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