《Java从入门到精通》第十章学习笔记

时间:2023-02-17 16:03:40

第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 }