有序的Map集合--LinkedHashMap
来源:互联网 发布:edu域名查询 编辑:程序博客网 时间:2024/06/10 00:57
提出问题:
在写一个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 LinkedHashMap
- 有序的map LinkedHashMap
- 有序的map LinkedHashMap
- 有序Map使用,LinkedHashMap
- java 有序map: LinkedHashMap
- (11) java集合 ---- LinkedHashMap和HashMap等Map的比较使用以及 LinkedHashMap的实现原理
- java的集合 Map集合,HashMap集合,LinkedHashMap集合 使用方式及遍历
- 集合框架--Map集合之LinkedHashMap
- 集合框架map学习笔记一LinkedHashMap
- java Map集合框架之LinkedHashMap
- 【Java集合框架】Map与Set的有序与无序
- JavaSE 集合框架(3)- Map集合 HashMap LinkedHashMap
- Key有序的Map
- map的有序排放
- 19-Map集合-09-常用对象API(集合框架-Map集合-LinkedHashMap&关联源码)
- android集合处理:List中的map以及LinkedHashMap如何遍历
- Java集合框架之Map---HashMap和LinkedHashMap源码分析
- 对String在多线程中的一些简单认识
- 各主流浏览器之间的兼容性-JS篇
- 对建造者模式的总结
- 解决Xcode 8以后的Alcatraz等插件不可用
- PAT (Advanced Level) Practise1133Splitting A Linked List (25)
- 有序的Map集合--LinkedHashMap
- JavaScript学习笔记_Reduce和Transduce
- 简单存储过程的编写
- java日期格式中MMM的问题
- HttpClient
- Python + opencv 实现图片马赛克
- log4net 使用笔记(c# .net framework)
- QObject::connect: Cannot queue arguments of type "xxx",(Make sure "xxx" is registed using qRegisterM
- 神奇的Invalid bound statement (not found)错误