java中的集合接口Collection(ArrayList 和 Vector比较,List和Set比较)

1. java中数组在内存中的存储

数组的三种定义方法:
int[] a = new int[3];
int[] b = new int[3]{22,33,44}
int[] c = {22,33,44}

  • java中的数组定义时 必须指定长度,必须初始化,如果没有初始化元素会自动初始化;
  • 数组是引用对象,放堆空间(元素是连续的空间)
  • 栈内容中存放变量 指向的是数组首元素的地址,首元素地址就是整个数组地址;
  • 数组查询元素时是根据首地址计算,因此时间复杂度O(1)
    数组存储内存空间

2. ArrayList 和 Vector

  • 相同点:
  1. ArrayList 和 Vector 都是 List接口实现类;
  2. 底层都是基于数组实现的;
  3. 数组初始化的时候已经固定好长度,不能改变,List实现动态扩容,并提供了对元素的操作方法
  • 不同点:
  1. ArrayList是线程不安全,Vector是线程安全的(synchronized实现);
  2. 每次扩容的时候ArrayList是在原来长度oldCapacity的基础上加 1/2oldCapacity,而Vector 默认是2oldCapacity,也可通过capacityIncrement 自定义扩容大小
ArrayList 主要源码
public boolean add(E e) {
    // 计算集合是否扩容
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    //在原基础上增加1/2大小
    int newCapacity = oldCapacity + (oldCapacity >> 1); 
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // 先计算好扩容后的大小,然后初始化好新的数组内存空间,将原来数组的内容复制到新的数组
    elementData = Arrays.copyOf(elementData, newCapacity); 
}

Vector
public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    // 根据capacityIncrement的值判断 如何扩容,==0则 *2
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

4. List 和 Set (HashSet底层实现)

  1. List 值是有序可重复的,Set值是 无序不可重复的
  2. HashSet基于 HashMap实现,类中维护了一个HashMap成员变量,对HashSet的操作都是对HashMap的操作
    HashSet 的值都存在HashMap的key上,HashMap的value统一为常量Object
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }
    
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

3. Collection 部分关系图

继承
继承
Collection接口
Set接口
List接口
Queue接口
LinkedList类
ConcurrentLinkedQueue类
HashSet类
LinkedHashSet类
AbstractSet类
TreeSet类
AbstractList类
ArrayList类
Vector类
Stack类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值