HashSet集合实际上就是维护了一个value相同的hashmap,因为它不能重复,你不能保证你不会存入相同的数据,那么当放入两个相同的数据时,顺序就乱了,所以无法通过下标索引。hashset实际上是利用key来存数据,这个key就是存在set中的数据。因此HashSet取值通常采用
- forEach
for (String string : mySet) {
System.out.println(string);
}
- 迭代
Java Iterator(迭代器)
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。迭代器通常被称为轻量级对象,因为创建它的代价小,Java的Iterator只能用来单向移动。
四个方法:
- 使用iterator()来返回一个Iterator。
- 使用hasNext()检查序列中是否还有元素。
- 使用next()获得序列中的下一个元素。
- 使用remove()将迭代器新近返回的元素删除。
其实,迭代器除了遍历容器之外,最大的功能就是统一了对容器的访问方式。
完全可以将Itarator作为参数,例如(Java编程思想中的源码):
public class CrossContainerIterator{
public static void display (Iterator<Pet> it){
while(it.hasNext()){
Pet p = it.next();
System.out.println(p.id+":"+p);
}
}
public static void main(String [] args){
ArrayList<Pet> pets = Pets.arrayList(8);
LinkedList<Pet> petsLL = new LinkedList<Pet>(pets);
HashSet<Pet> petsHS = new HashSet<Pet>(pets);
TreeSet<Pet> petTS = new TreeSet<Pet>(pets);
display(pets.iterator);
display(petsLL.iterator);
display(petsHS.iterator);
display(petsTS.iterator);
}
}
iterator()、hasNext()、next()方法
// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;
public class RunoobTest {
public static void main(String[] args) {
// 创建集合
ArrayList<String> sites = new ArrayList<String>();
sites.add("Google");
sites.add("Runoob");
sites.add("Taobao");
sites.add("Zhihu");
// 获取迭代器
Iterator<String> it = sites.iterator();
// 输出集合中的所有元素
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
remove()方法
该方法移除的是iterator.next()方法最后访问的
元素。
public class IteratorRemoveDemo {
public static void main(String[] args) {
List list = new ArrayList(5);
for (int i = 0; i < 5; i++) {
list.add(i);
}
System.out.println(list);
// 移除最后访问的元素
iterator.next();
iterator.next();
iterator.remove();
System.out.println(list);
}
}
/*输出:
[0, 1, 2, 3, 4]
[0, 2, 3, 4]
*/
删除集合中的所有元素
while(iterator.hasNext()) {//通过遍历来删除list中所有元素
iterator.next();
iterator.remove();
}
通过遍历集合元素,来依次删除该集合中的元素,也可以添加控制条件,来删除集合中想要删除的元素。
相关异常
java.lang.IllegalStateException异常
异常出现的原因:
- 直接使用remove方法,而未调用next()方法。
- 当调用next()方法之后,使用了remove()方法,但是接着又使用remove()方法。
java.util.NoSuchElementException异常
异常出现的原因:
- 迭代没有更多的元素,比如在集合遍历时,iterator.next()方法会导致出现该错误。
Java ConcurrentModificationException异常
对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。
请参考:
-
Java ConcurrentModificationException异常原因和解决方法
https://www.cnblogs.com/dolphin0520/p/3933551.html -
Java ConcurrentModificationException 异常分析与解决方案
http://www.2cto.com/kf/201403/286536.html