Java 过期后如何从集合中删除

Java 过期后如何从集合中删除,java,Java,我有一套代币: private Set<Token> tokenSeen; 每个令牌由客户端设置不同的expirationtime 因此,当发生expirationtime时,我希望从tokenSeen集合中删除该令牌。您可能希望使用按过期时间排序的有序集合。然后定期检查第一个元素,当它过期时将其删除。之后,再次检查新的第一个滤芯,如果已过期,也将其拆下。重复此操作,直到(当前)第一个元素未过期(由于按过期时间排序,所有其他元素也不应过期) 要定期检查,您可能需要使用诸如Qu

我有一套代币:

   private Set<Token> tokenSeen;
每个令牌由客户端设置不同的expirationtime


因此,当发生expirationtime时,我希望从tokenSeen集合中删除该令牌。

您可能希望使用按过期时间排序的有序集合。然后定期检查第一个元素,当它过期时将其删除。之后,再次检查新的第一个滤芯,如果已过期,也将其拆下。重复此操作,直到(当前)第一个元素未过期(由于按过期时间排序,所有其他元素也不应过期)


要定期检查,您可能需要使用诸如Quartz或计时器之类的调度器,具体取决于您的总体架构。

使用迭代器迭代集合中的所有元素,并删除任何具有旧过期时间的元素。如果没有对您删除的令牌的引用,那么Java垃圾收集器将在执行时从内存中清除它们

  Date now = new Date();
  Set<Token> tokenSeen = new HashSet<Token>();
  Iterator<Token> iterator = tokenSeen.iterator();
  while (iterator.hasNext()) {
     Token token = iterator.next();
     if(token.expirationtime.before(now))
        iterator.remove();
  }
datenow=新日期();
Set tokenSeen=new HashSet();
迭代器迭代器=tokenSeen.Iterator();
while(iterator.hasNext()){
令牌=iterator.next();
if(令牌过期时间之前(现在))
iterator.remove();
}

您可以设置一个跟踪哪些元素已过期并将其删除。

感谢您提供的解决方案。我想使用一个调度程序。。因此,我将阅读一些文章并尝试实现它。@user1180969如果您的应用程序运行在JBoss、Glassfish等应用程序服务器上。您很可能已经可以访问调度程序(Quartz,这是JBoss的)。我正在考虑一个类似于前面提到的解决方案。但是,我真的希望使用一个调度程序。你可以从任何你想要的地方触发这段代码,这只是在Java代码中遍历集合并删除相应项的代码。
  Date now = new Date();
  Set<Token> tokenSeen = new HashSet<Token>();
  Iterator<Token> iterator = tokenSeen.iterator();
  while (iterator.hasNext()) {
     Token token = iterator.next();
     if(token.expirationtime.before(now))
        iterator.remove();
  }