Java学习之集合类List、Set、Map

具体的关于ArrayList等实现类的介绍有时间再专门写篇文章,这里只是作简单介绍

集合类概述

集合类又被称为容器,和数组类似都能够存储一定的数据,但是又不一样。
数组和集合的对比
常用的集合有List、Set、Map。其中接口List和Set继承了Collection接口,各接口还提供了不同的实现类。
常用集合类的继承关系
在说常见集合之前,先提一下Collection类。Collection类是层次结构中的根接口。构成Collection的单位称为元素。所有实现Collection接口的类都必须供给两个标准的机关函数:无参数的机关函数用于创建一个空的Collection,有一个Collection参数的机关函数用于创建一个新的Collection,这个新的Collection与传入的Collection有雷同的元素。后一个机关函数容许用户复制一个Collection。下面介绍一下该类提供的方法:
Collection方法
内容摘自Java API手册
其中常用的是add()、remove()、isEmpty()、iterator()、size()。

在对集合中的数据进行遍历时,经常要用到迭代器(Iterator)来获取集合的迭代器,所以这里也对迭代器进行一下简单的介绍:

迭代器(Iterator)

Iterator是一个用于遍历集合中元素的接口,所有的集合类,都实现了Iterator接口。
下面是Java API手册中迭代器类的方法:
迭代器
举个例子:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Demo {
    public static void main(String[] args) {
        Collection<String> list=new ArrayList<String>();    //初始化元素类型为String的容器
        list.add("a");          //向集合中添加元素
        list.add("b");
        list.add("c");
        Iterator<String> it=list.iterator();    //返回迭代器的值
        while(it.hasNext()){                    //判断存在 下一个数值
            String str=(String)it.next();       //返回迭代器的下一个元素
            System.out.println(str);
        }
    }
}

输出结果为:

a
b
c

这里需要提醒一下,Iterator的next()方法返回的是Object,所以要对其进行强制转换为String类。

List集合

List集合继承了Collection类,集合中的元素允许重复,各元素的顺序就是对象的插入顺序,除了迭代器之外,List和数组类似,能够通过索引(元素在集合中的位置编号,从0开始)来访问集合中的元素。

List接口 继承了Collection的同时还定义了新的方法:
下面是API手册中的List接口的方法:
list1
list2
其中常用的主要是以下两个:
get(int index); 获得指定索引位置的元素,实现了按索引查找的功能。
set(int index,Object obj); 将索引指定位置的元素修改为指定对象。
List接口的实现类:
1. ArrayList类(动态数组):允许保存所有元素(包括null),非线程安全,插入数据有序,查找元素速度快,但由于插入数据涉及到元素移动等内存操作,所以对增删操作速度较慢。ArrayList类采用数组体式格式存储数据,数组元素数大于实际存储的数据以便增长和插入元素。
2. LinkedList类:采用链表结构保存对象,便于增删对象,查找对象慢。
代码示例:

import java.util.ArrayList;
import java.util.List;

public class Gather {
    public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        int m=(int)(Math.random()*list.size());
        System.out.println("随机数对应的元素值为:"+list.get(m));
        list.remove(2);             //索引值是从0开始的,即2对应的索引值为“c”
        list.remove("b");
        System.out.println("删除索引是‘2’的元素后和值为“c”的元素之后,数组遍历结果为:");
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
}

输出结果为:

随机数对应的元素值为:c
删除索引是‘2’的元素后和值为“c”的元素之后,数组遍历结果为:
a

Set集合

相对于List集合,Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象,同样,Set继承于Collection类。
Set常见实现类:

  1. HashSet类
    由哈希表(HashMap实例)支持。不保证Set的迭代顺序,特别是它不能保证该顺序恒久不变,允许使用null元素。
  2. TreeSet类
    不仅实现了Set接口,还实现了java.util.SortedSet接口,因此TreeSet类实现Set集合在遍历集合时按照自然顺序递增排序,也可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。
    (还有一个AbstractMap类用的少,如果以后接触了再补上来)
    方法
    方法
    方法
    方法

对于TreeSet中的在遍历集合时按照自然顺序递增排序,但也不允许元素重复,参考
Comparable接口:

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。 compareTo()方法用于比较此对象与指定对象的顺序。

下面是TreeSet的代码示例:

import java.util.Iterator;
import java.util.TreeSet;

public class UpdateStu implements Comparable<Object> {
    String name;
    long id;
    public UpdateStu(String name,long id){
        this.id=id;
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }

    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        UpdateStu upstu=(UpdateStu)o;
        int result=id>upstu.id?1:(id==upstu.id?0:-1);   //比较当前类和传入的类的id大小,如果根据比值的情况,分别返回1,0,-1
        return result;
    }
    public static void main(String[] args) {
        UpdateStu stu1=new UpdateStu("李同学",00101);
        UpdateStu stu2=new UpdateStu("张同学",00102);
        UpdateStu stu3=new UpdateStu("刘同学",00103);
        UpdateStu stu4=new UpdateStu("王同学",00104);
        TreeSet<UpdateStu> tset=new TreeSet<UpdateStu>();
        tset.add(stu3);
        tset.add(stu2);
        tset.add(stu1);
        tset.add(stu4);
        Iterator<UpdateStu> iter=tset.iterator();
        System.out.println("遍历tset集合中的元素");
        while(iter.hasNext()){
            UpdateStu stu=(UpdateStu)iter.next();       //next()方法返回的是Object,所以要对其进行类型转换
            System.out.println(stu.getI  d()+" "+stu.getName());
        }
        iter=tset.headSet(stu3).iterator();
        System.out.println("截取stu3前面的部分集合");
        while(iter.hasNext()){
            UpdateStu stu=(UpdateStu)iter.next();       
            System.out.println(stu.getId()+" "+stu.getName());
        }
        iter=tset.subSet(stu1, stu3).iterator();
        System.out.println("截取stu1和stu3中间部分的集合");
        while(iter.hasNext()){
            UpdateStu stu=(UpdateStu)iter.next();       
            System.out.println(stu.getId()+" "+stu.getName());
        }
        iter=tset.tailSet(stu2).iterator();
        System.out.println("截取stu2之后的集合");
        while(iter.hasNext()){
            UpdateStu stu=(UpdateStu)iter.next();       //定义一个局部的UpdateStu变量,便于下行的数据输出
            System.out.println(stu.getId()+" "+stu.getName());
        }

    }

}

代码说明:存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序。

Map集合

Map集合并非继承Collection接口,其提供的是key到value的映射一个value可以被多个key映射,但是key只能指向一个value,且key值不能相同。
下面是Map的常用方法:

方法名 作用
put(K key,V value) 向集合中添加指定的key和value的映射关系
containsKey(Object key) 如果此映射中包含指定key的映射关系,则返回true
containsValue(Object value) 如果此映射将一个或多个key映射到指定的value,返回true
get(Object key) 如果存在指定的key,则返回该对象对应的值,否则返回null
keySet() 返回该集合中的所有key对象形成的Set集合
values() 返回该对象中所有值对象形成的Collection集合

代码示例:

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class UpStu {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<String,String>();
        map.put("01","李同学");
        map.put("02", "张同学");
        map.put("03", "王同学");
        System.out.println("查找是否有编号为02的同学:"+map.containsKey("02"));
        System.out.println("查找是否有王同学:"+map.containsValue("王同学"));
        Set<String> set=map.keySet();   //获取key的集合
        Collection<String> coll=map.values();   //获取values的集合
        Iterator<String> siter=set.iterator();
        Iterator<String> citer=coll.iterator();
        System.out.println("key集合中的元素:");
        while(siter.hasNext()){
            String str=(String) siter.next();
            System.out.println(str);
        }
        System.out.println("values集合中的元素:");
        while(citer.hasNext()){
            String str=(String)citer.next();
            System.out.println(str);
        }
    }
}

result:

查找是否有编号为02的同学:true
查找是否有王同学:true
key集合中的元素:
01
02
03
values集合中的元素:
李同学
张同学
王同学

Map集合中是允许对象是null的,而且没有个数限制。
Map接口的实现类

HaspMap:建议使用HashMap集合实现Map集合,因为该类实现的Map集合添加和删除映射关系效率更高。该类是基于哈希表的Map接口的实现,通过哈希码对其内部的映射关系进行快速查找,允许使用null值和null键,但是必须保证唯一性。
TreeMap:TreeMap类实现的Map集合存在一定的顺序,当需要有序的Map集合时,可以考虑TreeMap,不允许键值为null。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

class Emp{
    private String name;
    private String id;
    public Emp(String id,String name){
        this.id=id;
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

}
public class MapText {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<String,String>();
        Emp emp1=new Emp("001","张三");
        Emp emp2=new Emp("002","李四");
        Emp emp3=new Emp("003","王一");
        Emp emp4=new Emp("004","赵六");
        Emp emp5=new Emp("005","黄七");
        Emp emp6=new Emp("006","牛二");

        map.put(emp2.getId(), emp2.getName());
        map.put(emp4.getId(), emp4.getName());
        map.put(emp1.getId(), emp1.getName());
        map.put(emp3.getId(), emp3.getName());
        map.put(emp6.getId(), emp6.getName());
        map.put(emp5.getId(), emp5.getName());

        Set<String> set=map.keySet();
        Iterator<String> siter=set.iterator();
        System.out.println("HashMap类实现的Map集合,无序");
        while(siter.hasNext()){
            String key=(String)siter.next();        //获取下个迭代器的值,即key
            String name=(String)map.get(key);       //调用map.get()方法,根据映射,返回key对象对应的值
            System.out.println(key+" "+name);       
        }
        System.out.println("Treemap类实现的Map集合,有序");
        TreeMap<String,String> treemap=new TreeMap<String,String>();
        treemap.putAll(map);            //将map对象中的所有值赋给treemap
        Iterator<String> titer=treemap.keySet().iterator();     
        while(titer.hasNext()){
            String key=(String)titer.next();        //获取下个迭代器的值,即key
            String name=(String)map.get(key);       //调用map.get()方法,根据映射,返回key对象对应的值
            System.out.println(key+" "+name);
        }
    }
}

result:

查找是否有编号为02的同学:true
查找是否有王同学:true
key集合中的元素:
01
02
03
values集合中的元素:
李同学
张同学
王同学

猜你喜欢

转载自blog.csdn.net/dypnlw/article/details/79439432