集合类提供了add, remove, replace, get, set等方法,这些就相当于你天天写的增删改查,add -> 增,remove -> 删,replace -> 改,get -> 查,你看是不是对得上,这就是写代码day day up的诀窍,哈哈哈!
Vector和ArrayList的区别
相同点:
1. 都实现了List接口,属于Java集合框架的内容。
2. 都是用对象数组来存储数据的,元素初始个数默认都是10个
不同点:
1. Java版本不一样
Vector从JDK1.0就已经有了,比ArrayList和List都还要早,
ArrayList、LinkedList和List、Collection都是从1.2才开始有的,说明什么?
说明Vector是这当中最古老的存在了,从1.2才实现了List接口
Java底层是用C++写的,Vector类应该是参考自C++,因为C++中也有一个Vector
2. Vector数组元素默认扩容1倍,ArrayList只能扩容0.5倍
Vector:
这里Vector中的capacityIncrement(扩容个数)是可以指定的,如果指定了扩容个数,就以你指定的为准。
ArrayList:
3. Vector线程安全(?),ArrayList线程不安全
为什么Vector是线程安全?加锁了!Vector的大部分方法都加了synchronized修饰符,类似如下这样:
但有一点必须注意:Vector单个方法使用起来是线程安全的,但是两个方法复合使用就容易引发出”get-if-not-empty”这样的问题
if (vector.size() > 0) {
System.out.println(vector.get(0));
}
因为size和get方法是加锁的,如果有两个线程同时执行,存在锁竞争的情况。
线程T1可能把 size 给改变了,假设原来是1变成了0。但线程T2在线程T1改变之前,已经进入到 if内部了,这样的情况T2就很有可能会出现不正确的结果或者异常。
所以正确的做法应该是这样:
synchronized (vector) {
if (vector.size() > 0) {
System.out.println(vector.get(0));
}
}
但如果这样,和使用ArrayList的效果是一样的。Vector的线程安全就显得很尴尬,很鸡肋了!本身Vector的方法就加了互斥锁,执行性能较差,所以不推荐使用Vector!!!
ArrayList没有Synchronized修饰符的加持,所以多线程中确实是会有问题的。但我们实际应用过程中更多的使用场景是单线程的情况。如果是多线程场景,手动加上Synchronized不就OK了。