java集合分析之–1. ArrayList分析

 


由于公司最近要招聘java项目经理,面试了好几个工作了7年以上的应聘人员,当时问到java集合时,涉及到其中原理,没有几个能说清楚的.由于公司对项目经理要求比较高,对代码评审能全盘把握.所以涉及到的java问题比较多.其实作为一个工作了好几年的java的技术人员或者项目经理,对java的基础理应比较熟悉.正好自己也整理下集合中几个常用的类,希望大家发表意见.

 

在java的集合中比较常用的的是list接口,实现list接口最常用的为Arraylist,LinkList,Vector等.下面分别介绍下.

ArrayList是比较常用的数据,创建一个对象为:ArrayList array=new ArrayList();ArrayList内部实现为:

    public ArrayList(int initialCapacity) {

super();

        if (initialCapacity < 0)

            throw new IllegalArgumentException("Illegal Capacity: "+

                                               initialCapacity);

this.elementData = new Object[initialCapacity];

    }

    public ArrayList() {

this(10);

    }

由上面代码可以得知ArrayList创建对象时为一个长度为10的数组,可以得知,ArrayList为数组结构,初始化长度为10.

 

ArrayList基本方法:

 

add(E)

往数组中增加对象,首先想到的是在已有数组长度加1,但是如果数组长度超出旧数组长度会是上面情况,通过查看源代码可以得知,如果新增加一个对象,数组长度超出原来数组长度,数组将会变成int newSize = (oldSize * 3)/2 + 1长度的数组;每次增加元素时,数组都要检查数组长度是否超出范围,如果超出范围就通过ensureCapacity(int minCapacity)方法扩展数组长度,在通过Arrays.copyOf方法生成新数组。

    public void ensureCapacity(int minCapacity) {

modCount++;

int oldCapacity = elementData.length;

if (minCapacity > oldCapacity) {

   Object oldData[] = elementData;

   int newCapacity = (oldCapacity * 3)/2 + 1;

        if (newCapacity < minCapacity)

newCapacity = minCapacity;

            // minCapacity is usually close to size, so this is a win:

            elementData = Arrays.copyOf(elementData, newCapacity);

}

    }

在ArrayList中还增加了add(index,E)方法,arraylist允许在指点位置插入对象,首先要判断index是否在数组范围之内,

    public void add(int index, E element) {

if (index > size || index < 0)

   throw new IndexOutOfBoundsException(

"Index: "+index+", Size: "+size);

 

ensureCapacity(size+1);  // Increments modCount!!

System.arraycopy(elementData, index, elementData, index + 1,

size - index);

elementData[index] = element;

size++;

    }

从代码中可以看出,首先要检查长度,和add(E)方法一样,然后把数组往后移动一位。

 

remove(E)

remove(E)为指点删除arraylist中的对象,如果E为null则遍历数组,查询数组是否为null,如果为null通过fastRemove方法删除数组,如果E不为null则直接通过equals判断对象,再删除。 在删除元素时,并不会减少数组容量,如果想减少数组容量,可以通过equals方法。

 

get(index)

get方法内部实现比较简单,先检查index是否在数组范围内,再返回对象。

 

contains(o)

判断arraylist中是否包含某个对象,contains分两不处理,第一步如果o为null,循环查找arraylist中,查看是否包含null的对象如果包含返回结果;第二步o不为null情况,循环查找arraylist对象,通过equals比较,返回结果。

 

其他:

 

  • ArrayList内部结构为数组,容量可以无限制增加
  • ArrayList为非程安全

后面我再对list和map的几个常用类进行性能比较.看看在高并发下应该用那些类

 

 

 

 

你可能感兴趣的:(java,数据结构,工作,面试,招聘)