首先 List Set Map 分别继承了ArrayList HashSet HashMap ,
list 允许重复,set不允许重复,map是键值对形式,key-value key不能重复。
期次AryyList是线程不安全的,底层使用的是object数组,由于采用数组作为储存,那么插入和删除数据的时候就到位置的影响比较大,比如做add操作额时候,默认会将元素追加到数组的尾部,但是如果制定位置坐添加或者删除,那么坐后面的 数据就会向前或者向后自动移动 一位。虽然ArrayList 对于添加删除响应时间比较长,但是对于查询访问,可以通过序列快速定位。对于内存空间来说,ArrayList 会在list列表的尾部预留一定容量的空间。
ArrayList 可以使用增强for循环来做遍历元素。线程不安全。
private static final int DEFAULT_CAPACITY = 10;--初始值为10 private static final Object[] EMPTY_ELEMENTDATA = {};--空额 object数组; private transient Object[] elementData; public ArrayList() { super(); this.elementData = EMPTY_ELEMENTDATA; }
接下来是HashSet ,HashSet的底层是基于HashMap实现的。set 是HashSet的接口类,放入到set中的数据 是不能重复的。那么为什么不能重复呢?放入HashSet的数据,会先计算hashCode值,来判断插入的位置,与此同时也会对已经存在set中的数据做hashCode对比,如果没有出现重复,则插入成功,如果发现值重复,那么会调用equals()方法来检查hashCode值相等的对象内容是否相等,如果相等,那么就不会让其插入 。
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public boolean add(E e) { return map.put(e, PRESENT)==null; } public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key);--hashCode值 int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
接下来是HashMap 底层是数组和链表的结构,通过key的hashCode值确定value放置的位置。默认初始容量是16,1<<<4(源码中就这么写的)1000 二进制。
HashMap做添加操作的时候用的是put方法;
相关连接:https://snailclimb.top/JavaGuide/#/./java/collection/Java集合框架常见面试题