展开

关键词

高效编程之HashMap的entryset和keyset比较

value组成;我们会把数据放到value,如果想拿的话可以通过key去取,也可以直接从entry对象里去拿;所以如果我们拿到了一个有东西的hashmap的时候,我们可以有两种方式拿到里面的value;一种是keyset hashmap.keySet().iterator(); while (iterator.hasNext()) { hashmap.get(iterator.next()); } System.out.print(keyset System.out.print(entryset:); System.out.println(Calendar.getInstance().getTimeInMillis() - bs); } } 输入结果: keyset :168entryset:76 多测试几次的输入结果: keyset:171entryset:70=======keyset:169entryset:81=======keyset:175entryset :74 结果很明显,entryset速度比keyset快了两倍多点; hashmap.entryset,在set集合中存放的是entry对象。

24330

高效编程之HashMap的entryset和keyset比较

value组成;我们会把数据放到value,如果想拿的话可以通过key去取,也可以直接从entry对象里去拿;所以如果我们拿到了一个有东西的hashmap的时候,我们可以有两种方式拿到里面的value;一种是keyset

799100
  • 广告
    关闭

    云产品限时秒杀

    云服务器1核2G首年38元,还有多款热门云产品满足您的上云需求

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Java入门提高篇】Day24 Java容器类详解(七)HashMap源码分析(下)

    KeySet  我们先来看看KeySet,HashMap中的成员变量keySet保存了所有的Key集合,事实上,这是继承自它的父类AbstractMap的成员变量:transient Set keySet ;  而keySet方法,也是覆盖了父类的方法:AbstractMap 中的keySet方法 public Set keySet() { Set ks = keySet; if (ks == null) * public Set keySet() { Set ks = keySet; if (ks == null) { ks = new KeySet(); keySet = ks; } return ks ; }  可以看到,AbstractMap中keySet是一个AbstractSet类型,而覆盖后的keySet方法中,keySet被赋值为KeySet类型。 翻翻构造器可以发现,在构造器中并没有初始化keySet,而是在KeySet方法中对keySet进行的初始化(HashMap中都是使用类似的懒加载机制),KeySet是HashMap中的一个内部类,让我们再来看看这个

    28430

    【Java入门提高篇】Day24 Java容器类详解(七)HashMap源码分析(下)

    KeySet  我们先来看看KeySet,HashMap中的成员变量keySet保存了所有的Key集合,事实上,这是继承自它的父类AbstractMap的成员变量:transient Set keySet ;  而keySet方法,也是覆盖了父类的方法:AbstractMap 中的keySet方法 public Set keySet() { Set ks = keySet; if (ks == null) * public Set keySet() { Set ks = keySet; if (ks == null) { ks = new KeySet(); keySet = ks; } return ks ; }  可以看到,AbstractMap中keySet是一个AbstractSet类型,而覆盖后的keySet方法中,keySet被赋值为KeySet类型。 翻翻构造器可以发现,在构造器中并没有初始化keySet,而是在KeySet方法中对keySet进行的初始化(HashMap中都是使用类似的懒加载机制),KeySet是HashMap中的一个内部类,让我们再来看看这个

    25930

    Java HashMap 遍历方式性能探讨

    关于HashMap的实现这里就不展开了,具体可以参考 JDK7与JDK8中HashMap的实现JDK8之前,可以使用keySet或者entrySet来遍历HashMap,JDK8中引入了map.foreach 原因:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。 1. keySet和entrySet1.1 基本用法keySet:?entrySet:?源码上看:keySet:?entrySet:? 其实这里已经很明显了,当要得到某个value时,keySet还需要从HashMap中get,entrySet相比keySet少了遍历table的过程,这也是两者性能上的主要差别。2.

    912120

    Java 遍历Map的两种方式

    map.put(1,刘一);map.put(10,郑十);map.put(4,李四);map.put(8,周八);map.put(6,赵六);map.put(2,陈二);map.put(7,孙七);一、KeySet 方式Set keySet = map.keySet();for (Integer key : keySet){ String value = map.get(key); System.out.println Integer key = entry.getKey(); String value = entry.getValue(); System.out.println(key + : + value);}这里需要知道KeySet 方式要比EntrySet方式慢,之间的速度差距取决于数据量,因为KeySet便利Key时就需要访问一遍Map,而通过Key取Value时又需要访问。

    18020

    HashMap与LinkedHashMap的遍历key的顺序

    map.put(2, b); map.put(3, c); map.put(0, f); map.put(10, g); map.put(999, e); System.out.println(第一种keySet put(2, b); map1.put(3, c); map1.put(0, f); map1.put(10, g); map1.put(999, e); System.out.println(第一种keySet (第二种iterator遍历方式); Iterator it1 = map1.keySet().iterator(); while (it1.hasNext()) { String key = it1. next(); System.out.println(key: + key + , + value: + map1.get(key)); } }结果:第一种keySet遍历方式key:4,value: bkey:3, value:ckey:0, value:fkey:10, value:gkey:999, value:e————————————————华丽分割线————————————————第一种keySet

    58420

    jdk源码分析之HashMap--遍历性能知多少?

    还是先写段代码试一下:这段代码的意思是生成一个HashMap然后使用keySet()和entrySet()两种方式遍历并打印耗时。 设定capacity=10000,运行结果如下 可以看到keyset比entryset耗时多了一倍。 把capacity=100000,运行结果如下 同样,keyset耗时差不多也是entryset的两倍。 理论上我们可以得出entryset遍历方式比keyset性能要好,那为什么性能要好? 我们再看一下keySet的代码 同样,第一次调用entrySet的时候是生成了一个KeySet,我们测试代码中用得的增强for循环其实就是遍历的时候调用KeySet中的iterator方法,看一下newKeyIterator 或许这时候,我们就可以下结论说,entryset遍历HashMap比keyset方式块,是这样吗?

    13040

    遍历HashMap

    HashMap遍历主要有四类方法:迭代器方式遍历For Each方式遍历Lambda表达式遍历Streams API遍历其中迭代器、For Each、Streams API又有不同的实现(EntrySet和KeySet 1,java); map.put(2,python); map.put(3,C); map.put(4,PHP); 1、迭代器EntrySet iteratorEntrySet(map); 2、迭代器KeySet iteratorKeySet(map); 3、forEach EntrySet forEachEntrySet(map); 4、forEach KeySet forEachKeySet(map); 5 Map.Entry entry = iterator.next(); System.out.println(entry.getKey() + ===== + entry.getValue()); } }}2、迭代器KeySet entry : map.entrySet()) { System.out.println(entry.getKey() + ===== + entry.getValue()); }}4、ForEach KeySet

    21720

    一口气写了 HashMap 的 7种遍历方式,被同事夸了

    但每种类型下又有不同的实现方式,因此具体的遍历方式又可以分为以下 7 种:使用迭代器(Iterator)EntrySet 的方式进行遍历;使用迭代器(Iterator)KeySet 的方式进行遍历;使用 For Each EntrySet 的方式进行遍历;使用 For Each KeySet 的方式进行遍历;使用 Lambda 表达式的方式进行遍历;使用 Streams API 单线程的方式进行遍历; 从以上结果可以看出,两个 entrySet 的性能相近,并且执行速度最快,接下来是 stream ,然后是两个 keySet,性能最差的是 KeySet 。 性能分析 EntrySet 之所以比 KeySet 的性能高是因为,KeySet 在循环时使用了 map.get(key),而 map.get(key) 相当于又遍历了一遍 Map 集合去查询 key 所以,EntrySet 的性能比 KeySet 的性能高出了一倍,因为 KeySet 相当于循环了两遍 Map 集合,而 EntrySet 只循环了一遍。

    12000

    集合系列 Map(十五):TreeMap

    private final Comparator m; KeySet(NavigableMap map) { m = map; } public Iterator iterator() { if (m ConcurrentModificationException(); 寻找节点 e 的后继节点 next = successor(e); lastReturned = e; return e; } 其他方法省略}上面的代码比较多,keySet 从上面源码可以看出 keySet 方法返回的是 KeySet 类的对象。这个类实现了Iterable接口,可以返回一个迭代器。 上面的代码虽多,但核心代码还是 KeySet 类和 PrivateEntryIterator 类的 nextEntry方法。KeySet 类就是一个集合,这里不分析了。

    39130

    Java学习笔记之集合3

    map = new HashMap(); 添加元素 map.put(001, Alice); map.put(002, Bob); map.put(003, Charlie); 获取所有键的集合,用keySet ()方法实现 Set keyset = map.keySet(); 遍历键的集合,获取到每一个键,用增强for实现 for (String key : keyset) { String value = = hm.keySet(); for (String key : keySet) { Student student = hm.get(key); System.out.println(key + , = hm.keySet(); for (String key : keySet) { String value = hm.get(key); System.out.println(key + , + = hm.keySet(); for (Character key : keySet) { Integer value = hm.get(key); sb.append(key).append(().

    6220

    HashMap有几种遍历方法?推荐使用哪种?

    1.JDK 8 之前的遍历JDK 8 之前主要使用 EntrySet 和 KeySet 进行遍历,具体实现代码如下。 性能问题通过以上代码,我们可以看出使用 KeySet 遍历,其性能是不如 EntrySet 的,因为 KeySet 其实循环了两遍集合,第一遍循环是循环 Key,而获取 Value 有需要使用 map.get (key),相当于有循环了一遍集合,所以 KeySet 循环不能建议使用,因为循环了两次,效率比较低。 1.3 EntrySet 迭代器遍历EntrySet 和 KeySet 除了以上直接循环外,我们还可以使用它们的迭代器进行循环,如 EntrySet 的迭代器实现代码如下:public static void 总结本文介绍了 7 种 HashMap 的遍历方式,其中 JDK 8 之前主要使用 EntrySet 和 KeySet 的遍历方式,而 KeySet 的遍历方式性能比较低,一般不推荐使用。

    7610

    JDK源码分析-Hashtable

    } count--; V oldValue = e.value; e.value = null; return oldValue; } } return null;}三种集合视图 EntrySet、keySet 和 values 分别如下:private transient volatile Set keySet;private transient volatile Set entrySet;private transient volatile Collection values; public Set keySet() { if (keySet == null) keySet = Collections.synchronizedSet (new KeySet(), this); return keySet;} public Set entrySet() { if (entrySet==null) entrySet = Collections.synchronizedSet

    15910

    聊聊rocketmq的enableMsgTrace

    0) { return; } Temporary buffer StringBuilder buffer = new StringBuilder(1024); int count = 0; Set keySet = new HashSet();​ for (TraceTransferBean bean : transBeanList) { Keyset of message trace includes msgId the keyset in this batch(including msgId in original message not offsetMsgId) * @param data the message trace data in this batch * private void sendTraceDataByMQ(Set keySet, final String data, String dataTopic of message trace includes msgId of or original message message.setKeys(keySet); try { Set traceBrokerSet

    68100

    聊聊rocketmq的enableMsgTrace

    0) { return; } Temporary buffer StringBuilder buffer = new StringBuilder(1024); int count = 0; Set keySet = new HashSet(); for (TraceTransferBean bean : transBeanList) { Keyset of message trace includes msgId the keyset in this batch(including msgId in original message not offsetMsgId) * @param data the message trace data in this batch * private void sendTraceDataByMQ(Set keySet, final String data, String dataTopic of message trace includes msgId of or original message message.setKeys(keySet); try { Set traceBrokerSet

    41200

    collection之map

    ); Map newmap = map.createmap(); int size = newmap.size(); System.out.println(newmap+长度为+size); Set keyset = newmap.keySet(); System.out.println(newmap+keyset为+keyset); for(Object o:keyset){ System.out.println ()); } System.out.println(newmap+entrySet:+es); Set ks = newmap.keySet(); System.out.println(newmap+keySet

    15800

    Java 集合深入理解(15):AbstractMap

    实现类最好提供两种构造方法:一种是不含参数的,返回一个空 map一种是以一个 map 为参数,返回一个和参数内容一样的 mapAbstractMap 的成员变量transient volatile Set keySet ;transient volatile Collection values;有两个成员变量:keySet, 保存 map 中所有键的 Setvalues, 保存 map 中所有值的集合他们都是 transient ().iterator(); while (i.hasNext()) h += i.next().hashCode(); return h;}6.获取三个主要的视图获取所有的键:public Set keySet () { 如果成员变量 keySet 为 null,创建个空的 AbstractSet if (keySet == null) { keySet = new AbstractSet() { public AbstractMap.this.clear(); } public boolean contains(Object k) { return AbstractMap.this.containsKey(k); } }; } return keySet

    39790

    HashMap 的 7 种遍历方式与性能分析!(强烈推荐)

    但每种类型下又有不同的实现方式,因此具体的遍历方式又可以分为以下 7 种:使用迭代器(Iterator)EntrySet 的方式进行遍历;使用迭代器(Iterator)KeySet 的方式进行遍历;使用 For Each EntrySet 的方式进行遍历;使用 For Each KeySet 的方式进行遍历;使用 Lambda 表达式的方式进行遍历;使用 Streams API 单线程的方式进行遍历; System.out.println(entry.getKey()); System.out.println(entry.getValue()); } } @Benchmark public void keySet  代码也是一样的,如下所示:public static void keySet() { Iterator var0 = map.keySet().iterator(); while(var0.hasNext 所以通过字节码来看,使用 EntrySet 和 KeySet 代码差别不是很大,并不像网上说的那样 KeySet 的性能远不如 EntrySet,因此从性能的角度来说 EntrySet 和 KeySet

    3.9K40

    iOS Array和Dictionary常用方法

    print(n遍历获取下标key:);for (index, element) in dic.enumerate() { print(Item (index): (element))} key的数组let keySet = Array(dic.keys);print(nkey的数组keySet:n(keySet)); key数组升序排列let keyNew = keySet.sort { (a, b) -> Bool 遍历获取下标key:Item 0: (22, 222)Item 1: (11, 111)Item 2: (aa, aaa)Item 3: (bb, bbb)Item 4: (33, 333) key的数组keySet

    17210

    扫码关注云+社区

    领取腾讯云代金券