一、介绍hashMap
hashMap是一个集合Collection,它是基于Map集合实现的,它存储Key-Value这样的键值对,类似于一个映射表。
1、针对插入的数据,首先要根据key进行一个数学变换(把key经过一定的数学变换转成下标的过程称为“哈希函数”/“散列函数”,无论插入/删除/查找,执行之前都需计算下标,这个下标也就是哈希值。
比如说:key%数组长度->数组下标
key-low->数组下标
2、两个相同的key,通过相同的哈希函数计算得到的hash值一定相同;
3、哈希冲突:两个不同的key,通过“哈希函数”计算后得到相同的hash值。
4、如何处理“哈希冲突”?
1>尽量避免(降低冲突的概率):选择更合适的哈希函数(数组长度设为素数)
2>正面应对
a:闭散列:发现冲突后,就在当前冲突位置的周围找到一个空闲位置来插入元素;
b:开散列:开散列的数组中的每个节点相当于一个链表,当出现hash冲突的时候,就把新元素插入到链表中。遇到hash值一样的,就继续往链表后面加,查找的时候先计算得到哈希值,然后扫描链表查找即可,删除的时候也是如此。
5、当哈希冲突比较严重的时候,查找/插入/删除的效率很低。特别严重的时候可以采取下面的方法:
1>扩容(降低负载因子:负载因子就是哈希表中保存的元素个数/数组长度);
2>针对开散列来说,将链表换成二叉搜索树/哈希表(二次哈希)。
hashMap的底层其实还是一个数组
对于Map来说,插入元素和删除元素的顺序无关,Map内部对于元素的顺序有自己的规则,元素组织顺序取决于具体时HashMap还是TreeMap,HahsMap时根据hashCode来组织,TreeMap是根据红黑树来进行组织。
二、如果一个对象为key时,hashCode和equals方法要注意什么?
当key时一个对象的时候,要重写Object类的equals和hashCode方法
那么为什么当key是对象的时候我们要进行重写hashCode和equals方法?
用Set集合来存储对象的时候,要求对象时泵重复的,那么我们就要那这个对象和Set集合中的对象进行比较,看是否存在,如果这个集合中的对象非常多的时候,怎么办呢?这时我们就需要重写hashCode方法,将hashCode值相同的放在同一块区域,然后再重写equals方法,再这个区域里面进行比较,这样工作量就大大降低了。
三、HashSet和HashMap的区别是什么?
四、HashMap时线程安全的吗?线程安全需要用到什么
不是线程安全的
##################
五、ArrayList和LinkedList的区别?
1、ArrayList的底层是顺序表(数组),LinkedList底层是链表;
2、ArrayList数据存放在连续内存空间上,LinkedList不是;
3、ArrayList能够高效的进行"随机访问”,按照下标操作元素的时间复杂度为O(1);
4、LinkedList能够高效的进行插入/删除操作,时间复杂度为O(1);
5、ArrayList在初始化时可通过capacity参数指定最大容量,当add尾插时,如果元素个数小于capacity,效率都很高O(1),如果达到capacity ,此时会触发扩容(把原来的元素搬过来,再释放旧的空间)
LinkedList没有capacity这个概念,每次新插入一个元素,都会去new一个特定的节点元素;
6、ArrayList比较害怕内存碎片,LinkedList则不害怕。
六、HashMap和ConcurrentHashMap哪个效率更高?
HashMap效率更高,因为HashMap时线程不安全的,ConcurrentHashMap是线程安全的,加锁会较低效率。
七、hashCode的主要作用?
hashCode是jdk根据对象的地址 或者字符串或者数字算出来的int类型的数值。
Java-集合
最新推荐文章于 2022-09-15 10:08:38 发布