Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

谬误19 恰恰相反——频繁查询数组比HashMap快

很多程序员认为,在进行数据的频繁查询时,二维数组比HashMap速度快,其实这种说法是错误的,接下来通过两个示例进行说明。

示例:

    public class FromArrayQuery {
      public static void main (String[] args) {
          String[][] arr = new String[1024*250][2] ;          // 创建字符串数组
          for (int i = 0; i < 1024*250; i++){
            arr[i][0] = String.valueOf(i);                    // 在数组中存储数据
            arr[i][1] = String.valueOf(i);                    // 在数组中存储数据
          }
          long startTime = System.currentTimeMillis();
          // 获得执行for循环之前的当前时间,单位为毫秒
          for (int i = 0; i < 1024*250; i++){
            if (arr[i][0]. equals (String.valueOf(1024*250 - 1))){// 查询满足条件的元素
                System.out. println ("从数组中查询到:"+arr[i][0]);   // 输出查询结果
            }
          }
          long endTime = System.currentTimeMillis();      // 获得执行for循环之后的当前时间
          long useTime = endTime - startTime;             // 计算出执行for循环所用的时间
          System.out. println ("查询用时为:"+useTime);
      }
    }

运行本示例,效果如图4.19所示。

图4.19 从数组中查询需要的时间

示例:

    import java. util. HashMap;
    public class FromHashMapQuery {
      public static void main (String[] args) {
          HashMap<String, String> map = new HashMap<String, String>();
          // 创建HashMap对象
          for (int i = 0; i < 1024*500; i++){
            map. put (String.valueOf(i), String.valueOf(i));     // 在HashMap中存储数据
          }
          long startTime = System.currentTimeMillis();
          // 获得执行for循环之前的当前时间,单位为毫秒
          String qResult = map. get (String.valueOf(1024*250-1));
          // 从HashMap中查询指定键的值
          System.out. println ("从HashMap中查询到:"+qResult) ;  // 输出查询结果
          long endTime = System.currentTimeMillis() ; // 获得执行for循环之后的当前时间
          long useTime = endTime - startTime;         // 计算出执行for循环所用的时间
          System.out. println ("查询用时为:"+useTime);
      }
    }

运行本示例,效果如图4.20所示。

图4.20 从HashMap中查询需要的时间

说明

从如图4.19和图4.20所示的输出结果可以看出,从存储元素个数相同的数组和HashMap中查询数据,HashMap要比数组快,因此要频繁地查询数据,应该使用HashMap,而不要使用数组。