Java 如何在没有迭代器的情况下迭代集合/哈希集?

Java 如何在没有迭代器的情况下迭代集合/哈希集?,java,loops,set,hashset,Java,Loops,Set,Hashset,如果没有以下内容,我如何迭代集/哈希集 Iterator iter = set.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } 您可以使用: 将集合转换为数组 还可以帮助您迭代元素: Object[] array = set.toArray(); for(int i=0; i<array.length; i++) Object o = array[i]; Object[]ar

如果没有以下内容,我如何迭代
/
哈希集

Iterator iter = set.iterator();
while (iter.hasNext()) {
    System.out.println(iter.next());
}
您可以使用:


将集合转换为数组 还可以帮助您迭代元素:

Object[] array = set.toArray();

for(int i=0; i<array.length; i++)
   Object o = array[i];
Object[]array=set.toArray();
对于(int i=0;i枚举(?)

另一种方法(java.util.Collections.enumeration()):

Java 8:

set.forEach(element -> System.out.println(element));


演示,考虑下面的集合,它包含不同的人对象:

Set<Person> people = new HashSet<Person>();
people.add(new Person("Tharindu", 10));
people.add(new Person("Martin", 20));
people.add(new Person("Fowler", 30));
  • for语句有一个表单,设计用于通过集合和数组进行迭代。此表单有时被称为增强的for语句,可用于使循环更紧凑、更易于阅读
  • Java8-Java.lang.Iterable.forEach(使用者)

  • default void forEach(Consumer至少还有六种方法可以迭代集合。我知道以下几点:

    方法1

    // Obsolete Collection
    Enumeration e = new Vector(movies).elements();
    while (e.hasMoreElements()) {
      System.out.println(e.nextElement());
    }
    
    方法2

    for (String movie : movies) {
      System.out.println(movie);
    }
    
    方法3

    String[] movieArray = movies.toArray(new String[movies.size()]);
    for (int i = 0; i < movieArray.length; i++) {
      System.out.println(movieArray[i]);
    }
    
    方法5

    // Supported in Java 8 and above
    movies.stream().forEach(movie -> System.out.println(movie));
    
    方法6

    // Supported in Java 8 and above
    movies.stream().forEach(System.out::println);
    
    这是我在示例中使用的
    HashSet

    Set<String> movies = new HashSet<>();
    movies.add("Avatar");
    movies.add("The Lord of the Rings");
    movies.add("Titanic");
    
    Set movies=new HashSet();
    电影。添加(“阿凡达”);
    电影。添加(“指环王”);
    电影。添加(“泰坦尼克号”);
    
    以下是一些关于如何迭代集合及其性能的提示:

    public class IterateSet {
    
        public static void main(String[] args) {
    
            //example Set
            Set<String> set = new HashSet<>();
    
            set.add("Jack");
            set.add("John");
            set.add("Joe");
            set.add("Josh");
    
            long startTime = System.nanoTime();
            long endTime = System.nanoTime();
    
            //using iterator
            System.out.println("Using Iterator");
            startTime = System.nanoTime();
            Iterator<String> setIterator = set.iterator();
            while(setIterator.hasNext()){
                System.out.println(setIterator.next());
            }
            endTime = System.nanoTime();
            long durationIterator = (endTime - startTime);
    
    
            //using lambda
            System.out.println("Using Lambda");
            startTime = System.nanoTime();
            set.forEach((s) -> System.out.println(s));
            endTime = System.nanoTime();
            long durationLambda = (endTime - startTime);
    
    
            //using Stream API
            System.out.println("Using Stream API");
            startTime = System.nanoTime();
            set.stream().forEach((s) -> System.out.println(s));
            endTime = System.nanoTime();
            long durationStreamAPI = (endTime - startTime);
    
    
            //using Split Iterator (not recommended)
            System.out.println("Using Split Iterator");
            startTime = System.nanoTime();
            Spliterator<String> splitIterator = set.spliterator();
            splitIterator.forEachRemaining((s) -> System.out.println(s));
            endTime = System.nanoTime();
            long durationSplitIterator = (endTime - startTime);
    
    
            //time calculations
            System.out.println("Iterator Duration:" + durationIterator);
            System.out.println("Lamda Duration:" + durationLambda);
            System.out.println("Stream API:" + durationStreamAPI);
            System.out.println("Split Iterator:"+ durationSplitIterator);
        }
    }
    

    我们可以看到
    Lambda
    花费的时间最长,而
    迭代器
    花费的时间最快。

    您可以使用函数操作来获得更简洁的代码

    Set<String> set = new HashSet<String>();
    
    set.forEach((s) -> {
         System.out.println(s);
    });
    
    Set Set=newhashset();
    set.forEach((s)->{
    系统输出打印项次;
    });
    
    然而,对于这一点,已经有了非常好的答案。以下是我的答案:

    1. set.stream().forEach(System.out::println); // It simply uses stream to display set values
    2. set.forEach(System.out::println); // It uses Enhanced forEach to display set values
    
    此外,如果此集合是自定义类类型,例如:Customer

    Set<Customer> setCust = new HashSet<>();
        Customer c1 = new Customer(1, "Hena", 20);
        Customer c2 = new Customer(2, "Meena", 24);
        Customer c3 = new Customer(3, "Rahul", 30);
    
    setCust.add(c1);
    setCust.add(c2);
    setCust.add(c3);
        setCust.forEach((k) -> System.out.println(k.getId()+" "+k.getName()+" "+k.getAge()));
    

    我相信这在幕后使用了迭代器。@munyengm是的。没有迭代器,就无法对集合进行迭代,除了通过反射访问保存数据的底层结构,并复制集合迭代器提供的代码……这是可行的,但如果它会出问题,那么它就不是我的解决方案。I g因为我没有选择权,所以我必须使用迭代器。谢谢大家。@user1621988什么问题?我提供的代码没有问题。它只是提供了一种很好且干净的方法来迭代集合,而不必显式使用迭代器。@assylias这可能会导致混淆,因为title清楚地说明了在没有迭代器的情况下循环元素。您可以在此添加一点注意事项,它只在内部使用迭代器,因此该解决方案只提供语法解决方案,而不是实际的解决方案。您实际上是在试图避免使用迭代器,还是只是不想在源代码中看到它?您可以使代码更短、更清晰,但必须使用迭代器。是否有reason你想避免它吗?只是为了记录和解释为什么要避免迭代器:我目前在一个用Java编写的Android游戏中面临这个问题。现在我正在使用哈希集存储需要定期通知事件的侦听器。但是,重复迭代收集会导致大量垃圾收集器活动at可能会加重游戏循环的负担。这在Java游戏中是不允许的。我将重写这些部分。@我所说的Coshman只是从Java游戏开发的角度出发,您希望在定期更新游戏状态时不惜一切代价避免GC。迭代器只是暂时有用的对象,因为您无法将它们重置为开始,因此它们会被删除在每次迭代方法调用时重新创建(例如,请参见ArrayList.java源代码)。如果在游戏循环中用于迭代场景对象,并且考虑每秒至少30次更新,则至少会得到60次(场景通常每个循环迭代两次)每秒在内存中等待GC的迭代器对象。这对Android有很大影响。在这种情况下,也许应该选择更合适的数据结构?集合的设计不是为了高效地迭代。为什么不使用ArrayList并使用标准for循环对其进行迭代?不创建其他迭代器,读取访问速度非常快。仅用于记录,
    toArray
    调用集合的迭代器。对于方法4、方法5、方法6,Hi@benny neugebauer,您可以简单地删除冗余的
    stream()
    。更不用说方法4、方法5和方法6是相同的。调用需要API 24
    for (String movie : movies) {
      System.out.println(movie);
    }
    
    String[] movieArray = movies.toArray(new String[movies.size()]);
    for (int i = 0; i < movieArray.length; i++) {
      System.out.println(movieArray[i]);
    }
    
    // Supported in Java 8 and above
    movies.stream().forEach((movie) -> {
      System.out.println(movie);
    });
    
    // Supported in Java 8 and above
    movies.stream().forEach(movie -> System.out.println(movie));
    
    // Supported in Java 8 and above
    movies.stream().forEach(System.out::println);
    
    Set<String> movies = new HashSet<>();
    movies.add("Avatar");
    movies.add("The Lord of the Rings");
    movies.add("Titanic");
    
    public class IterateSet {
    
        public static void main(String[] args) {
    
            //example Set
            Set<String> set = new HashSet<>();
    
            set.add("Jack");
            set.add("John");
            set.add("Joe");
            set.add("Josh");
    
            long startTime = System.nanoTime();
            long endTime = System.nanoTime();
    
            //using iterator
            System.out.println("Using Iterator");
            startTime = System.nanoTime();
            Iterator<String> setIterator = set.iterator();
            while(setIterator.hasNext()){
                System.out.println(setIterator.next());
            }
            endTime = System.nanoTime();
            long durationIterator = (endTime - startTime);
    
    
            //using lambda
            System.out.println("Using Lambda");
            startTime = System.nanoTime();
            set.forEach((s) -> System.out.println(s));
            endTime = System.nanoTime();
            long durationLambda = (endTime - startTime);
    
    
            //using Stream API
            System.out.println("Using Stream API");
            startTime = System.nanoTime();
            set.stream().forEach((s) -> System.out.println(s));
            endTime = System.nanoTime();
            long durationStreamAPI = (endTime - startTime);
    
    
            //using Split Iterator (not recommended)
            System.out.println("Using Split Iterator");
            startTime = System.nanoTime();
            Spliterator<String> splitIterator = set.spliterator();
            splitIterator.forEachRemaining((s) -> System.out.println(s));
            endTime = System.nanoTime();
            long durationSplitIterator = (endTime - startTime);
    
    
            //time calculations
            System.out.println("Iterator Duration:" + durationIterator);
            System.out.println("Lamda Duration:" + durationLambda);
            System.out.println("Stream API:" + durationStreamAPI);
            System.out.println("Split Iterator:"+ durationSplitIterator);
        }
    }
    
    Iterator Duration: 495287
    Lambda Duration: 50207470
    Stream Api:       2427392
    Split Iterator:    567294
    
    Set<String> set = new HashSet<String>();
    
    set.forEach((s) -> {
         System.out.println(s);
    });
    
    1. set.stream().forEach(System.out::println); // It simply uses stream to display set values
    2. set.forEach(System.out::println); // It uses Enhanced forEach to display set values
    
    Set<Customer> setCust = new HashSet<>();
        Customer c1 = new Customer(1, "Hena", 20);
        Customer c2 = new Customer(2, "Meena", 24);
        Customer c3 = new Customer(3, "Rahul", 30);
    
    setCust.add(c1);
    setCust.add(c2);
    setCust.add(c3);
        setCust.forEach((k) -> System.out.println(k.getId()+" "+k.getName()+" "+k.getAge()));
    
    class Customer{
    private int id;
    private String name;
    private int age;
    
    public Customer(int id,String name,int age){
    this.id=id;
    this.name=name;
    this.age=age;
    } // Getter, Setter methods are present.}