Mapjava
集合框架的第二类接口树。
它提供了一组键值的映射。其中存储的每一个对象都有一个相应的关键字(key),关键字决定了对象在Map中的存储位置。
关键字应该是惟一的,每一个key 只能映射一个value。面试
实现类:算法
HashMap、TreeMap、LinkedHashMap、Hashtable等
HashMap:键值对,key不能重复,可是value能够重复;key的实现就是HashSet;value对应着放;容许null的键或值;(数组加链表(哈希表))
Hashtable:线程安全的,不容许null的键或值;
Properties::key和value都是String类型,用来读配置文件;
TreeMap:对key排好序的Map; key 就是TreeSet, value对应每一个key; key要实现Comparable接口或TreeMap有本身的构造器; (红黑树)
LinkedHashMap: 此实现与 HashMap 的不一样之处在于,后者维护着一个运行于全部条目的双重连接列表。存储的数据是有序的。(哈希表加链表)
HashMap:
Map 主要用于存储键(key)值(value)对,根据键获得值,所以键不容许重复,但容许值重复。
HashMap 是一个最经常使用的Map,它根据键的HashCode 值存储数据,根据键能够直接获取它的值,具备很快的访问速度。
HashMap最多只容许一条记录的键为Null;容许多条记录的值为 Null;
HashMap不支持线程的同步,即任一时刻能够有多个线程同时写HashMap;可能会致使数据的不一致。若是须要同步,能够用 Collections的synchronizedMap方法使HashMap具备同步的能力。数组
HashMap实现原理---散列
Hash哈希算法的意义在于提供了一种快速存取数据的方法,它用一种算法创建键值与真实值之间的对应关系。散列表又称为哈希表。散列表算法的基本思想是:以结点的关键字为自变量,经过必定的函数关系(散列函数)计算出对应的函数值,以这个值做为该结点存储在散列表中地址。
当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,全部元素存放到新的散列表中,原先的散列表将被删除。在Java语言中,经过负载因子(load factor)来决定什么时候对散列表进行再散列。例如:若是负载因子0.75,当散列表中已经有75%位置已经放满,那么将进行再散列。
负载因子越高(越接近1.0),内存的使用效率越高,元素的寻找时间越长。负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多。
什么时候需重写equals?
当一个类有本身特有的“逻辑相等”概念(不一样于对象身份的概念);
Object类仅仅提供了一个对引用的比较,若是两个引用不是同一个那就返回false,这是没法知足大多数对象比较的须要的,因此要覆盖;
使用==操做符检查实参是否为指向对象的引用”
使用instanceof操做符检查实参是否为正确的类型
把实参转换到正确的类型;
对于该类中每个“关键”域,检查实参中的域与当前对象中对应的域值是否匹 配。对于既不是float也不是double类型的基本类型的域,可使用==操做符 进行比较;对于对象引用类型的域,能够递归地调用所引用的对象的equals方法,对于float和double类型的域,先转换成int或long类型的值,而后使用==操做符比较;
当你编写完成了equals方法以后,应该问本身三个问题:它是不是对称的、传 递的、一致的? 若是答案是否认的,那么请找到 这些特性未能知足的缘由,再修改equals方法的代码
equals()和hashCode()同时覆写
尤为强调当一个对象被看成键值(或索引)来使用的时候要重写这两个方法;
覆写equals后,两个不一样实例可能在逻辑上相等,可是根据Object.hashCode方法却产生不一样的散列码,违反“相等的对象必须具备相等的散列码”。
致使,当你用其中的一个做为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另 一个做为键值去查找他们的时候,则根本找不到
不一样类型的hashCode取值
若是该域是布尔型的,计算(f?0:1)
若是是char,short,byte或int,计算(int)f
若是是long类型,计算(int)(f^(f>>>32))
若是是float类型,计算Float.floatToIntBits(f)
若是是double类型,计算Dobule.doubleToLongBits(f)
若是该域是一个对象引用,递归调用hashCode
若是该域是一个数组,则把每一个元素当作单独的域来处理,对每一个重要的元素计算一个散列码,安全
Map集合比较:
HashMap的存入顺序和输出顺序无关。
LinkedHashMap 则保留了键值对的存入顺序。
TreeMap则是对Map中的元素进行排序。
由于HashMap和LinkedHashMap 存储数据的速度比直接使用TreeMap 要快,存取效率要高。
当完成了全部的元素的存放后,咱们再对整个的Map中的元素进行排序。这样能够提升整个程序的运行的效率,缩短执行时间。
注意:TreeMap中是根据键(Key)进行排序的。而若是咱们要使用TreeMap来进行正常的排序的话,Key 中存放的对象必须实现Comparable 接口。服务器
Map经常使用方法:
Object put(Object key,Object value):用来存放一个键-值对Map中
Object remove(Object key):根据key(键),移除键-值对,并将值返回
void putAll(Map mapping) :将另一个Map中的元素存入当前的Map中
void clear() :清空当前Map中的元素
Object get(Object key) :根据key(键)取得对应的值
boolean containsKey(Object key) :判断Map中是否存在某键(key)
boolean containsValue(Object value):判断Map中是否存在某值(value)
public Set keySet() :返回全部的键(key),并使用Set容器存放
public Collection values() :返回全部的值(Value),并使用Collection存放
public Set entrySet() :返回一个实现 Map.Entry 接口的元素 Set数据结构
集合遍历app
一、加强for循环 for(Obj o:c){syso(o)}
二、使用iterator , Iterator it=c.iterator;
while(it.hasNext()){Object o = it.next()}
三、普通循环:for(Iterator it=c.iterator();it.hasNext();){it.next() }框架
代码实例异步
总结与面试
1.ArrayList: 元素单个,效率高,多用于查询
2.Vector: 元素单个,线程安全,多用于查询
3.LinkedList:元素单个,多用于插入和删除
4.HashMap: 元素成对,元素可为空
5.HashTable: 元素成对,线程安全,元素不可为空
HashMap和Hashtable的区别:
HashMap和Hashtable都是java的集合类,均可以用来存放java对象,这是他们的相同点
如下是他们的区别:
1.历史缘由:
Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个现实。
2.同步性:
Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的,而HashMap则是异步的,所以HashMap中的对象并非线程安全的,由于同步的要求会影响执行的效率,因此若是你不须要线程安全的结合那么使用HashMap是一个很好的选择,这样能够避免因为同步带来的没必要要的性能开销,从而提升效率,咱们通常所编写的程序都是异步的,但若是是服务器端的代码除外。
3.值:
HashMap可让你将空值做为一个表的条目的key或value
Hashtable是不能放入空值(null)的
ArrayList和Vector的区别:
ArrayList与Vector都是java的集合类,都是用来存放java对象,这是他们的相同点,
区别:
1.同步性:
Vector是同步的,这个类的一些方法保证了Vector中的对象的线程安全的,而ArrayList则是异步的,所以ArrayList中的对象并不 是线程安全的,由于同步要求会影响执行的效率,因此你不须要线程安全的集合那么使用ArrayList是一个很好的选择,这样能够避免因为同步带来的没必要 要的性能开销。
2.数据增加:
从内部实现的机制来说,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当你向两种类型中增长元素的时候,若是元素的数目超过了内部数组目前的长度他们都须要扩展内部数组的长度,Vector缺省状况下自动增加原来一倍的数组长度,ArrayList是原来的50%,因此最后你得到的这个集合所占的空间老是比你实际须要的要大,因此若是你要在集合中保存大量的数据,那么使用Vector有一些优点,由于你能够经过设置集合的初始大小来避免没必要要的资源开销。
总结:
1)若是要求线程安全,使用Vector,Hashtable
2)若是不要求线程安全,使用ArrayList,LinkedList,HashMap
3)若是要求键值对,则使用HashMap,Hashtable
4)若是数据量很大,又要求线程安全考虑Vector
arraylist和linkedlist联系与区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList以为优于LinkedList,由于LinkedList要移动指针。
3.对于新增和删除操做add和remove,LinedList比较占优点,由于ArrayList要移动数据。 这一点要看实际状况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但如果批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 由于ArrayList每插入一条数据,要移动插入点及以后的全部数据。
HashMap与TreeMap联系与区别
一、 HashMap经过hashcode对其内容进行快速查找,而TreeMap中全部的元素都保持着某种固定的顺序,若是你须要获得一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
二、在Map 中插入、删除和定位元素,HashMap是最好的选择。但若是您要按天然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明肯定义了hashCode()和 equals()的实现。
两个map中的元素同样,但顺序不同,致使hashCode()不同。
一样作测试:在HashMap中,一样的值的map,顺序不一样,equals时,false;而在treeMap中,一样的值的map,顺序不一样,equals时,true,说明,treeMap在equals()时是整理了顺序了的。