Java中Link,set 和Map的区别,ArrayList,HashSet和HashMap的区别。

首先 List Set Map 分别继承了ArrayList HashSet HashMap ,

list 允许重复,set不允许重复,map是键值对形式,key-value key不能重复。

期次AryyList是线程不安全的,底层使用的是object数组,由于采用数组作为储存,那么插入和删除数据的时候就到位置的影响比较大,比如做add操作额时候,默认会将元素追加到数组的尾部,但是如果制定位置坐添加或者删除,那么坐后面的 数据就会向前或者向后自动移动 一位。虽然ArrayList 对于添加删除响应时间比较长,但是对于查询访问,可以通过序列快速定位。对于内存空间来说,ArrayList 会在list列表的尾部预留一定容量的空间。

接下来是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; }

猜你喜欢

转载自www.cnblogs.com/xiaosisong/p/10880344.html