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.}