treemap

HashTable、ConcurrentHashMap、TreeMap、HashMap关于键值的区别

落爺英雄遲暮 提交于 2020-04-18 02:18:36
集合类 key value super 说明 HashTable 不能为null 不能为null Dictionary 线程安全 ConcurrentHashMap 不能为null 不能为null AbstractMap 线程局部安全 TreeMap 不能为null 可以为null AbstractMap 线程不安全 HashMap 可以为null 可以为null AbstractMap 线程不安全 原文出处:https://www.cnblogs.com/zzh20180601/p/10191651.html 来源: oschina 链接: https://my.oschina.net/u/4410077/blog/3272011

Java集合中List,Set以及Map等集合体系简述

南笙酒味 提交于 2020-04-17 03:50:11
【推荐阅读】微服务还能火多久?>>> 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有HashSet,LinkedHashSet,TreeSet List下有ArrayList,Vector,LinkedList Map下有Hashtable,LinkedHashMap,HashMap,TreeMap collection接口下还有个Queue接口,有PriorityQueue类 注意: Queue接口与List、Set同一级别,都是继承了collection接口。 看图你会发现,LinkedList既可以实现Queue接口,也可以实现List接口.只不过呢, LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。 SortedSet是个接口,它里面的(只有TreeSet这一个实现可用)中的元素一定是有序的。 总结: connection接口(注意首字母小写): — List 有序,可重复 ArrayList 优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程不安全,效率高 Vector

集合和map

99封情书 提交于 2020-04-15 17:06:59
【推荐阅读】微服务还能火多久?>>> HashSet的性能比TreeSet的性能好(特别是添加,查询元素时),因为TreeSet需要额外的红黑树算法维护元素的次序,如果需要一个保持排序的Set时才用TreeSet,否则应该使用HashSet。 LinkedHashSet是HashSet的子类,由于需要链表维护元素的顺序,所以插入和删除操作比HashSet要慢,但遍历比HashSet快。 EnumSet是所有Set实现类中性能最好的,但它只能 保存同一个枚举类的枚举值作为集合元素。 以上几个Set实现类都是线程不安全的 1)ArrayList ArrayList是一个动态数组,也是我们最常用的集合,是List类的典型实现。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。 ArrayList擅长于随机访问。同时ArrayList是非同步的。 2)LinkedList LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口

Java中的读写锁 ReentrantReadWriteLock

匆匆过客 提交于 2020-04-14 16:15:13
【推荐阅读】微服务还能火多久?>>> 使用场景较少 /** * 使用场景较少 */ @Slf4j public class LockExample3 { private final Map<String, Data> map = new TreeMap<>(); private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock readLock = lock.readLock(); private final Lock writeLock = lock.writeLock(); public Data get(String key){ readLock.lock(); try{ return map.get(key); }finally { readLock.unlock(); } } public Set<String> getAllKeys(){ readLock.lock(); try{ return map.keySet(); }finally { readLock.unlock(); } } public Data put(String key, Data value){ //没有读写操作,才能获得写锁。 不适合写少,读多的情况,将导致饥饿情况

java如何对map进行排序详解(map集合的使用)

拥有回忆 提交于 2020-04-14 13:15:17
【推荐阅读】微服务还能火多久?>>> 一、简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map。map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍): HashMap :我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。 TreeMap : 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。 Hashtable : 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。 LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。 二、Map排序

面试补充之集合类

允我心安 提交于 2020-04-11 11:24:22
WeakHashMap与HashMap   WeakHashMap中的key采用的是“弱引用”的方式,只要WeakHashMap中的key不再被外部引用,所对应的键值对就可以被垃圾回收器回收。   HashMap中的key采用的是“强引用”的方式,当key不再被外部引用时,只有当这个key从HashMap中删除后,才可以被垃圾回收器回收。 HashMap和TreeMap区别 1、实现方式的区别   HashMap:基于哈希表实现。TreeMap:基于红黑树实现。 2、TreeMap能够把它保存的记录根据键排序。 3、HashMap:适用于Map中插入、删除和查找元素。   TreeMap:适用于按自然顺序或自定义顺序遍历键(key)。 HashMap通常比TreeMap快一点。 HashSet的实现原理   对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成。HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT = new Object(); // 底层使用HashMap来保存HashSet中所有元素

java Map

ε祈祈猫儿з 提交于 2020-04-09 01:14:41
Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。 添加 V put(K key, V value); 存在覆盖(相同键),返回上一次value(被覆盖的值) void putAll(Map<? extends K,? extends V> m) 删除 void clear(); V remove(Object key) 判断 boolean containsKey(Object key); boolean containsValue(Object value); boolean isEmpty(); 获取 V get(Object key); int size(); Collection<V> values(); Set<Map.Entry<K,V>> entrySet(); Set<K> keySet(); Hashtable、HashMap、TreeMap Hashtable: 底层是哈希表数据结构,不可以存入null键null值。线程同步。 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。用作键的对象必须实现hashCode()和equals()。 HashMap: 底层是哈希表数据结构,允许使用null键和null值。线程不同步。 TreeMap: 底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

List,Set,Map的区别

馋奶兔 提交于 2020-04-07 04:59:17
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。 List的特征是其元素以线性方式存储,集合中可以存放重复对象。 ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。 LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。 Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。 HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。 LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。 TreeMap : 基于红黑树数据结构的实现。查看“键

一致性 Hash 算法的实际应用

五迷三道 提交于 2020-04-06 21:50:50
前言 记得一年前分享过一篇 《一致性 Hash 算法分析》 ,当时只是分析了这个算法的实现原理、解决了什么问题等。 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的一个路由需求来着手实现一次。 背景 看过 《为自己搭建一个分布式 IM(即时通讯) 系统》 的朋友应该对其中的登录逻辑有所印象。 先给新来的朋友简单介绍下 cim 是干啥的: 其中有一个场景是在客户端登录成功后需要从可用的服务端列表中选择一台服务节点返回给客户端使用。 而这个选择的过程就是一个负载策略的过程;第一版本做的比较简单,默认只支持轮询的方式。 虽然够用,但不够优雅😏。 因此我的规划是内置多种路由策略供使用者根据自己的场景选择,同时提供简单的 API 供用户自定义自己的路由策略。 先来看看一致性 Hash 算法的一些特点: 构造一个 0 ~ 2^32-1 大小的环。 服务节点经过 hash 之后将自身存放到环中的下标中。 客户端根据自身的某些数据 hash 之后也定位到这个环中。 通过顺时针找到离他最近的一个节点,也就是这次路由的服务节点。 考虑到服务节点的个数以及 hash 算法的问题导致环中的数据分布不均匀时引入了虚拟节点。 自定义有序 Map 根据这些客观条件我们很容易想到通过自定义一个 有序 数组来模拟这个环。 这样我们的流程如下: 初始化一个长度为 N 的数组。

Java基础知识回顾之四 ----- 集合List、Map和Set

女生的网名这么多〃 提交于 2020-04-06 17:58:34
前言 在 上一篇 中回顾了Java的三大特性:封装、继承和多态。本篇则来介绍下集合。 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类。 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。 集合类型主要有3种:List、Set、和Map。 它们之间的关系可用下图来表示: 注:Map不是collections的子类,但是它们完全整合在集合中了! List List 接口是继承于 Collection接口并定义 一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。 一般来说,我们在单线程中主要使用的List是ArrayList和LinkedList来实现,多线程则是使用Vector或者使用Collections.sychronizedList来装饰一个集合。 这三个的解释如下: ArrayList:内部是通过数组实现的,它允许对元素进行快随机访问。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 LinkedList: 则是链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法