1.说一下Map集合中的put方法:
首先将key和value封装进一个node对象,然后底层调用k的hashcode方法得到hashcode值,利用哈希算法把这个值转为数组的下标,如果该下标位置上没有元素,那么就会把node对象添加到该位置上,如果该位置上有元素,那么就会拿node对象里面的key和该位置上的链表的每一个节点中的key进行equals,如果都返回false,那么就会把node对象添加到链表末尾(jdk1.8后才是添加到末尾),如果有一个方法返回true,那么该节点的value会被覆盖
2.说一下Map集合中的get方法:
底层调用key的hashcode方法得到hashcode值,利用哈希算法把这个值转为数组的下标,如果该下标位置上没有元素,那么get方法返回null,如果该位置上有元素,那么就会拿key和该位置上的链表的每一个节点中的key进行equals,如果每一个方法返回的都是false,那么get方法返回的值也是null,如果有一个equals方法返回true,那么get方法返回的就是该节点的value
3.为什么放到Map集合中的key对象要重写hashcode以及equals方法
不重写hashcode方法的话,会造成散列分布不均匀,而之所以要重写equals那是因为key是一个对象,而我们要比较对象中的内容
4.HashMap集合的key部分特点:
无序,不可重复。
为什么无序:因为hash算法得到的结果是随机的
不可重复是怎么保证的?equals方法来保证HashMap集合的key不可重复。如果key重复了, value会覆盖。
HashSet放到HashMap集合中的key部分,所以Hashset中的元素也需要重写hashcode和equals方法
5.什么是散列分布不均匀:
当hashcode方法的返回值都是一样的值,那么就成单向链表
当hashcode方法的返回值的值都不一样,那么就会成为纯数组
6.hashMap特点:
首先它的底层是哈希表数据结构,是非线程安全的,默认初始化容量是16,默认加载因子是0.75,这个默认加载因子指的是HashMap集合底层数组的容量达到75%的时候,数组开始扩容,两倍扩容,当手动去指定初始化容量的时候,这个容量的数值必须是2的次幂,这是为了达到散列分布均匀,提高HashMap的存取效率,所必须的。
如果在初始化容量的时候传入的数值不是2的次幂,那么会调用方法把那个数转为大于那个数的最小的2的次幂
在单链表超过8个元素后,单链表会变成红黑树结构,当链表中的元素小于8个的时候,红黑数会变回单链表
7.Hashtable集合:
Hashtable的初始化容量是11,加载因子0.75,扩容:原容量*2+1,是线程安全的
8.Hashtable和HashMap集合的区别:
Hashtable集合中的key和value是不能存储null,线程安全的
HashMap集合中的key和value可以为null,不是线程安全的
9.其他
Properties集合:
Properties是一个Map集合,继承 Hashtable集合,Properties的key和value都是String类型。
Properties被称为属性类对象。
Properties是线程安全的
存:setproperties
取:getpropertiesTreeMap集合的底层是二叉树
10.arraylist集合:
底层是object数组,默认初始化容量为10(底层先创建一个空数组,当添加第一个数据的时候,初始化容量为10),而且arraylist不是线性安全的,然后arraylist是1.5倍扩容的
arraylist的特点就是查询效率高,在指定的位置上插入或者删除数据效率低,但如果在arraylist集合的末尾添加或者删除元素的时候,他的效率也是挺高的
11.voecat集合
底层是object数组,默认初始化容量为10,两倍扩容,因为voecat是线程安全的,所以效率会比arraylist集合低
12.linkedlist:
底层双向链表,所以在插入或者删除元素的效率会高,查询方面效率较低,而且linkedlist不是线性安全的
13.arraylist跟linkedlist的区别:
arraylist底层是object数组,linkedlist底层是双向链表
arraylist在查询方法效率高,linkedlist在增删数据方面效率高
然后linkedlist还可以当做队列来使用
在开发的时候,查询数据的场景是比增删数据要多的,所以使用arraylist也是比使用linkedlist多
14.arraylist跟vector的区别
首先这两个集合的底层都是object数组,默认初始化容量都是10,但arraylist是1.5倍扩容,vector是两倍扩容
arraylist不是线程安全的,vector是线程安全的的,所以从效率上来说,arraylist效率高点,在开发中优先考虑arraylist
15.set接口(无序不可重复)
hashset:底层hashmap集合的key部分
treeset:底层是二叉树,treeset是可以进行排序的