关联式容器的特征:所用元素都会根据元素的键值自动被排序. set STL 中的关联式容器低层数据结构为红黑树,其功能都是调用低层数据结构中提供的相应接口. set元的元素不会像map那样同时拥有键(key)和值(value). set元素的键就是值,值就是键,并不允许两个元素有相同的键. multiset允许相同键值存在. 因为set元素的键和值相等,所以不允许对set元素的值进行修改.(数据结构会根据key对元素进行排序,对value的更改会改变树中元素的排列顺序). set容器提供的迭代器为…
一,map和multimap的概念 1.map和multimap的基本知识 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的,不能指定插入位置. map的底层数据结构是红黑树变体的平衡二叉树.在插入和删除操作中比vector要快. map可以直接存取key所对应得value,支持[]操作符,如map[key] = value; multim…
一,set和multiset的基础知识 1.set和multiset的基础 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的.所以不能指定插入元素的位置. set的底层数据结构是红黑二叉树,红黑树属于平衡二叉树.在插入操作和删除操作比vector快. set不可以直接存取元素,即不能使用像序列式容器中(vector,deque)那样随机存取. multiset和set的区别在于set支持元素唯一,而multiset允许插入多个重复的…
一,list容器基本概念 1.list容器基本知识 list容器的底部数据结构为双向链表,可以高效的进行插入和删除元素. list因为底层数据结构是双向链表,因此不支持下标操作和.at()函数的操作.要获取元素,必须从头到尾遍历. 使用list容器必须引入头文件# include<list>. 二,list容器构造函数 1.无参构造函数 // 无参构造函数 list<string> l1; 2.有参构造函数 // 有参构造函数,10个字符'A'来初始化容器 list<, 'A…
一.关联式容器 标准的STL关联式容器分为set(集合)/map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和 multimap(多键映射表).这些容器的底层机制均以RB-tree(红黑树)完成.RB-tree也是一个独立容器,但并不开放给外界使用. 此外,SGI STL 还提供了一个不在标准规格之列的关联式容器:hash table (散列表),以及以此hash table 为底层机制而完成的hash_set(散列集合).hash_map(散列映射表).hash_mult…
今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是Map   Map是非线性数据结构的主要实现,用来存放一组键-值型数据,我们称之为散列表.在其他语言中,也被称为字典.  HashMap是一个非常重要的数据结构,在我们的项目中有大量的运用,或充当参数,或用于缓存.而在面试中,HashMap也几乎成为了一个“必考项”,所以今天我们就从源码的角度,对这种…
 什么是容器 容器,顾名思义,是用来容放东西的场所.C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的.众所周知,常用的数据结构不外乎:数组array,  链表list,  树tree,  栈stack,  队列queue,  散列表hash table,  集合set.映射表map 等等.容器便是容纳这些数据结构的.这些数据结构分为序列式与关联式两种,故容器也分为序列式容器和关联式容器.   (图来自<STL源码剖析>) vector容器 1.  vector是STL提供的一…
概述 我们在介绍AbstractQueuedSynchronizer的时候介绍过,AQS支持独占式同步状态获取/释放.共享式同步状态获取/释放两种模式,对应的典型应用分别是ReentrantLock和Semaphore,AQS还可以混合两种模式使用,读写锁ReentrantReadWriteLock就是如此. 设想以下情景:我们在系统中有一个多线程访问的缓存,多个线程都可以对缓存进行读或写操作,但是读操作远远多于写操作,要求写操作要线程安全,且写操作执行完成要求对当前的所有读操作马上可见. 分析…
概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使condition满足了线程A的要求时,A再继续执行. 自旋实现的等待通知 最简单的实现方法就是将condition设为一个volatile的变量,当A线程检测到条件不满足时就自旋,类似下面: public class Test { private static volatile int conditio…
以前就知道Set和Map是java中的两种集合,Set代表集合元素无序.不可重复的集合:Map是代表一种由多个key-value对组成的集合.然后两个集合分别有增删改查的方法.然后就迷迷糊糊地用着.突然在一个风雨交加的夜晚,感觉不能这样迷迷糊糊,得深入地去研究一下,于是去看了看源码(jdk1.8). 1.Map源码. /** * An object that maps keys to values. A map cannot contain duplicate keys; * each key…