范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

集合框架知识

  Java的集合类主要由两个接口派生而出:Collection和Map
  Set、List和Map可以看做集合的三大类:
  List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
  Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集
  合里元素不允许重复的原因)。
  Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
  ArrayList
  有序可重复,允许为空非安全的初始容量为10的动态数组
  ArrayList类中两个私有属性,elementData存储ArrayList内的元素,size表示它包含的元素的数量。
  有序:元素是按照该 collection 的迭代器返回它们的顺序排列的。
  动态扩容:int newCapacity = (oldCapacity * 3)/2 + 1;
  插入元素:按照指定位置,把从指定位置开始的所有元素利用System.arraycopy方法做一个整
  体的复制,向后移动一个位置(当然先要用ensureCapacity方法进行判断,加了一个元素之后数组会
  不会不够大),然后指定位置的元素设置为需要插入的元素,完成了一次插入的操作,该方法的根本目的就是将index位置空出来以供新数据插入,这里需要进行数组数据的右移,如果要复制的元素很多,那么就会比较耗费性能。
  删除元素:1、把指定元素后面位置的所有元素,利用System.arraycopy方法整体向前移动一个位置
  2、最后一个位置的元素指定为null,这样让gc可以去回收它,如果要复制的元素很多,那么就会比较耗费性能。
  访问元素:ArrayList底层以数组实现,是一种随机访问模式,再加上它实现了RandomAccess接口,因此查
  找也就是get的时候非常快。基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高
  ArrayList是线程非安全的,一个方法是用Collections.synchronizedList方法把你的ArrayList变成一个线程安全的List,另一个方法就是Vector,它是ArrayList的线程安全版本
  LinkedList
  有序可重复,允许为空非安全的初始容量为10的双向链表
  LinkedList中定义了两个私有属性:size 和Entry (Entry中包含成员变量:previous, next,element)
  LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据,数据结构——我们可以称之为节点,节点实例保存业务数据、前一个节点的位置信息和后一个节点位置信息
  插入元素:改变前后Entry的引用地址
  删除元素:预删除节点的前一节点的后指针指向预删除节点的后一个节点。预删除节点的后一节点的前指针指向预删除节点的前一个节点。清空预删除节点:交给gc完成资源回收,删除操作结束。与ArrayList比较而言,LinkedList的删除动作不需要"移动"很多数据,从而效率更高。
  访问元素:get(int)方法首先判断位置信息是否合法(大于等于0,小于当前LinkedList实例的Size),然后遍历
  到具体位置,获得节点的业务数据(element)并返回。当index小于数组大小的一半的时候(size >> 1表示size / 2,使用移位运算提升代码运行效率),从前向后查找;否则,从后向前查找。
  ArrayList和LinkedList比较
  (1)LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址
  (2)ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址
  HashMap
  无序可重复,允许为空线程非安全的 链表的数组
  构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
  无序:特别说明这个无序指的是遍历HashMap的时候,得到的元素的顺顺序
  可重复:Key重复会覆盖、Value允许重复)
  Key和Value都允许为空
  非线程安全的
  HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。(key 的hash值决定位置)HashMap中主要是通过key的hashCode来计算hash值的,只要
  hashCode相同,计算出来的hash值就一样。
  如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道,解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的。
  Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。(previous element next)
  构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap: 空间利用和查找效率最好
  加载因子它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费 ; 加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.链表长度会越来越长,查找效率降低。
  存储元素(读取):先判断key是否为null,若为null,则直接
  调用putForNullKey方法,将value放置在数组第一个位置上。若不为空则根据key的hashCode重新
  计算hash值,然后根据hash值得到这个元素在table数组中的位置(即下标),如果table数组在该位
  置处已经存放有其他元素了,则通过比较是否存在相同的key,若存在则覆盖原来key的value,否则
  将该元素保存在链头(最先保存的元素放在链尾)。若table在该处没有元素,就直接将该元素放到此
  数组中的该位置上。
  通过比较是否存在相同的key,若存在则覆盖原来key的value:对比Key是否相同,是先比HashCode是否相同,HashCode相同再判断equals是否为true
  访问元素:此时的 HashMap 具有最好的性能:当程序通过 key 取出对应 value 时,系统只要先计算出该
  key 的 hashCode() 返回值,在根据该 hashCode 返回值找出该 key 在 table 数组中的索引,然后
  取出该索引处的 Entry,最后返回该 key 对应的 value 即可
  2的n 次方:
  HashMap的table而言,数据分布需要均匀(最好每项都只有一个元素,这样就可以直接找到),不能太紧也不能太松,太紧会导致查询速度慢,太松则浪费空间。HashMap的底层数组长度总是2的n次方数据在table数组中分布较均匀,查询速度也较快。
  LinkedHashMap
  HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序有序可重复
  HashMap迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。我们期待一个有序的Map。LinkedHashMap就闪亮登场了,它虽然增加了时间和空间上的开销,但是通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序,该迭代顺序可以是插入顺序或者是访问顺序。
  利用LinkedHashMap实现LRU算法缓存
  LRU:LRU即Least Recently Used,最近最少使用,也就是说,当缓存满了,会优先淘汰那些最近最不常访问的数据。比
  LinkedHashMap可以实现LRU算法的缓存基于两点:
  1、LinkedList首先它是一个Map,Map是基于K-V的,和缓存一致
  2、LinkedList提供了一个boolean值可以让用户指定是否实现LRU
  accessOrder 1)false,所有的Entry按照插入的顺序排列(2)true,所有的Entry按照访问的顺序排列
  concurrentHashMap
  背景: 线程不安全的HashMap 使用Hashmap进行put操作会引起死循环 ;
  效率低下的HashTable容器 , 当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法
  时,可能会进入阻塞或轮询状态。
  ConcurrentHashMap的锁分段技术(数据分段存储,分段枷锁)
  首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
  数据结构:
  ConcurrentHashMap为了提高本身的并发能力,在内部采用了一个叫做Segment的结构,一个Segment其实就是一个类Hash Table的结构,Segment内部维护了一个链表数组。当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
  高并发:ConcurrentHashMap定位一个元素的过程需要进行两次Hash操作,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部。在最理想的情况下,ConcurrentHashMap可以最高同时支持Segment数量大小的写操作(刚好这些写操作都非常平均地分布在所有的Segment上),所以,通过这一种结构,ConcurrentHashMap的并发能力可以大大的提高。总的Map包含了16个Segment(默认数量),每个Segment内部包含16个HashEntry(默认数量),这样对于这个key所在的Segment加锁的同时,其他15个Segmeng还能正常使用,在性能上有了大大的提升。
  详细解释一下Segment里面的成员变量的意义:
  count:Segment中元素的数量
  modCount:对table的大小造成影响的操作的数量(比如put或者remove操作)
  threshold:阈值,Segment里面元素的数量超过这个值依旧就会对Segment进行扩容
  table:链表数组,数组中的每一个元素代表了一个链表的头部
  loadFactor:负载因子,用于确定threshold
  volatile的保证:对volatile域的写入操作happens-before于每一个后续对同一个域的读写操作。所以,每次判断count变量的时候,即使恰好其他线程改变了segment也会体现出来。
  get方法没有使用锁来同步,只是判断获取的entry的value是否为null,为null时才使用加锁的方式再次去获取。
  put 操作:首先对Segment的put操作是加锁完成的。因为每个HashEntry中的next也是final的,没法对链表最后一个元素增加一个后续entry所以新增一个entry的实现方式只能通过头结点来插入了。
  remove 操作:先定位Segment的过程,然后确定需要删除的元素的位置, 程序就将待删除元素前面的那一些元
  素全部复制一遍,然后再一个一个重新接到链表上去,

一束阳光,一抹微笑,绽放生活的美好时光总是删繁就简,秋意越来越浓了,秋风,秋雨,秋草黄,一场秋雨,一场凉,秋天的阳光,温暖而热烈,季节里大片的金黄在阳光的照耀下,弥漫着浓浓的丰收的气息,那份饱满与丰盈,像极了生命经心中系美好阳光总普照原创头条评论生活是个多彩的舞台,有人喜欢在台上绽放,有人愿意在台下观看。各取所好,各尽所长。有的人明遮膜样且下作肮脏,结果尽丢了家人,祖国和人民的脸。有的人长的脸方,十分受看,做起仁者情怀阳光无限原创头条评论岁月苍茫,人生苦短。在追求生活的道路上,人生必定要披星戴月的奋斗,不管四季轮回,奋耕日月依旧会如常,日出月落,不断向前。人生就是这般日复一日,年复一年。多苦多累都能熬过把好命运迎接阳光原创随笔人生青春,应是一缕美好的光阴。只有懂得如何去珍惜,加以利用,那美好定是你此生挽到的最好命运。若是随波逐流,没有登高彼岸的决心,那美好的青春也好比岁月向人眨了下眼睛。如花似玉从知否到都挺好,都只讲了一个道理都挺好中,演到朱丽和她妈妈去医院找苏明玉求情,发现她已经出院了,电话也联系不上,家里也没有,谁也不清楚明玉去了哪里。其实,她是为了逃避那些人劝她,和石天冬去了自己别墅。不知你发现没这一生,风雨无阻,砥砺前行人这一生,太不容易风风雨雨,起起落落脚步一直往前走不曾一刻停留过疲惫的时候也会想放弃但是,一路上有你你的关怀你的鼓励让我的人生路充满温暖愿意给你我的全部愿意和你一直走下去悲欢离合人请相信,时间会带走一切当你心情不好的时候你会觉得做什么事都不对,都是错那只是坏心情在作怪当你开心的时候你会觉得事事都有机会靠自己争取,靠自身努力一切都是可以换取来的其实,所有的努力都不会白费一切都会到达最无情是时间最无情的不是人心最无情的是时间时间像是一把刻刀划去美好的曾经留下渐渐苍老的自己无论是当初的承诺还是过往的约定都在时间的流走中被慢慢地淡化最后化成了虚无我们不停的前行在成长中看透了世总觉一生太短,总觉时间不够一世够活吗总觉得一世太短总想着如果有来世一定要好好的活一次做想做的事情爱想爱的人可是人生在世只有一次来世只不过是虚妄的存在错过了这一辈子下辈子无论是怎样我们都不会再见了明天和来世都时间的智慧与轮回生死之间有大恐怖!这里不论这句话本身含义。分享一下痛苦,我是一个懒惰的普通人。希望可以警醒那些同样被各种问题困扰的有心人但凡有一丝想过想好一点的人!朋友,想想失去你最爱的人或事的痛爱,其实很简单其实爱很简单,不需要口头宣扬,不需要每天挂在嘴边,不需要甜言蜜语,也不需要精美却不实用的礼物哗众取宠。爱就是要时时刻刻的心系,他喜你喜,他怒你哄,他受伤你心疼。爱就是要时时刻刻的注
父爱如山,向天下所有的父亲致敬1,父亲,您是海中塔,指引我回家您是万重山,撑起一片天您是被中棉,身暖心也暖以前你的背影一点也不像山,后来发福了,就像了。尽管您总是默默无言,但无声的父爱却永伴身边。尽管我从不说什长夜难眠何处寄,揖手拂韵度诗舟(一)月上檐角入小楼,拟将心事放眉头。柔情已在笔底种,愁绪无助望归鴻。离音渺,情难收,青衿冷断素怀幽。长夜难眠何处寄,揖手拂韵度诗舟。(二)揖手拂韵度诗舟,孤雁漫过老树秋。芳心今夕事成聊复投笔去,多情只管入诗囊(一)抚琴抱鹤觅书香,横陈竖笔种清凉。江湖往来多少事,尽在佛前一柱香。寻古调,作华章,诗心和在小梅旁。缘字飞去东风送,谪下红尘论短长。(二)谪下红尘论短长,诸般寂寞寸心量。醉里随花痴情难抵时光去,俱在清风冷月前(一)欲攀书山太古前,随波沉俗琢玉兰。有心提笔阑珊处,无意徘徊柳叶间。多少事,往来安,天涯寻梦不言单。曾经写就长情诺,误将相思落笔端。(二)误将相思落笔端,青池红笺任我拈。胸中块垒花前聊付三生悔,几人风流千古存(一)惯把相思倾入樽,红妆卸浣犹自焚。和露烟霞凄绝处,敲仄推平再销魂。信未停,墨有痕,放淡风流扫纤尘。余杯不尽莫放手,浮华劲退自由身。(二)浮华劲退自由身,旧雨相过酒共倾。诗画一堂把爱深藏在心底(把)盏寒宵望瑶台,(爱)落荒丘思絮飞。(深)情无份痴生哀,(藏)书弄墨寻自在。(在)学李杜好韵排,(心)轻是非扬眉开,(底)事搁浅迎春来。曾经的无话不说,曾经的心灵相吸,曾经的朝娘,我回来了,献给母亲,祝天下母亲平安快乐!小的时候,在外面疯够了,饿了,渴了,便跑回家。回家后,见了母亲第一句话便是娘,我回来了!这句话我说了五十年,还想再说五十年!母亲已经七十有五,身体还硬朗。不过,因年轻时劳作,落下哮冯仑子牙学宫将建在道家学说发源地,天下第一福地楼观台楼观台子牙学宫,周至楼观当地人也不知道是干什么,是展览馆?还是什么大学?和姜子牙什么关系吗?今天翻阅了一些资料,才知道子牙学宫是这一所什么样的学校,能在这里办一所这样的的学院,说明大美新疆的代表巴音布鲁克落日余晖,天下无双巴音布鲁克的落日余晖从那拉提草原到巴音布鲁克的沿途风景是非常美丽的!一路上都有绿油油的草地和墨绿色的云杉。水丰草足,马牛羊群的数量明显增多,有些羊群估计有几百上千头。为了区分羊群,天下只有两种人,一种说一切都是美好的,另一种说一切都是糟糕的钱钟书在围城中写到天下只有两种人。譬如一串葡萄到手,一种人挑最好的先吃,另一种人把最好的留在最后吃。照例第一种人应该乐观,因为他每吃一颗都是吃剩的葡萄里最好的第二种应该悲观,因为他甘南臻艾健康中国艾泽天下余生勇敢的去经历,去做自己想做的事情,去选自己所爱的,不要在意别人的眼光,结合当地实际,致力于产业兴旺的目标,将零散的产业扶贫项目转移到区域内具有比较优势的特色产业的培育和发展上来