迭代器原理hasNext方法

Java迭代器使用
使用迭代器取出用户通信线程,但是为什么不进入呢。iterator.hasNext我认为在这里是true但是结果不是,不论登录几个用户都不进入循环。
  //一个用户上线之后将上线信息通过UserThread发送到其他用户,更新在线好友列表
    public void onlineNotice(String userID){

        //得到在线用户线程
        HashMap map= UserThreadsManage.map;
        Iterator iterator=map.keySet().iterator();
        System.out.println("here");
        //遍历,更新每个在线用户的好友列表,把这次登录用户改为在线
        while (iterator.hasNext()){
            Message msg=new Message();
            msg.setMsgType("onlineSet");
            msg.setContent(userID);
            String onlineUsers=iterator.next().toString(); //获取其他用户ID
            System.out.println("开始迭代111");
            msg.setUser(onlineUsers);
            Socket socket = UserThreadsManage.getUserThreads(onlineUsers).getSocket();
            try {
                ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
                out.writeObject(msg);
                System.out.println("完成输出流111");

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

进入这个函数之后执行不了循环语句。

img

尝试了解了一下迭代器原理,it.hasNext()方法不涉及指针的移动,只判断是判断是否还有下一元素。这样子看来我认为是有下一个元素的,但是没有。

看下这个map怎么存的

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/257760
  • 除此之外, 这篇博客: Iterator迭代器执行原理,hasNext和next指针问题中的 原理 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述
    首先,当集合获取到迭代器也就是执行coll.iterator()之后,获得的iterator对象是指向集合之外的空白的地方,iterator.hasNext()判断当前位置下一个是否含有元素,返回类型是Boolean类型,iterator.next()将iterator迭代器对象指针向下移动一次,并返回移动后指向的指针,需要注意的是,迭代都是在原有的集合上进行,并不会改变或者复制