zoukankan      html  css  js  c++  java
  • 《Java从入门到精通》第十章学习笔记

    第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 }
  • 相关阅读:
    赫尔维茨公式
    从解析几何的角度分析二次型
    Struts 1 Struts 2
    记一次服务器被入侵的调查取证
    契约式设计 契约式编程 Design by contract
    lsblk df
    Linux Find Out Last System Reboot Time and Date Command 登录安全 开关机 记录 帐号审计 历史记录命令条数
    Infrastructure for container projects.
    更新文档 版本控制 多版本并发控制
    Building Microservices: Using an API Gateway
  • 原文地址:https://www.cnblogs.com/tsembrace/p/4596388.html
Copyright © 2011-2022 走看看