Set集合

Set集合中对象不按特定方式排序,只是简单的把对象加入集合中,但set集合中不能包含重复的对象。

set 集合常用的实现类是HashSet与TreeSet:

Hashset实现set 接口,由哈希表支持。他不保证set 的迭代顺序,特别不保证该顺序恒久不变。该类允许使用null元素。

TreeSet类不仅实现了set接口,还实现了java.util.SortedSet接口。因此TreeSetsh实现的Set集合在遍历集合中能按自然顺序进行递增排序。底层用的红黑树,一种自平衡的有序二叉查找树

TreeSet类增加的方法:

方法

描述

first()

返回此Set中当前第一个(最低的 )元素

Last()

返回此Set中当前最后一个(最大的 )元素

comparator()

返回对此Set中的元素进行排序的比较器,如果set使用的自然排序,那么返回null

headSet(E toElement)

返回一个新的Set集合,新集合是toElement(不包含)之前的所有对象

subSet(E fromElement,E fromElement)

返回一个新的Set集合,新集合是包含fromElement到fromElement(不包含)的对象

tailSet(E fromElement)

返回一个新的Set集合,新集合包含对象fromElement(包含)之后所有的对象

后面三个我们可以看出是对先集合的切片索引(截取)。

eg:

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.name=name;
        this.id=id;
    }
    @Override
    public int compareTo(Object o) {
        UpdateStu updateStu = (UpdateStu) o;
        int result=id> updateStu.id?1:(id==updateStu.id ? 0:-1);
        return result;
    }

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

    public static void main(String [] args){
        UpdateStu updateStu1=new UpdateStu("李同学",0011);
        UpdateStu updateStu2=new UpdateStu("张同学",0117);
        UpdateStu updateStu3=new UpdateStu("王同学",0046);
        UpdateStu updateStu4=new UpdateStu("孙同学",0114);
        TreeSet<UpdateStu> treeSet=new TreeSet<>();
        treeSet.add(updateStu1);
        treeSet.add(updateStu2);
        treeSet.add(updateStu3);
        treeSet.add(updateStu4);
        Iterator<UpdateStu> iterator=treeSet.iterator();
        System.out.println("集合中的所有元素是:");
        while (iterator.hasNext()){
            UpdateStu stu= (UpdateStu) iterator.next();
            System.out.println(stu.getId()+" "+stu.getName());
        }

        iterator=treeSet.headSet(updateStu2).iterator();
        System.out.println("截取前面部分集合的所有元素是:");
        while (iterator.hasNext()){
            UpdateStu stu= (UpdateStu) iterator.next();
            System.out.println(stu.getId()+" "+stu.getName());
        }

        iterator=treeSet.subSet(updateStu3,updateStu4).iterator();
        System.out.println("截取中间集合中的所有元素是:");
        while (iterator.hasNext()){
            UpdateStu stu= (UpdateStu) iterator.next();
            System.out.println(stu.getId()+" "+stu.getName());
        }
    }

}

输出:

集合中的所有元素是:
9 李同学
38 王同学
76 孙同学
79 张同学
截取前面部分集合的所有元素是:
9 李同学
38 王同学
76 孙同学
截取中间集合中的所有元素是:
38 王同学

注意:存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法

比较此对象与指定对象的顺序;如果该对象小于、等于或大于指定对象,则分别返回负整数,0,正整数0

Map集合

Map集合没有继承Collection的接口,其提供的是key到Value的映射。Map中不能包含相同的Key,每个Key只能映射一个value。Key还决定了存储对象的存储位置,这不是Key对象指定的,而是由散列函数决定的,产生一个散列吗的整数值。散列码通常用作一个偏移量,该偏移量对应分配给的映射内存区域的起始位置,从而决定存储对象在映射中的存储位置。

map接口

Map接口提供将key映射到value的对象。不能有重复的key,且一个key只能映射一个值。

方法

功能描述

put(K key,V value)

向集合中添加指定的Key与value的映射关系

containsKey(Object key)

如果此映射包含指定的key映射关系,则返回true

containsValue(Object value)

如果此映射将一个或多个key映射到指定值,则返回true

get(Object key)

如果存在指定的key对象,则返回该对象对应的值,否则返回null

keySet()

返回该集合中的所有Key对象形成的Set集合

values()

返回该集合中所有值对象形成的Collection集合

eg:

import java.util.*;

public class UpadteStu_two {

    public static void main(String [] args){
        Map<String,String> map =new HashMap<>();
        map.put("01","李同学");
        map.put("02","张同学");
        map.put("03","王同学");
        map.put("04","孙同学");
        Set<String> Key_set=map.keySet();
        Iterator<String> iterator=Key_set.iterator();
        System.out.println("key集合中的元素是:");
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        Collection<String> Value_collection=map.values();
        Iterator<String> iterator1=Value_collection.iterator();
        System.out.println("value集合中的元素是");
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }

    }
}

输出:

key集合中的元素是:
01
02
03
04
value集合中的元素是
李同学
张同学
王同学
孙同学

Map接口的实现类

Map接口常用的接口就两种:HashMap TreeMap

一般情况下建议使用HashMap,因此HashMap底层是由哈希表实现的,添加、删除、查询效率都很高,HashMap通过哈希码对其内部的映射关系进行快速查找。

而TreeMap的映射关系存在一定的顺序,因此如果希望Map集合中的对象也存在一定的顺序,应该使用treeMap

HashMap允许null值和null键;但是由于TreeMap有自动排序,因此不允许有键对象是null的

eg:

public class Emp {
    private String e_id;
    private  String e_name;
    public Emp(String e_id,String e_name){
        this.e_id=e_id;
        this.e_name=e_name;
    }

    public String getE_id() {
        return e_id;
    }

    public void setE_id(String e_id) {
        this.e_id = e_id;
    }

    public String getE_name() {
        return e_name;
    }

    public void setE_name(String e_name) {
        this.e_name = e_name;
    }
}
import java.util.*;

public class MapText {

    public static void main(String [] args){
        Map<String,String> map=new HashMap<>();
        Emp emp=new Emp("351","张三");
        Emp emp2=new Emp("512","李四");
        Emp emp3=new Emp("853","王一");
        Emp emp4=new Emp("125","赵六");
        Emp emp5=new Emp("341","黄七");

        map.put(emp4.getE_id(),emp4.getE_name());
        map.put(emp5.getE_id(),emp5.getE_name());
        map.put(emp.getE_id(),emp.getE_name());
        map.put(emp2.getE_id(),emp2.getE_name());
        map.put(emp3.getE_id(),emp3.getE_name());

        Set<String> set =map.keySet();
        Iterator<String> iterator=set.iterator();
        System.out.println("HashMap实现的集合(无序)");
        while (iterator.hasNext()){
            String str= iterator.next();
            String name=(String) map.get(str);
            System.out.println(str+" "+name);
        }

        TreeMap<String,String> tree_map =new TreeMap<>();
        tree_map.putAll(map);
        Iterator<String> tree_iterator=tree_map.keySet().iterator();
        System.out.println("TreeMap实现的集合(有序)");
        while (tree_iterator.hasNext()){
            String str= tree_iterator.next();
            String name=(String) tree_map.get(str);
            System.out.println(str+" "+name);
        }


    }
}

程序输出:

HashMap实现的集合(无序)
341 黄七
125 赵六
512 李四
853 王一
351 张三
TreeMap实现的集合(有序)
125 赵六
341 黄七
351 张三
512 李四
853 王一

注意:TreeMap底层也是用的红黑树