阅读 21

Java 里各个容器的最全遍历方法汇总(java中常用的容器有哪些)

遍历可以说是对数据结构最常见的操作。之前说基本的操作是“增删改查”,但是遍历,就是要让我们找到,要对谁进行“增删改查”。一般,会结合一些 if 判断,来进行操作。

所以在准备这期文章时,我在删除那里停顿了很久。想不明白为什么边遍历边删除,要用 Iterator + remove,后来自己写了一个例子,放在文末。自觉非不用也没有关系,就是写出来很奇怪。欢迎批评指正。

套路:

  • for/while 循环,最普通的那种挨个取,要求容器有序;

  • for 增强版:增强 for 循环;

  • Iterator for、while版,新建 Iterator 对象,然后具体再写成 for 或者 while 的循环,用 hasNext 来做是否进行下一次的判断,再新建临时对象,打印。

遍历 List

先初始化一个 ArrayList:

List<String> ids = new ArrayList<>(); ids.add("007"); ids.add("008"); ids.add("009"); 复制代码

  • 遍历第一种,因为 list 有序,可以用索引来遍历:

// List 遍历1 System.out.println("ids 遍历 for1"); for (int i=0; i<ids.size(); i++) {     System.out.println(ids.get(i)); } 复制代码

  • 第二种,用增强 for 循环,写法不一样,和索引就没有关系了:

// List 遍历2 System.out.println("ids 遍历 for2"); for (String temp: ids) {     System.out.println(temp); } 复制代码

  • 第三种,定义迭代器,然后写在 for 或者 while 里面:

// List 遍历 for版 Iterator System.out.println("ids 遍历 Iterator1"); for (Iterator iterator = ids.listIterator(); iterator.hasNext();) {     String temp = (String) iterator.next();     System.out.println(temp); } // List 遍历 while版 Iterator System.out.println("ids 遍历 Iterator2"); Iterator<String> iterator = ids.iterator(); while (iterator.hasNext()) {     Object temp = iterator.next();     System.out.println(temp); } 复制代码

以上内容的运行结果如下:

image.png

遍历 Set

Set 就无序了,所以,没有索引来用。这里顺带复习一下 HashSet 和 TreeSet 的区别,分别对应两种遍历方法:

  • 第一种用增强 for 循环,用了 HashSet,更无序一点:

// 初始化一个 HashSet Set<Integer> ages = new HashSet<>(); ages.add(8); ages.add(88); ages.add(36); // Set 遍历 1 for (Integer i: ages) {     System.out.println(i); } 复制代码

运行结果:

image.png

  • 第二种,同样用 for,但是用 Iterator 来做:

Set<Integer> ages2 = new TreeSet<>(); ages2.add(8); ages2.add(88); ages2.add(36); // Set 遍历 Iterator for (Iterator iterator2 = ages2.iterator(); iterator2.hasNext();) {     Integer temp = (Integer) iterator2.next();     System.out.println(temp); } 复制代码

运行结果就变成了:8 36 88(分行显示)。就已经按大小排好的顺序了。

遍历 Map

遍历 Map 的本质是在遍历 Set。

先初始化一个 课程表,用 HashMap 来存:

// 初始化一个 map Map<String, String> courses = new HashMap<>(); courses.put("1001", "English"); courses.put("1003", "Novel Reading"); courses.put("1002", "History"); System.out.println("初始化的 Map:" + courses.toString()); 复制代码

  • 第一种方法,取 KeySet,然后用这个 Key,挨个再 get 对应的value:

// 遍历 Map 法1:根据 key ,取 value Set<String>  keySet = courses.keySet(); for (String  courseId: keySet) {     System.out.println(courseId + ": " + courses.get(courseId)); } 复制代码

这里也可以不在外面定义 keySet,直接在 for 里面改成:

for (String courseID: courses.keySet()) { } 复制代码

  • 第二种,去取这个 EntrySet,然后直接用每一个 Entry 来 getKeygetValue

// 遍历 Map 法2:就用 entrySet System.out.println("用 EntrySet 来遍历:"); Set<Map.Entry<String,String>> kvs = courses.entrySet(); for (Iterator iterator2 = kvs.iterator(); iterator2.hasNext();) {     Map.Entry e = (Map.Entry) iterator2.next();     System.out.println(e.getKey() + ": " + e.getValue()); } 复制代码

对 Map 遍历的代码,运行结果如下:

image.png

迭代时候删除要用 Iterator?

遍历时就删除:

System.out.println("遍历完就删除, 这个就显得有点诡异"); int n = ids.size(); for (int i=0; i<n; i++) {     System.out.println(ids.get(0));     System.out.println(ids.toString());     ids.remove(0); } 复制代码

就直接用上面初始化后的例子。只是一开始把 size 存起来。不然 size 会随着 list 删除一个元素而改变。 每次先打印一下要删的元素,再打一下当前的 list 状态。 运行结果: image.png

推荐版写法:

也就是用 Iterator 来实现,在遍历有条件的删除:

// 推荐的写法: System.out.println(ids.toString()); ids.add("wait remove 1"); ids.add("wait remove 2"); ids.add("wait remove 3"); System.out.println(ids.toString()); System.out.println("推荐写法:"); Iterator iterator1 = ids.iterator(); while(iterator1.hasNext()) {     String obj = (String) iterator1.next();     System.out.println(obj);     if (obj.contains("1")) {         iterator1.remove();     } } System.out.println("end"+ids.toString()); 复制代码

运行结果: image.png

写一下还是更能加深自己的学习理解。继续,开启下一个知识点!冲冲冲 ~


作者:小小匚
链接:https://juejin.cn/post/7029600858882998285

文章分类
代码人生
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 gxwowoo@163.com 举报,一经查实,本站将立刻删除。
相关推荐