通过values(),keySet(),entrySet(),Iterate,等方法迭代hashMap
工作中建议使用entrySet这种迭代方法,效率较高,keySet效率较低。
package com.example.demo.test; import java.util.HashMap; import java.util.Map; import org.apache.ecs.xhtml.map; /** * 创建10个map,每个map里放入1万条记录 * 传递不同的构造方法的参数,比较速度 * 实验参数,构造方法参数(16,0.75)和(16384,0.75) * * @date: 2020/11/10 * @author: Li Bin */ public class TestMap { public static void main(String[] args) { Long sum = 0L; for (int i = 0; i < 10; i++) { //改变这里的initialCapacity参数 sum += new TestMap().initMap1(10000, 0.75f); } System.out.println(sum / 10); } private Long initMap1(int initialCapacity, float loadFactor) { String key, value; Map<String, String> map1 = new HashMap<String, String>(initialCapacity, loadFactor); //纳秒 Long start = System.nanoTime(); for (int i = 0; i < 10000; i++) { key = String.valueOf(i); value = "value"; map1.put(key, value); } Long end=System.nanoTime(); Long time=end-start; System.out.println("time="+time); return time; }
//扩容的频率越低越好,初使容量根据业务而定,不要一个空构造方法一路走到底。
private void test(){
Map<String,String> map=new HashMap<String,String>();
map.put("x","123");
map.put("y","456");
map.replace("x","999");
//key 和value都匹配都话才会替换成8888
map.replace("x","123","8888");
//如果key不存在在的话才put进去
map.putIfAbsent("x1","333");
System.out.println(map);
}
}
package com.example.demo.test; import java.util.HashMap; import java.util.Map; /** * 比较map和linkedHashMap * * @date: 2020/11/11 * @author: Li Bin */ public class LinkedHashMap<S, S1> { public static void main(String[] args) { int count=1000000; Map<String,String> map=new HashMap<String,String>(); Map<String,String> linkedMap=new java.util.LinkedHashMap<String,String>(); Long start,end; start=System.currentTimeMillis(); //往map里放入100万条数据 for (int i = 0; i <count ; i++) { map.put(String.valueOf(i),"value"); } end=System.currentTimeMillis(); System.out.println("map time"+(end-start)); //往linkedMap里放入100万条数据 start=System.currentTimeMillis(); for (int i = 0; i <count ; i++) { linkedMap.put(String.valueOf(i),"value"); } end=System.currentTimeMillis(); System.out.println("linkedMap time"+(end-start)); //结论,录入的时候map比较快 //linkedMap迭代测试 start=System.currentTimeMillis(); for (String s : linkedMap.values()) { } end=System.currentTimeMillis(); System.out.println("linkedmap for time:"+(end-start)); //map迭代测试 start=System.currentTimeMillis(); for (String s : map.values()) { } end=System.currentTimeMillis(); System.out.println("map for time:"+(end-start)); //结论,迭代的时候linkedMap比较快 } }
linkedHashMap是按照输入的顺序来排序的。
public static void main(String[] args) { Map<String,String> linkedHashMap= new LinkedHashMap<String,String>(); linkedHashMap.put("x1","1"); linkedHashMap.put("y1","1"); linkedHashMap.put("z1","1"); String y1 = linkedHashMap.get("y1"); System.out.println(linkedHashMap); }
如果是想以使用过的顺序来排序,则修改构造方法。
public static void main(String[] args) { Map<String,String> linkedHashMap= new LinkedHashMap<String,String>(16,0.75f,true); linkedHashMap.put("x1","1"); linkedHashMap.put("y1","1"); linkedHashMap.put("z1","1");
//get一下就代表使用过来 String y1 = linkedHashMap.get("y1"); System.out.println(linkedHashMap); }
输出:
{x1=1, z1=1, y1=1}
使用过的会排到最后。
package com.example.demo.test; import java.util.Comparator; import java.util.TreeMap; /** * treeMap 默认是按key升序进行排序,可以自定义比较器Comparator,改变o2.compareTo(o1);就可以实现升序或者降序。 * * @date: 2020/11/11 * @author: Li Bin */ public class TreeMapTest { public static void main(String[] args) { TreeMap<String,String> treeMap=new TreeMap<String,String>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); treeMap.put("x1","222"); treeMap.put("av","333"); treeMap.put("gv","333"); treeMap.put("cv","333"); System.out.println(treeMap); } }