zoukankan      html  css  js  c++  java
  • java 遍历方法 及 数组,ArrayList,HashMap,HashSet的遍历

    一,遍历方法的实现原理

      1、传统的for循环遍历,基于计数器的:
        遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止。主要就是需要按元素的位置来读取元素。
      2、迭代器遍历,Iterator:
        每一个具体实现的数据集合,一般都需要提供相应的Iterator。相比于传统for循环,Iterator取缔了显式的遍历计数器。所以基于顺序存储集合的Iterator可以直接按位置访问数据。
        而基于链式存储集合的Iterator,正常的实现,都是需要保存当前遍历的位置。然后根据当前位置来向前或者向后移动指针。
      3、foreach循环遍历:
        根据反编译的字节码可以发现,foreach内部也是采用了Iterator的方式实现,只不过Java编译器帮我们生成了这些代码。

    二,数组的遍历

      1.for循环遍历

    /**
     * for循环遍历
     */
    public static void forArr() {
        int[] arr = new int[] { 1, 2, 3 };
        for (int i = 0; i < arr.length; i++) {
            int j = arr[i];
            System.out.println(j);
        }
    }

      2.foreach语句遍历

    /**
     * foreach语句遍历
     */
    public static void foreachArr(){
        int[] arr = new int[] { 1, 2, 3 };
        for (int i : arr) {
            System.out.println(i);
        }
    }

    三,ArrayList的遍历

      1.for

    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    // for
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
    }

      2.foreach

    // foreach
    for
    (Integer integer : list) { System.out.println(integer); }

      3.iterator

    // iterator 
    Iterator<Integer> iterator = list.iterator();
    while (iterator.hasNext()) {
        int item =  iterator.next();
        System.out.println(item);
    }

    四,HashMap的遍历

      1.通过获取所有的key按照key来遍历.

        keySet()方法:将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key 

    Map<Integer, String> map = new HashMap<Integer, String>();
    map.put(1, "first");
    map.put(2, "second");
    map.put(3, "three");
    
    /**
     * 通过获取所有的key按照key来遍历
     */
    public static void byKey() {
        Set<Integer> keySet = map.keySet(); // map集合的所有key键的Set集合
        for (Integer key : keySet) {
            String value = map.get(key); // 得到每个key对应的value值
            System.out.println("key: " + key + " -->value: " + value);
        }
    }

      2.通过Map.entrySet遍历key和value,推荐,尤其是容量大时

        entrySet()方法:Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。 Map.Entry表示映射关系。entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口 。

    /**
     * 通过Map.entrySet遍历key和value,推荐,尤其是容量大时
     */
    public static void byEntrySet() {
        Set<Entry<Integer, String>> entrySet = map.entrySet(); // 通过entrySet()方法将map集合中的映射关系取出(这个关系就是Map.Entry类型)
        for (Entry<Integer, String> entry : entrySet) {
            System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
        }
    }

      3.通过Map.values()遍历所有的value,但不能遍历key

        values()方法:是获取集合中的所有的值----没有键,没有对应关系

    /**
     * 通过Map.values()遍历所有的value,但不能遍历key
     */
    public static void byValues() {
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println("value= " + value);
        }
    
    }

      说明:keySet()的速度比entrySet()慢了很多,也就是keySet方式遍历Map的性能不如entrySet性能好,为了提高性能多考虑用entrySet()方式来进行遍历。

    五,HashSet的遍历

      1.foreach

    Set<String> set = new HashSet<String>();
    set.add("first");
    set.add("second");
    set.add("three");
    
    // foreach
    for (String string : set) {
        System.out.println(string);
    }

      2.iterator

    // iterator
    Iterator<String> setIterator = set.iterator();
    while (setIterator.hasNext()) {
        String string = (String) setIterator.next();
        System.out.println(string);
    }
  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/ooo0/p/7567009.html
Copyright © 2011-2022 走看看