• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

java常用类--List类

java常用类--List类

1、ArrayList类

ArrayList的性质:

1、ArrayList的实质是一个数组,添加是对数组的动态扩容
2、ArrayList的数组容易查找,但是不方便频繁的增加和删除

ArrayList初始化源码分析:

ArrayList<String> list = new ArrayList<>()
/**
* 这样创建的一个ArrayList对象,它的长度为多大呢?
* 通过查看源码我们可以得到,刚开始new对象的时候长度为0
*/

//1、查看空参后构造方法
public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
 }
//2、查看DEFAULTCAPACITY_EMPTY_ELEMENTDATA这个默认值
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**
* 得出结论:刚开始创建空参ArrayList的长度默认为0
*/

但是java中的Api说ArrayList空参构造后长度默认为10,这是怎么回事呢?

//3、我们继续查看源码,查看它的add方法
private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
    }
//4、通过这个源码发现,有一个grow()方法,我们继续往下查看
private Object[] grow(int minCapacity) {
        return elementData = Arrays.copyOf(elementData,
                                           newCapacity(minCapacity));
    }
//5、通过这个源码我们发现这个扩容数组的方法中有newCapacity(minCapacity)这样一个方法,我们继续往下查看源代码
private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }
        return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
    }
/**
* 终于在这个源代码中,我们发现一个默认参数,DEFAULT_CAPACITY,当oldCapacity=0的时候
* 会运行return Math.max(DEFAULT_CAPACITY, minCapacity)这个代码,因此我们继续点击查看
* DEFAULT_CAPACITY的值
*/
private static final int DEFAULT_CAPACITY = 10;
从上面的源码得出结论:
	1、开始创建ArrayList对象的时候,数组长度为0;
	2、当开始使用add方法的时候,会把长度设置为10;
	3、并且ArrayList在扩容的时候,每次扩容1.5倍;

2、Vector类

1、和ArrayList实现的功能类似
2、Vector的线程是同步的,ArrayList的线程是异步的
3、Vector的的初始和ArrayList一样,但是ArrayList扩容是固定的1.5倍,Vector是指定的扩容增量

3、LinkedList类

1、操作和ArrayList没什么区别,但是这个是用双向链表实现的,ArrayList是用数组实现的
2、LinkedList适合增删数据,但是不适合频繁查找数据

posted on 2021-03-16 20:40  黄文超  阅读(486)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3