目录
数组(Array)和列表(ArrayList)的区别
Arrays工具类
Vector,ArrayList, LinkedList的区别
ArrayList扩容机制(原理)
arrayList为什么线程不安全?
数组(Array)和列表(ArrayList)的区别
- Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
- Array大小是固定的,ArrayList的大小是动态变化的。
- ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,ArrayList 使用自动装箱来减少编码工作量;
而当处理固定大小的基本数据类型的时候,这种方式相对比较慢,这时候应该使用Array。
Arrays工具类
需要操作数组元素时,优先查看工具类中的方法,例如排序,二分法,判断是否相等啊,填充等常见功能在在工具类中都有,不需要自己写,位置在java.util.Arrays
数组中常用的方法
1、获取数字中某个元素。数组名[索引]
2、获取数组的长度。数组名.length
3、数组排序。 Arrays.sort(arr)
4、将数组转为字符串。 Arrays.toString(arr)
Vector,ArrayList, LinkedList的区别
1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。
ps:Vector是JDK1.0中的集合,是集合中的老大哥,其中大部分的方法都被synchronized关键字所修饰,与ArrayList和LinkedList不同,它是线程安全的。
Vector作为List的另外一个典型实现类,完全支持List的全部功能;
从JDK1.2开始,Vector类被改进以实现List接口,让它成为Java集合框架的一员。
Vector是一个比较古老的集合,JDK1.0就已经存在,建议尽量不要使用这个集合,Vector与ArrayList的主要是区别是,Vector是线程安全的,但是性能比ArrayList要低。
2、List中的元素有序、允许有重复的元素。
3、Vector线程同步,ArrayList、LinkedList线程不同步。
vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。如果不考虑到线程的安全因素,一般用Arraylist效率比较高。
4、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
ps: 如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以
5、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。如果在集合中使用数据量比较大的数据,用vector有一定的优势。
ArrayList扩容机制(原理)
ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。(不是原数组,而是新数组然后给予数组对象地址)。
默认情况下,新的容量会是原容量的1.5倍。 新容量=旧容量右移一位(相当于除于2)在加上旧容量
ArrayList是一个数组结构的存储容器,默认情况下,数组的长度是10。
当然我们也可以在构建ArrayList对象的时候自己指定初始长度。
随着在程序里面不断的往ArrayList中添加数据,当添加的数据达到10个的时候,ArrayList就没有多余容量可以存储后续的数据。
这个时候ArrayList会自动触发扩容。
扩容的具体流程很简单:
- 首先,创建一个新的数组,这个新数组的长度是原来数组长度的1.5倍。
- 然后使用Arrays.copyOf方法把老数组里面的数据拷贝到新的数组里面。
扩容完成后再把当前要添加的元素加入到新的数组里面,从而完成动态扩容的过程。
arrayList为什么线程不安全?
很显然,没有使用关键字去加锁,扩容大小是原始的0.5倍(oldSize oldSize/2)=newSize。
既然ArrayList是线程不安全的,但如果需要在多线程中使用:
- 可以采用list<Object> list =Collections.synchronizedList(new ArrayList<Object>)来创建一个ArrayList对象。
- 使用Vector