HashMap底层
就是一个数组结构(Entry<K,V>[] table) 可以看出,Entry就是数组中的元素,每个 Map.Entry其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。
hashmap的数据结构
要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),请看下图(横排表示数组,纵排表示数组元素【实际上是一个链表】)。
HashMap的工作原理
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。
List、Map、Set三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素;
Set 无法拥有重复元素,内部排序(无序);
Map 保存key-value值,value可多值。
Hashmap可以存重复键,重复值吗? 不能存重复键
|--HashSet是如何保证元素唯一性的呢?
|--是通过元素的两个方法,hashCode和equals来完成。
|--TreeSet:可以对Set集合中的元素进行排序。
|--底层数据结构是二叉树。 保证元素唯一性的依据:compareTo方法return 0.
Comparable和Comparator区别?
1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
* 2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,
map集合的两种取出方式? |
|