ArrayLis源码解读 扩容以及缩容

存放元素:有序
线程是否安全:不安全
数据结构:给予数组实现。

package com.gtf.xc;

import java.util.ArrayList;
import java.util.Arrays;

public class MyArrayList<T>
{
    Object[] elementData;
    /**
     * 当前存储的元素个数
     */
    int size;
    /**
     * 默认大小为10
     */
    static  final int DEFAULT_SIZE=10;
    public MyArrayList() {

    }
    public  void add(T element) {
        //默认初始化
        if (elementData == null) {
            elementData = new Object[DEFAULT_SIZE];
        }
        //判断是否需要做扩容
        if (size+1> elementData.length){
            //原来的容量
            int oldSize = elementData.length;
            //新的容量 10+10/2
            int newSize = oldSize + (oldSize>>1);
            elementData = Arrays.copyOf(elementData, newSize);
        }
        elementData[size++] = element;
    }
    public T get(int index){
        return (T) elementData[index];

    }
    public boolean remove(T t){
        for (int i = 0; i <size; i++){
            if (elementData[i].equals(t)) {
                int numMoved = size - i - 1;
                if (numMoved > 0) {
                    System.arraycopy(elementData, i+1, elementData, i,
                            numMoved);
                }
                elementData[--size] = null; // clear to let GC do its work
            }
        }
        return false;
    }

    public static void main(String[] args) {
        ArrayList<Object> objects = new ArrayList<>();
        objects.remove("a");
        MyArrayList<Object> objectMyArrayList = new MyArrayList<>();

        for (int i = 0; i < 11; i++) {
            objectMyArrayList.add(i);
        }
        for (int i = 0; i <11; i++){
            System.out.println(objectMyArrayList.get(i));
        }
    }
}

arraylist与vector集合有哪些区别

相同点:都是基于数组实现的,默认容量都为10.
不同点:vector安全(2倍扩容),arraylist线程不安全(1.5扩容)。

hashset源码

底层是hashmap存储,key就是hashset存放的元素,value值就是空的object对象。

hashset为什么无序

每次put操作,计算index都是散列。遍历每次都是从头。 hashmap也是无序。

hashset数据结构

数组+链表+红黑树

linkedlist

原理基于链表结构,双向链表

数组和链表的区别

  1. 数组:保证元素的有序性 可以 基于下标查询(o1),查询。
  2. 链表:单向链表和双向链表(可以基于下表查询)(on),增删。