数组与ArrayList的关联与区别

arrayList层为数组

数组([]):最高效;但是其容量固定且无法动态改变

ArrayList: 容量可动态增长;但牺牲效率
建议:
首先使用数组,无法确定数组大小时才使用ArrayList!

1.效率:
数组扩容是对ArrayList效率影响比较大的一个因素。
每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,

在这个临界点的扩容操作,应该来说是比较影响效率的。

ArrayList是Array的复杂版本
ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。

2.类型识别:
ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object, 编译时不检查类型,但是运行时会报错。
注:jdk5中加入了对泛型的支持,已经可以在使用ArrayList时进行类型检查。
从这一点上看来,ArrayList与数组的区别主要就是由于动态增容的效率问题了

3.ArrayList可以存任何Object,如String,Employee等,但 不支持基本数据类型,除非使用wrapper。


4. 数组和ArrayList都表示可以存一组同类型的对象;都使用下标定位和查找元素;

集合扩容的源码:

    /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

一些实例:

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

public class Mytest02 {
	public static void main(String[] args) {
		int s1[]={1,2,3,4,5,6};
		System.out.println("集合动态增容的方式:");
		int[] copyOf = Arrays.copyOf(s1, (s1.length*2));
		for (int i=0;i< copyOf.length;i++) {
			System.out.print(copyOf[i]+" ");
		}
		System.out.println("\n===========");
		System.out.println("空集合的默认长度:");
		System.out.println(new ArrayList<>().size());
		System.out.println("集合转数组:");
		ArrayList<String> list=new ArrayList<String>();
		list.add("1");list.add("3");list.add("2");list.add("4");
		String[] array = (String[]) list.toArray(new String[1]);
		for (String string : array) {
			System.out.print(string+" ");
		}
		System.out.println("\n集合排序:");
		Collections.sort(list);
		System.out.println(list);
		
	}
	
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值