第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中移除迭代器返回的最后一个元素。