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 }
  • 相关阅读:
    IDEA手动创建JFinal项目(404问题处理)
    php 把数字1-1亿换成汉字表述,例如 150 转成 一百五十
    模仿console自写函数打印js的对象
    每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒? php
    js-Event构造函数,也许你需要
    js将金额专成每隔3位数加逗号
    js-PC版监听键盘大小写事件
    用php脚本给html中引用的js和css路径打上版本
    通过js的console优雅的将php调试信息输出
    android中加载的html获取的宽高不正确
  • 原文地址:https://www.cnblogs.com/tsembrace/p/4596388.html
Copyright © 2011-2022 走看看