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
原理基于链表结构,双向链表
数组和链表的区别
- 数组:保证元素的有序性 可以 基于下标查询(o1),查询。
- 链表:单向链表和双向链表(可以基于下表查询)(on),增删。