treemap

总结:ConcurrentMap与ConcurrentSkipListMap

狂风中的少年 提交于 2020-08-17 12:03:14
一、 ConcurrentHashMap是HashMap的线程安全版本,ConcurrentSkipListMap是TreeMap的线程安全版本。 ConcurrentHashMap和ConcurrentSkipListMap应尽量多的使用。 HashMap的原理: 我们从头开始设想,要将对象存放在一起,如何设计这个容器。有两条路可走: 一种是采用分格技术,每一个对象存放于一个格子中没这样通过对格子的编号就能取到或者遍历对象; 另一种技术就是采用串联的方式,各个对象串联起来,这需要各个对象至少带有下一个对象的索引。 显然第一种就是数组的概念,第二张就是链表的概念,所有的容器的实现其实都是基于这两种方式的,不管是数组还是链表,或者二者具有。 HashMap就是采用的数组方式。 有了存取对象的容器后还需要以下两个条件才能完成Map所需的条件。 1.能够快速定位元素:Map的需求就是能够根据一个查询条件快速得到需要的结果,所以这个过程需要的就是尽可能的快 2.能够自动扩充容量:显然对于容器而然,不需要人工的去控制容器的容量是最好的,这样对于外部使用来说越少知道底部细节越好,不仅使用方便,也越安全。 3. TreeMap和HashMap的区别和共同点 1.实现:TreeMap:SortMap接口,基于红黑树 ,HashMap基于哈希散列表实现。 2.存储:TreeMap:默认按键的升序排序

d3js 绘图chart 以及 svg 相关总结

送分小仙女□ 提交于 2020-08-16 05:59:29
d3js 绘图chart 以及 svg 总结 https://my.oschina.net/zengfr SVG basic shapes rect,:x,y,width,height circle,: cx,cy,r ellipse,: cx,cy,rx,ry straight line,: x1,y1,x2,y2,stroke,stroke-width polyline,: stroke,stroke-width,points polygon, :fill,stroke,stroke-width,points SVG Path Mini-Language -moveto -lineto -horizontal lineto -vertical lineto -curveto -smooth curveto -quadratic bezier curveto -smooth quadratic bezier curveto -elliptical arc -closepath D3 path data generator functions d3.svg.line d3.svg.line.radial d3.svg.area d3.svg.area.radial d3.svg.arc d3.svg.symbol d3.svg.chord d3.svg.diagonal d3

牛批!Java集合框架面试题精华集(2020最新版),附PDF版

夙愿已清 提交于 2020-08-15 03:37:13
一个多月前,作者和一些小伙伴决定做一系列的 Java 知识点常见重要问题的小册,方便用来夯实基础!小册的标准就一个,那就是: 取精华,取重点 。每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标准。 昨天晚上终于把 Java 集合框架部分的的知识点肝完了,转换成 PDF 一共 25 页, 转发+关注,然后私信回复 “2020” 或者 “面试” 即可获得PDF版的免费领取方式。(提供夜间阅读版) 很多小伙伴可能会问这个和 《JavaGuide面试突击》 不是不冲突了么?我都看了 《JavaGuide面试突击》 ,为啥还有这个,还嫌我头发不够少么,草,作者你可真坏! 实际上,两者是不冲突的。 首先,两者的内容在很大程度上都是一样的。但是,《Java 知识点常见重要问题的小册》的话知识点会稍微更加全面一点,更加适合自己系统复习知识,而 《JavaGuide面试突击》 更加适合准备面试。 集合概述 Java 集合概览 从下图可以看出,在 Java 中除了以 Map 结尾的类之外, 其他类都实现了 Collection 接口。 并且,以 Map 结尾的类都实现了 Map 接口。 说说 List,Set,Map 三者的区别? List(对付顺序的好帮手):存储的元素是有序的、可重复的。 Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。 Map(用 Key 来搜索的专家

Hash表(上):HashMap 的实现原理精讲--- jdk1.7的hashmap 原理用法,和提到很多其他的hashmap..

走远了吗. 提交于 2020-08-14 06:23:11
Hash表(上):HashMap 的实现原理精讲 https://ke.qq.com/webcourse/index.html#cid=345381&term_id=100410551&taid=2786347148723493&vid=5285890793322487566 数组和链表,key value的键值对,效率高 。知道,get put的原理。 get和put差不多,计算hash码,求模找到下标。哈希碰撞,用链表。轮询链表。扩容。 *****。 因为String Interger 中已经实现了 hashcode()和equals()方法了, 可以,只需要自己实现hashcode()和equals方法 hashmap 里面这个for循环很不错    什么是加载因子 hashmap什么时候性能最差,所有的key得出的hash 求模得出的 下标都一样的时候,就变成一条单链表, TreeMap LinkedHashMap HashTable HashMap ThreadLocal/SparseArray SynchronizedHashMap WeakHashMap ConcurrentHashMap 来源: oschina 链接: https://my.oschina.net/u/4390412/blog/4308204

java 如何决定使用 HashMap 还是 TreeMap?

泄露秘密 提交于 2020-08-13 05:20:44
问:如何决定使用 HashMap 还是 TreeMap? 介绍 TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。 HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。 结论 如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。 拓展 1、HashMap 和 TreeMap 的实现 HashMap: 基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 HashMap(): 构建一个空的哈希映像 HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射 HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像 HashMap(int

Java集合:整体结构

不羁岁月 提交于 2020-08-13 02:34:31
一、Java中集合   Java中集合类是Java编程中使用最频繁、最方便的类。集合类作为容器类可以存储任何类型的数据,当然也可以结合泛型存储指定的类型(不过泛型仅仅在编译期有效,运行时是会被擦除的)。集合类中存储的仅仅是对象的引用,并不存储对象本身。集合类的容量可以在运行期间进行动态扩展,并且还提供很多很方便的方法,如求集合的并集、交集等。 二、集合类结构   Java中的集合包含多种数据结构,如链表、队列、哈希表等。从类的继承结构来说,可以分为两大类,一类是继承自Collection接口,这类集合包含List、Set和Queue等集合类。另一类是继承自Map接口,这主要包含了哈希表相关的集合类。下面我们看一下这两大类的继承结构图: 1、List、Set和Queue 图中的绿色的虚线代表实现,绿色实线代表接口之间的继承,蓝色实线代表类之间的继承。    (1)List:我们用的比较多List包括ArrayList和LinkedList,这两者的区别也很明显,从其名称上就可以看出。ArrayList的底层的通过数组实现,所以其随机访问的速度比较快,但是对于需要频繁的增删的情况,效率就比较低了。而对于LinkedList,底层通过链表来实现,所以增删操作比较容易完成,但是对于随机访问的效率比较低。 我们先看下两者的插入效率: 1 package com.paddx.test

Java中常见的容器有哪些?

好久不见. 提交于 2020-08-13 01:53:12
常用容器可分为Collection和Map,Collection是存储对象的集合,而Map是存储键值对的集合。 其中,Collection又分为List、Set、Queue,而Map的实现类为HashMap、LinkedHashMap、TreeMap、HashTable。 List接口(有序,可重复): ArrayList:底层是动态数组,支持随机访问。 LinkedList:底层是双向链表,只能顺序访问。 Set接口(不可重复): HashSet(无序):基于哈希表。支持快速查找,但不支持有序性操作,且不维持插入顺序信息。 TreeSet(有序):底层是红黑树。支持快速查找(O(logn))但效率比HashSet(O(1))低。支持有序性操作,例如在一定范围内查找元素。 LinkedHashSet(有序):底层是链表+哈希表。使用哈希表存储元素,再维护一个双向链表保存元素的插入信息。 Queue接口: LinkedList:可实现双向队列 PriorityQueue:基于堆结构的优先队列。 Map接口: HashMap:基于哈希表。 LinkedHashMap:使用双向链表维护插入顺序。 HashTable:线程安全的HashMap,已淘汰。推荐ConcurrentHashMap。 TreeMap:基于红黑树。 来源: oschina 链接: https://my.oschina

JAVA集合框架-线程安全( 二)[云图智联]

天涯浪子 提交于 2020-08-13 00:56:57
线程安全 - 就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。 线程不安全 - 就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。 对于线程不安全的问题,一般会使用synchronized关键字加锁同步控制。 线程安全 工作原理: jvm中有一个main memory对象,每一个线程也有自己的working memory,一个线程对于一个变量variable进行操作的时候, 都需要在自己的working memory里创建一个copy,操作完之后再写入main memory。 当多个线程操作同一个变量variable,就可能出现不可预知的结果。 而用synchronized的关键是建立一个监控monitor,这个monitor可以是要修改的变量,也可以是其他自己认为合适的对象(方法),然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完加载load到working memory 到 use && 指派assign 到 存储store 再到 main memory的过程。才会释放它得到的锁。这样就实现了所谓的线程安全。 1、线程安全的集合对象 Vector

Java Set集合

China☆狼群 提交于 2020-08-12 17:37:08
Set集合 最大的特点就是不允许保存重复的元素。其有两个常用的子类,HashSet,TreeSet。 HashSet HashSet是Set接口中使用最多的一个子类,最大的特点是保存的数据是无序的。 特点: 保存的数据是无序的 不保存重复的数据 TreeSet 特点 保存的数据不重复 按照数据的升序进行排序 关于重复元素的说明 HashSet并不是利用 Comparable 接口判读数据重复,他利用的是Object类中的方法实现的。 hashCode 编码, equals 比较。eclipse能自动生成 hashCode , equals 函数 对象编码: hashCode 对象比较: equals 在Java中,对于重复元素的判断处理,就是利用的 hashCode , equals 函数完成的,只有在排序(TreeSet)时,才会使用 Comparable 接口实现 存入自定义的类型 TreeSet本质上是使用的TreeMap实现的数据存储,而TreeMap就需要 Comparable 接口确定大小关系 自定义的类型要实现 Comparable 接口,只有实现这个接口才能知道大小关系 TreeSet 在实现比较的时候,一定要把所有的属性都要进行比较,否则,部分属性相同,也会认为是重复数据。因此,TreeSet是利用 Comparable 接口确认重复数据的

Leetcode219/220 存在重复元素2/3 hashmap优化以及treemap优化

不羁的心 提交于 2020-08-11 19:35:29
hashmap/hashset优化到O(n), 带一点滑动窗口思想。 class Solution { public: bool containsNearbyDuplicate(vector<int>& nums, int k) { unordered_set<int> hashset; int n = nums.size(); for(int i=0;i<n;i++){ if(hashset.count(nums[i])) return true; else hashset.insert(nums[i]); if(i>=k) hashset.erase(nums[i-k]); } return false; } }; 用红黑树加lower_bound优化到O(nlogk) class Solution { public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { set<long long> treeSet; for(int i=0;i<nums.size();i++){ auto it = treeSet.lower_bound((long long)nums[i]-t); if(it!=treeSet.end()&&*it<=(long long)nums[i]+t)