各种集合类型底层实现原理

①HashMap的工作原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。
HashMap底层是用数组链表存储的,元素是Entry。向HashMap添加时,由key的hashcode决定Entry存储位置,当两个Entry对象的key的hashcode相同时,由key的equals()方法返回值决定采用覆盖行为(返回true),还是在链表头添加新的Entry(返回false)。Collection values(),返回集合对象,但不能添加元素,主要是用来遍历。自定义类如果放入HashMap或HashSet中,需要重写equals和hashcode方法。




【获奖公布】“我的2016”主题征文活动

    


程序猿全指南,让【移动开发】更简单!

      


【观点】移动原生App开发和HTML 5开发,你更看好哪个?

   


博客的神秘功能









个人官方网站 :点击进入

Set和Map的关系
Set代表无序,不能重复的集合;Map代表Key-Value组成的集合,是一种关联数组。Map的Key要求是不能重复,没有顺序。把Map的所有Key组合起来就是Set。Set keySet();


HashMap和HashSet原理
HashMap底层是用数组链表存储的,元素是Entry。向HashMap添加时,由key的hashcode决定Entry存储位置,当两个Entry对象的key的hashcode相同时,由key的equals()方法返回值决定采用覆盖行为(返回true),还是在链表头添加新的Entry(返回false)。Collection values(),返回集合对象,但不能添加元素,主要是用来遍历。自定义类如果放入HashMap或HashSet中,需要重写equals和hashcode方法。

 

HashSet s = new HashSet

s.add(new Name("1"));

System.out.println(s.contains(new Name("1")));
如果不对Name类重写hashcode,equals,输出结果是false。因为默认的不能保证结果一样。


TreeMap和TreeSet原理
TreeMap底层是用红黑树来存储,每个Entry对应树的一个节点,TreeMap元素默认从小到大排序。V put(Key k, Value v)实质是二叉排序树的插入算法

ArrayList底层是数组
List是线性表的数据结构,ArrayList是顺序存储的线性表

LinkedList底层是链表
LinkedList是链式存储的线性表,实质是双向链表,实现了List和Deque接口。Deque代表双端队列,既可以当做队列也可以当作栈。

Vector和ArrayList区别
Vector提供synchronized修饰方法,是线程安全版本的ArrayList
. Vector  本质是一个数组,其实所有集合都是数组,从JAVA 来说搞成了对象,符合我   们的OO,可以参考学习。
Iterator迭代器
用于迭代Collection集合,包括Set和List。集合提供iterator()方法
迭代器模式:系统为遍历集合提供标准的“迭代器接口”,用于访问集合里的数据,如何实现交给集合自己完成。
1
0
 
 
 
       

参考知识库

Java SE知识库

20608关注|468收录

Java EE知识库

13870关注|1215收录

Java 知识库

22007关注|1436收录

算法与数据结构知识库

12420关注|2318收录

更多资料请参考:
猜你在找
Ceph—分布式存储系统的另一个选择 顾荣:开源大数据存储系统Alluxio(原Tachyon)的原理分析与案例简介 CCIE专家讲解思科认证网络认证CCNA v2.0网络工程师和网络安全课程 Android之数据存储 数据结构基础系列(5):数组与广义表
转emacs TAB&空格缩进配置命令 jsjavascript正则表达式中g  Eclipse 警告提示Access&nb libnumaso164bit is&nb ALV democl_salv_table&nbs
查看评论
1楼 丁国华 2016-12-07 11:36发表 [回复] [引用] [举报]
3_u010850027.jpg
mark
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10 Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap

                    

转载于:https://www.cnblogs.com/jobs-lgy/p/6288797.html

你可能感兴趣的:(各种集合类型底层实现原理)