第10章 Java集合类
一、概述
Java中的java.util包中提供了一些集合类,也被称为容器,不同于数组,集合的长度是可变的,存放的是对象的引用。常用的集合有List集合、Set集合、Map集合,其中List和Set实现了Collection接口。
二、集合类接口的常用方法
1、List接口的常用方法:因为继承了Collection接口,所以List接口也继承了Collection中的所有方法。List集合以线性有序的方式存储对象。List集合中可以包含重复的对象,的主要方法如下:
(1)add(int index,Object obj):返回值为void。用于向集合中指定索引位置添加对象。
(2)addAll(int index,Collection coll):返回值为boolean型。用于向集合中指定索引位置添加指定的集合对象。
(3)remove(int index):返回值为Object。用于移除集合中的指定索引位置的对象。
(4)get(int index):返回值为Object。用于获取指定索引位置的对象。
(5)indexOf(Object obj):返回值int。返回集合中对象第一次出现的索引位置,如果不存在则返回-1。
(6)lastIndexOf(Object obj):返回值int。返回集合中对象最后一次出现的索引位置,如果不存在则返回-1。
(7)subList(int formIndex,int toIndex):返回值List。获取两索引之间元素对象组成的List集合。
(8)set(int index,E element):返回值Object。用指定元素替换列表中指定索引位置的元素。
(9)listIterator():返回值ListIterator.用于获得一个包含所有对象的ListIterator列表迭代器。
1 import java.util.List; 2 import java.util.LinkedList; 3 import java.util.Iterator; 4 public class GenericTest{ 5 public static void main(String[] args){ 6 String a="A",b="B",c="C",d="D",e="E";//定义插入集合的字符串对象 7 List<String> list=new LinkedList<String>(); 8 //创建一个LinkedList集合 9 list.add(a); 10 list.add(e); 11 list.add(d); 12 Iterator<String> fristIterator=list.iterator(); 13 //创建List的迭代器 14 System.out.println("修改前集合中元素是:"); 15 while(fristIterator.hasNext()){ 16 System.out.print(fristIterator.next()+" "); 17 } 18 list.set(1,b); 19 list.set(2,c); 20 Iterator<String> it=list.iterator(); 21 System.out.println(""); 22 System.out.println("修改后集合中元素是:"); 23 while(it.hasNext()){ 24 System.out.print(it.next()+" "); 25 } 26 } 27 }
1 //创建List集合对象,通过add()方法添加元素,并将特殊对象元素在索引中出现的第一次、最后一次索引输出 2 import java.util.List; 3 import java.util.LinkedList; 4 import java.util.Iterator; 5 public class CollectionDemo { 6 7 public static void main(String[] args) { 8 String a="a",b="b",c="c",d="d",e="e",x="apple"; 9 List<String> list=new LinkedList<String>(); 10 list.add(a); 11 list.add(x); 12 list.add(b); 13 list.add(c); 14 list.add(d); 15 list.add(e); 16 list.add(a); 17 list.add(d); 18 list.add(x); 19 Iterator<String> it=list.iterator(); 20 System.out.println("列表List为:"); 21 int index=0; 22 while(it.hasNext()){ 23 System.out.print("序号"+index+":"+it.next()+";"); 24 index++; 25 } 26 System.out.println("其长度为:"+list.size()); 27 if((list.indexOf(a)!=-1)){ 28 System.out.println("a第一次出现在列表中的索引位置为:"+list.indexOf(a)); 29 System.out.println("a最后一次出现在列表中的索引位置为:"+list.lastIndexOf(a)); 30 }else{ 31 System.out.println("a没有出现在列表中"); 32 } 33 if((list.indexOf(x)!=-1)){ 34 System.out.println("apple第一次出现在列表中的索引位置为:"+list.indexOf(x)); 35 System.out.println("apple最后一次出现在列表中的索引位置为:"+list.lastIndexOf(x)); 36 }else{ 37 System.out.println("apple没有出现在列表中"); 38 } 39 if((list.indexOf("ts")!=-1)){ 40 System.out.println("ts第一次出现在列表中的索引位置为:"+list.indexOf("ts")); 41 System.out.println("ts最后一次出现在列表中的索引位置为:"+list.lastIndexOf("ts")); 42 }else{ 43 System.out.println("ts没有出现在列表中"); 44 } 45 } 46 }
2、Set接口的常用方法:一样也继承了Collection接口的所有方法,并且Set集合中不允许有重复值。
(1)add(Object obj):如果Set集合中不存在obj则添加。
(2)addAll(Collection coll):将coll添加到Set集合尾部。
(3)remove(Object obj):移除指定的元素。
(4)retainAll(Collection coll):只保存Set集合中包含在coll集合中的元素。
(5)removeAll(Collection coll):移除Set集合中所有包含在coll集合中的元素。
(6)clear():清空Set集合。
(7)iterator():返回Set集合中元素进行迭代的迭代器。
//创建一个List集合向其中添加元素 //再创建一个Set集合 //利用addAll()将List集合对象存入Set集合,打印Set集合中元素 import java.util.List; import java.util.Set; import java.util.LinkedList; import java.util.HashSet; public class CollectionDemo { public static void main(String[] args) { int[] a0={1,3,5,6,8,9,12,15}; int[] a1={2,4,5,6,8,11,13,15,21}; List<Integer> list=new LinkedList<Integer>(); Set<Integer> set=new HashSet<Integer>(); for(int x:a0){ list.add(x); } for(int x:a1){ set.add(x); } System.out.println("list集合初始化为:"+list); System.out.println("set集合初始化为:"+set); set.addAll(list); System.out.println("新的set集合为:"+set+"长度为:"+set.size()); set.clear(); System.out.println("清空后set长度为:"+set.size()); } }
3、Map接口的常用方法
Map接口提供了将键值映射到值的对象,一个映射中不能包括重复的键,而且每个键最多只能映射到一个值。
(1)put(key k,value v):向集合中添加指定的键和值。
(2)containskey(Object key):如果此映射包含指定的键的映射关系,则返回true.
(3)containsValue(Object value):如果此映射将一个或多个键指向指定值,则返回true.
(4)get(Object key):如果存在指定的键对象,则返回该对象对应的值,否则返回null。
(5)keySet():返回该集合中的所有键对象组成的Set集合。
(6)values():返回该集合中所有值对象形成的Collection集合。
1 //向一个Map集合中插入元素并根据Key的值打印集合中的元素 2 3 import java.util.Map; 4 import java.util.HashMap; 5 public class MapDemo { 6 7 public static void main(String[] args) { 8 Map<String,String> map=new HashMap<String,String>(); 9 map.put("1","apple"); 10 map.put("2","pear"); 11 map.put("3","orange"); 12 for(int i=1;i<=3;i++){ 13 System.out.println("第"+i+"个元素是:"+map.get(""+i+"")); 14 } 15 } 16 }
三、集合类接口的实现类
1、List接口的常用实现类有ArrayList和LinkedList。
(1)ArrayList类:通过List接口具备的方法实现了可变数组,可通过索引快速访问,但插入和删除操作速度较慢。
(2)LinkedList类:采用了链表结构,便于快速插入和删除对象,但随机访问速度较慢。
List<String> list1=new ArrayList<String>(); List<String> list2=new LinkedList<String>();
对象的声明采用接口类型可便于程序的拓展和修改,并通过泛型<String>约束对象的类型。
1 import java.util.List; 2 import java.util.ArrayList; 3 public class Gather { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 List list=new ArrayList(); 8 System.out.println("数组列表长度为:"+list.size()); 9 int ri=(int)(Math.random()*100); 10 System.out.println("随机数取得为:"+ri); 11 list.add("a"); 12 list.add("b"); 13 list.add("c"); 14 System.out.println("创建后数组列表长度为:"+list.size()); 15 int i=ri%list.size(); 16 System.out.println("随机获取数组中的元素:"+list.get(i)); 17 list.remove(2); 18 System.out.println("将索引是'2'的元素移除后,数组中的元素是:"); 19 for(int j=0;j<list.size();j++){ 20 System.out.print(list.get(j)+" "); 21 } 22 } 23 }
2、Set接口的实现类常用的主要有HashSet类和TreeSet类,一般用Set接口类型声明创建的Set对象。
1 //People类定义 2 public class People { 3 private String name; 4 private long id_card; 5 public People(String name,long id_card){ 6 this.name=name; 7 this.id_card=id_card; 8 } 9 public long getId_card(){ 10 return this.id_card; 11 } 12 public void setId_card(long id){ 13 this.id_card=id; 14 } 15 public String getName(){ 16 return this.name; 17 } 18 public void setName(String name){ 19 this.name=name; 20 } 21 } 22 23 import java.util.Iterator; 24 import java.util.Set; 25 import java.util.HashSet; 26 public class CollectionDemo { 27 28 public static void main(String[] args) { 29 // TODO Auto-generated method stub 30 Set<People> hashSet=new HashSet<People>(); 31 hashSet.add(new People("KellyWong",98102106)); 32 hashSet.add(new People("TinsonG",98102118)); 33 hashSet.add(new People("MingLeu",98102135)); 34 hashSet.add(new People("YiJon",98102142)); 35 hashSet.add(new People("YooSan",98102151)); 36 Iterator<People> it=hashSet.iterator(); 37 System.out.println("hashSet集合中的元素是:"); 38 while(it.hasNext()){ 39 People p=it.next(); 40 System.out.println(p.getName()+" "+p.getId_card()); 41 } 42 } 43 }
3、Map接口的实现类主要有HashMap类和TreeMap类,通常用HashMap类实现的Map集合对于添加和删除映射关系的效率更高。HashMap是基于哈希表的Map接口的实现,HashMap中允许使用null键和null值,但必须保证键的唯一性。TreeMap中映射关系存在一定的顺序,在考虑需要实现顺序存储时可以考虑使用TreeMap类,因为TreeMap类中映射的顺序是按照键对象的规则,所以不允许键对象为null。
1 public class Emp { 2 public String e_id; 3 public String e_name; 4 public Emp(String id,String name){ 5 this.e_id=id; 6 this.e_name=name; 7 } 8 } 9 //测试主类,分别创建一个由HashMap和TreeMap实现的Map集合,并遍历之 10 import java.util.Map; 11 import java.util.HashMap; 12 import java.util.TreeMap; 13 import java.util.Set; 14 import java.util.Iterator; 15 16 public class MapTest { 17 18 19 public static void main(String[] args) { 20 // TODO Auto-generated method stub 21 Map map=new HashMap(); 22 Emp emp1=new Emp("98102101","GTS"); 23 Emp emp2=new Emp("98102102","WJ"); 24 Emp emp3=new Emp("98102103","SYS"); 25 Emp emp4=new Emp("98102104","YYZ"); 26 Emp emp5=new Emp("98102105","LM"); 27 map.put(emp1.e_id, emp1.e_name); 28 map.put(emp2.e_id, emp2.e_name); 29 map.put(emp3.e_id, emp3.e_name); 30 map.put(emp4.e_id, emp4.e_name); 31 map.put(emp5.e_id, emp5.e_name); 32 Set set=map.keySet(); 33 Iterator it=set.iterator(); 34 System.out.println("HashMap类实现的Map集合(无序):"); 35 while(it.hasNext()){ 36 String str=(String)it.next(); 37 String name=(String)map.get(str); 38 System.out.println(str+" "+name); 39 } 40 TreeMap treemap=new TreeMap(); 41 treemap.putAll(map); 42 Iterator iter=treemap.keySet().iterator(); 43 System.out.println("TreeMap类实现的Map集合(按键对象升序):"); 44 while(iter.hasNext()){ 45 String str=(String)iter.next(); 46 String name=(String)map.get(str); 47 System.out.println(str+" "+name); 48 } 49 } 50 }
//创建一个ArrayList类对象 import java.util.List; import java.util.ArrayList; import java.util.Iterator; public class ForArrayList { public static void main(String[] args){ List<Integer> list=new ArrayList<Integer>(); for(int i=0;i<10;i++){ int x=(int)(Math.random()*100); list.add(x); } Iterator<Integer> it=list.iterator(); System.out.println("ArrayList实例为:"); while(it.hasNext()){ System.out.print(it.next()+" "); } System.out.println(); System.out.println("ArrayList实例中奇数为:"); for(int i=0;i<list.size();i++){ if(i%2==1){ System.out.print(list.get(i)+" "); } } } }
四、迭代器
1、利用Iterator接口创建迭代器,Iterator接口位于java.util包里。
(1)hasNext():如果当前仍有元素可以迭代,则返回true;
(2)next():返回迭代的下一个元素。
(3)remove():从迭代器指向的collection中移除迭代器返回的最后一个元素。
五、实战练习
1 /* 2 * 将1~100之间的所有整数存放在一个List集合中 3 * 并将集合中索引位置为10的对象从中删除 4 */ 5 import java.util.List; 6 import java.util.LinkedList; 7 public class ListDelDemo { 8 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 List<Integer> list=new LinkedList<Integer>(); 12 for(int i=1;i<=100;i++){ 13 list.add(i); 14 } 15 System.out.println("创建的整数列表为:"); 16 System.out.println(list); 17 list.remove(10); 18 System.out.println("删除索引位置为10的元素后整数列表为:"); 19 System.out.println(list); 20 } 21 }
1 /* 2 * 分别向Set集合和List集合中添加"A","a","c","C","a" 3 * 观察重复值"a"能否在两集合中成功添加 4 */ 5 import java.util.List; 6 import java.util.LinkedList; 7 import java.util.Set; 8 import java.util.HashSet; 9 public class AddDemo { 10 11 public static void main(String[] args) { 12 // TODO Auto-generated method stub 13 List<String> list=new LinkedList<String>(); 14 Set<String> set=new HashSet<String>(); 15 String[] arrx={"A","a","c","C","a"}; 16 for(int i=0;i<5;i++){ 17 System.out.println("第"+i+"次添加元素:"); 18 list.add(arrx[i]); 19 System.out.println("List集合为:"+list); 20 if(set.add(arrx[i])){ 21 System.out.println("Set集合为:"+set); 22 }else{ 23 System.out.println("Set集合无法添加元素:"+arrx[i]); 24 } 25 } 26 System.out.println("List和Set初始化完成!"); 27 System.out.println("List集合为:"+list); 28 System.out.println("Set集合为:"+set); 29 30 } 31 32 }
1 /* 2 * 创建Map集合,创建Emp对象,并将创建的Emp对象添加到集合中 3 * Emp对象的id作为Map的键 4 * 并将id为005的对象从集合中删除 5 */ 6 import java.util.Map; 7 import java.util.HashMap; 8 import java.util.Iterator; 9 public class MapDemo { 10 public class Emp{ //创建Emp类 11 private String id; //private修饰保护对象属性 12 private int value; 13 public Emp(){ 14 } 15 public Emp(String id,int value){ 16 this.id=id; 17 this.value=value; 18 } 19 public String getId(){ 20 return this.id; 21 } 22 public int getValue(){ 23 return this.value; 24 } 25 } 26 27 public static void main(String[] args) { 28 // TODO Auto-generated method stub 29 String[] arrStr={"001","002","003","004","005","006","007"}; 30 MapDemo mapDemo=new MapDemo(); //main为static,需要先创建MapDemo对象以访问Emp 31 Map<String,Emp> map=new HashMap<String,Emp>(); 32 //创建map集合,键对象:String类型;值对象:Emp类型 33 for(int i=0;i<7;i++){ 34 Emp temp=mapDemo.new Emp(arrStr[i],i+100); 35 map.put(temp.getId(),temp); 36 }//初始化 37 System.out.println("map初始化完成!"); 38 Iterator it=map.keySet().iterator(); 39 while(it.hasNext()){ 40 String str=(String)it.next(); 41 String str1=map.get(str).getId(); 42 int val1=map.get(str).getValue(); 43 System.out.println(str+":"+str1+"---"+val1); 44 } 45 map.remove("005"); 46 System.out.println("删除键为'005'的映射后map为:"); 47 Iterator it1=map.keySet().iterator(); //需重新设置Iterator 48 while(it1.hasNext()){ 49 String str=(String)it1.next(); 50 String str1=map.get(str).getId(); 51 int val1=map.get(str).getValue(); 52 System.out.println(str+":"+str1+"---"+val1); 53 } 54 55 } 56 57 }