有序的Map集合--LinkedHashMap
提出问题:
在写一个dao的时候,我的需求是这个dao是一个万能的,目前的方法只有一个查询出实体类对应的表中所有的数据,通过传入的对象,利用反射获取实体类中的属性名,属性类型,利用字符串拼接获取相应属性对应的set方法,利用Method中的invoke方法执行set方法。由于实体类是通过表生成的,所以表中的字段和实体类中属性的顺序是一致的,每次通过反射依次获取到属性名,通过结果集get出来,当到这里的时候,遇到了一个问题,一开始想的是通过反射过去的属性名和属性类型是一一对应的,通过键值对的结构存储不是更好吗,属性名作为键,因为不可能有重复的属性名,属性类型作为值放入map集合中。但是遇到了问题,从数据库中查询的结果集中获取结果的时候需要知道每个字段的顺序,这样getString(1)或者getInt(2)……才可以,因为通过反射已经获取到了属性类型所以加一个判断就可以选择出使用哪一个get方法是getString()还是getInt()。由于map集合时无序的,我们接触到最多的集合中只有List集合时有序的,但是不能存储键值对,实体类中的属性顺序是和表中的字段顺序对应的,我们可以利用这个解决这个问题,通过查了查,发现有一种map(LinkedHashMap)集合时有序的,可以做到按照用户放入集合的顺序取出集合中的元素,上面遇到的问题就解决了。
LinkedHashMap介绍:
简单的介绍一下。通过LinkedHashMap这个名字可以看出来这是个链表和哈希表的结合,链表是有顺序的,哈希表通常说是散列表,通过计算键的哈希值,用这个哈希值映射到表结构中,LinkedHashMap允许存储null值,基本的和HashMap一致,通过键找到值,键不可以重复,值可以重复。下图是LinkedHashMap的继承关系,继承于HashMap,所以基本的方法都是一致的。
LinkedHashMap的实现:
底层和HashMap一致,用哈希表实现,区别是LinkedHashMap还使用了一个双向链表实现顺序存取,这个双向链表的实现依赖于Entry这个内部类,这个Entry内部类在集合中非常常见。通过查看Entry类中的方法实现也可以看出
在删除和增加时,都在修改前面的引用和后面的引用。
在HashMap中只是利用了哈希表,而LinkedHashMap中还用到了链表记录顺序,在LinkedHashMap中并没有put方法,而是利用了HashMap中的put方法,但是重写了put方法中调用的的addEntry()方法
通过上面方法的分析,可以看出在添加节点的时候(由于是双向链表)都会在尾部进行添加。
有序的Map集合--LinkedHashMap的更多相关文章
- 有序取出Map集合的元素
最近写到一个程序,返回了map,但是经过查阅资料,map是没有顺序的,各种查阅资料无果,最后自己写了这个方法.. 1,通过map集合的keySet()方法,获取到一个包含map所有key的Set集合 ...
- 集合框架-Map集合-LinkedHashMap及关联源码操作
1 package cn.itcast.p9.linkedhashmap.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator ...
- HashMap,ConcurrentHashMap原理。Collection(list,set,map集合区别)。和CAS
collection里面有什么子类?(list和set是实现了collection接口的.) List: 1.可以允许重复的对象(可重复,有序集合).2.可以插入多个null元素.3.常用的实现类有 ...
- 有序的map LinkedHashMap
HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方.所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺 ...
- Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌
1.Map集合概述和特点 * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多 ...
- Map集合
1:Map (1)将键映射到值的对象. 一个映射不能包含重复的键:每个键最多只能映射到一个值. 键值对的方式存在 (2)Map和Collection的区别? A:Map 存储的是键值对形式的元素,键唯 ...
- Map集合 总结
(本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教,谢谢.) Java的集合类可分为Set.List.Map.Queue,其中Set.List.Queue都有共同 ...
- java_list,set,map集合
一.集合定义 集合就是讲诺干用途相同.近似的“数据”结合成一个整体 集合从体系上分为三种 1.列表(List):List集合区分元素的顺序,允许包含相同的元素 2.集(set):Set集合不区分元素的 ...
- 【Java进阶】---map集合排序
map集合排序 这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题. 比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...
随机推荐
- 笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)
图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...
- Conditional Random Fields (CRF) 初理解
1,Conditional Random Fields
- SDL显示文字
前面教程里,我们只显示图片,没提到如何显示文字, SDL本身没有显示文字功能,它需要用扩展库SDL_ttf来显示文字.ttf是True Type Font的缩写,ttf是Windows下的缺省字体,它 ...
- freemarker中的left_pad和right_pad(十五)
freemarker中的left_pad和right_pad 1.简易说明 (1)left_pad 距左边 (2)right_pad 距右边 (3)当仅仅只有一个参数时,插入的是空白:当有两个参数时, ...
- Eclipse去除网上复制下来的来代码带有的行号
一.正则表达式去除代码行号 作为开发人员,我们经常从网上复制一些代码,有些时候复制的代码前面是带有行号,如: MyEclipse本身自带有查找替换功能,并且支持正则表达式替换,使用正则替换就可以很容易 ...
- WPF基础篇之系统中141种颜色
WPF最大的特点就是酷炫的外观,在学习过程中经常看见各种渐变窗体.作为几乎没做过美工的程序员,我对各种颜色的argb值不熟,颜色的英文单词也只认识部分.为了不至于每次都用Colors点出颜色再随机挑选 ...
- myeclipse 打开jsp文件出错
第一步:找到MyEclipse的安装路径:第二步:删除掉MyEclipse\configuration下名为:org.eclipse.update的文件夹:第三步:产出之后重启myeclipse,在打 ...
- numpy使用总结
numpy是Python中常用的数据处理库的基础库,一般通过import numpy as np的方式导进 科学计算库numpy 在numpy中,主要的数据结构是ndarray,在numpy中称为数组 ...
- UOJ207:共价大爷游长沙
题面 UOJ Sol 神题 给每个点对随机一个权值,把这两个点的权值异或上这个随机的值 用\(LCT\)维护子树信息,若子树异或和为所有点对的异或和那么就是答案 大常数代码 # include < ...
- 最长k可重区间集问题
费用流,离散化后,l向r连费用为负长度的边容量为1 相邻的连容量为k的边,最好建S和T # include <bits/stdc++.h> # define RG register # d ...