Java基础--Iterator接口相关

集合中的一个游标Iterator接口

  1. iterator接口中声明了4个方法
    • hasNext();
    • next();
    • remove();
    • forEachRemaining()
iterator是什么?
  1. 迭代器:迭代器又可以看做是游标,它封装了集合内部细节,指向集合框架类似index,
  • 常用方法比如boolean hasNext():顾名思义就是有下一个,有的话返回true
  • next():指向下一个
  • remove():删除返回的最后一个元素
  1. iterator有啥用?
  • 主要是遍历集合,不管是Collection接口的集合还是Map接口的集合
  1. iterator遍历的好处?
  • iterator遍历不用分各种类型的集合
  • 如果不使用iterator遍历,那么就得每个集合都要用自己的方法遍历集合,耦合度非常大,使用iterator通用遍历器,能解决这个问题
  List<E> list = new Arralist<E>();
  list.add();
  Iterator<E> lterator = list.iterator();//多态
//遍历
  while(lterator.hasNext()){
    System.out.print(lterator.next());
  }
//删除
  while(lterator.hasNext()){
    E item = lterator.next();
    if(删除条件 比如说:item > 2){
      lterator.remove();
    }
  }
  1. Iterable接口是Collection、Map等接口的父接口
  • List是Collection的实现类,因此重写了iterator()
  • iterator接口相当于是实例化一下迭代器(只是理解上说实例)
iterable的子接口们
  1. iterator的子接口们有Collection接口等等

Collection是接口 Collections是的接口的一些封装工具

Collection接口的一些实现类和子接口们
  1. Collection有List接口,Set接口,Vector类

  2. List接口下最有名的几个实现类分别是ArrayList、LinkedList类、Vector类

    • List接口下实现类的一些共性:元素有序可重复、可以有空值
    • ArraList是底层是数组,增删慢,查询块,线程不安全
    • Vector底层数组,增删慢,查询快,线程安全
    • LinkedList底层是链表,增删块,查询慢,线程不安全
  3. Set接口的实现类有HashSet,TreeSet,LinkedHashSet

    • Set的共性:无序不可重复
    • HashSet:无序不可重复,允许有空值,底层是数组实现,基于HashMap实现,线程不安全
    • LinkedHashSet:有序不可重复,允许有空值,继承HashSet,底层使用的是LinkedHashMap,链表保证了元素有序,Hash表保证了元素唯一
    • TreeSet:有序,不可重复,不允许为空,基于TreeMap实现,非线程安全,可以指定方法进行排序
Map接口们
  1. Map接口的实现类有HashMap、LinkedHashMap、TreeMap等
    • Map接口是采用K/V键值映射存储元素的
    • HashMap允许KV为空,Key唯一,Value可以重复,实现方式是根据Key的HashCode值存储数据,采用Hash算法去重效率高,线程不安全
    • LinkeHashMap:在HashMap基础上采用了双向链表
    • TreeMap:有序非空(即K非空),底层是红黑树,允许V为空,Key唯一,Value可以重复
      线程不安全。
总结:
  1. 只要是Linked链表实现的集合,就一定有序,因为它是头尾相接
  2. 只要是Tree实现的集合,就可以有序,根据指定算法来排序
  3. 大体上集合分为List、Set、Map,因此
    • List整体允许重复
    • Set整体不允许重复
    • Map全是KV键值对,因此Key唯一,Value可重复
  4. 非空问题:
    • 只要是Tree实现的集合,就一定不能为空,其中加一个Vector。剩下的都可以。
消逝的HashTable
  1. HashTable因为是线程安全,不支持并发,因此在后续开发中HashMap主键取代了它,如今HashTable已经被弃用。
  2. HashTable不属于任何借口,它是Dictionary的子类,属于Java.util包
其他总结及问题
  1. 集合中的fail-fast机制
  • fail-fast机制就是快速失败机制,主要是在用iterator进行遍历集合时,通过集合来add、remove集合元素时,会抛出ConcurrentModificationException异常
  • 解决办法:使用Iterator的add、remove方法操作更新集合
  1. 说到HashMap的存储必须牵扯到Hashcode()
hashcode()和equals()
  1. hashcode():按自己理解的就是通过hash算法来计算出对象在hash表中的键的数组下标,用来寻址的一种方法。
  • API文档是具体解释的是:只要在执行Java应用程序时多次在同一个对象上调用该方法,Hashcode返回的结果总是同一个
  • 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。但是Hashcode相等,不一定equals就是true。
  • equals不相等,但是hashcode相等,会提高hash表的效率
  1. 什么时候需要重写HashCode和equals呢?
  • 当涉及到自定义类时需要重写equals和hashcode
  1. 为什么HashMap存储的时候键要用String
  • 因为String类内部已经重写了equals和hashcode
  • 如果要用自定义类存储,还需要自己在POJO中重写这两个方法
  1. 关于Hash算法的一种应用MD5加密+盐
  • MD5加密流程:在数据空存储的密码是经过MD5加密后的一串字符,用户在输入密码时,经过MD5加密后,将这个加密后的字符和数据库中存放的字符串对比,一样则登录成功。
  • 这个MD5加密是单向的,加密后不能解密,要解密超级苦难,但是也有办法
  • 如果把经常输入的密码和用户名存放到一个彩虹表里,进行匹配,万一密码一样,很可能会窃取密码。
  • 为了解决这彩虹表问题,用到了加盐技术,即在MD5加密后的字符串后面加一段随机字符串,也可以加username。在输入密码的时候,MD5加密在拼接username比较,这样就能保证彩虹表失效。
  1. 为什么要重写HashCode和equals?
  • 首先要知道一个对象在Hash表中是如何存储的
  • Hash表底层是由HashMap实现的,jdk8后,HashMap是的底层是由数组+链表+红黑树实现的,Hashcode在里面充当的作用就是计算K的数组下标,将对象存入这个位置,查找Hash表键对象的位置。
  • 一个对象要存入HashMap,经过HashCode计算,得出一个int型数,这个数和数组的长度取模,得到键的下标值,然后对象就存在这个位置
  • 然后比如来个自定义对象,p.equals(p1),它要干这个操作,那就得先把p1对象进过Hashcode计算,取模一系列后和p对象hashcode比较,相同就是true对不对。但是默认这个自定义类没有重写equals和hashcode,那么他们就算内容一样,返回的还是fasle。因为HashMap先计算HashCode,你没有重写equals,那比较的肯定是对象地址,p == p1明显是false,重写equals就是true,但是重写equals必须重写hashcode,你不能内容一样,hashcode不一样吧?
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值