超详细的Java基础Map和Set集合教学以及迭代器的使用

迭代器(Iterator)的用法和使用

public interface Iterator<E>{
    E next();
    boolean hasNext();
    void remove();
}

iterator接口包含了3个方法,可以反复调用next方法,遍历集合中每个元素,但如果达到集合的末尾,next方法就会抛出NoSuchElementException,所以要在调用next方法前调用hasNext方法,例如:

    Iterator<String> i = list.iterator();
    while (i.hasNext()){
        String ilist=i.next();
        System.out.print(ilist+" ");
    }  //迭代器

hashCode()方法以及hashtable(散列表)

有一种数据结构,可以快速查找对象,这就是散列表(hashtable),散列表为为每个对象计算出一个整数,称为散列码(hashCode),例如"Lee" 的散列码为 76268 "eel"的散列码为100300,他们是为String类的hashCode方法产生
hashCode方法与equals方法兼容,即如果a.equals(b) 为true,a与b的也必须含有相同分的散列码 即(hashCode).
哈希表(hashTable):
hashTable 就是对象数组和链表,每个链表称为桶(bucket)散列表,实际上是一种根据Key值而直接进行访问的数据结构

在这里插入图片描述
想要查找表中对象的位置,就要计算它散列码(hashCode),例如某个"Lee"这个对象 其hashCode是76269,并且表中有128个桶,则对象应保存在第108号桶中(76268除以128余108),数组的初始长度为16,即为有16个桶,当桶中的数量大于8时(链表长度大于8)链表转换为红黑树,当桶中元素数量减少到6时,红黑树转回为链表。
每个哈希表在开始时都是有16个桶和 0.75的散列值,意思就是假如现在有12个桶里都存放数据(16x0.75)那么数组就会扩容就会扩容到之前的两倍 即32个桶就是数组长度为32,那么取余运算不再是除16而是除32来寻找位置,以此类推。

hashSet和TreeSet

hashSet可以用add方法添加元素,contains方法查看是否出现在集中,不必遍历所有元素,散列集访问所有的桶,他们的顺序几乎是随机的(因为根据hashCode排序),只有不关心顺序时才会使用HashSet,例如:

    HashSet hashSet = new HashSet(list); //添加对象
    list.clear();
    list.addAll(hashSet); //利用hashset 无重复性

    Iterator<String> i = list.iterator();
    while (i.hasNext()){
        String ilist=i.next();
        System.out.print(ilist+" ");
    }  //迭代器
    System.out.println();
    System.out.println("---------");
    for (String ilist: list) {
        System.out.print(ilist+" ");
    }//增强for

TreeSet与散列值十分相似,不过它是一个有序集合,每个值讲自动排序,实现了Comparable接口(至于comparable和comparator方法我会单独拿出一章来讲)
用法与HashSet类似

Map(映射表)键/值

Map用来存放键/值对,如果提供了键,就能查找到值。例如键为员工ID,值则为员工对象。例如:

    Map<String,Employee>staff=new HashMap<>();
    Employee e1=new Employee("Zhang");
    staff.put("员工id",e1);

Map 集合的遍历方式

首先先讲一下3个视图:
分别是
SetkeySet;//键集
Collection values(); //值集合(不是集
Set<Map,Entry<K,V>entrySet(); //键/值对集
keySet既不是HashSet,也不是TreeSet,而是实现了Set接口的某个其他类的对象,Set接口扩展了Collection接口因此可以像使用其他集合一样使用keySet
利用key 遍历查找

   Set<String> keyset =map.keySet();
    for (String key:keyset) {
        System.out.println(key+map.get(key));
    }

还可以枚举各个条目(entries)利用键值对集来查找key 和value

   for (Map.Entry<String,Employee>entry:empolyee.entrySet()) {
        String key=entry.getKey();
        Employee value=entry.getValue();
    }    
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值