List接口实现类:ArrayList、Vector、LinkedList类
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
/**
Collection接口:用于存储单个对象的集合
子接口:List Set
List接口:
1、有序的,可以重复
2、允许多个null元素
3、具体的实现有常用的实现类:ArrayList,Vector,LinkedList
在实际开发中,我们如何选择List的具体实现类?
1、安全性问题(一般Vector)
2、是否频繁插入,删除操作(LinkedList)
3、是否是存储后直接遍历(一般ArrayList)
*/
public class ListDemo {
public static void main(String[] args) {
//arraylistDemo();
//vector();
linkedlist();
}
/**
* 面试题:ArrayList 和 Vector的区别?
*/
/**
* ArrayList
* 1、实现原理:采用动态对象数组实现,默认构造方法创建了一个空数组
* 2、第一次添加元素,扩充容量为10,之后的扩充算法:原来数组大小+原来数组的一半
* 3、不适合进行删除或者插入操作
* 4、为了防止数组动态扩充次数过多,建议创建ArrayList时给定初始容量
* 5、多线程使用不安全,适合在单线程访问时使用,效率较高(JDK1.2之后开始引用)
*/
public static void arraylistDemo() {
//使用集合类存储多个不同类型的元素(对象),那么在处理时会比较麻烦,在实际开发中不建议
//建议:应该在一个集合中存储相同的类型对象:使用<String> 指定泛型
List<String> list = new ArrayList<>();
list.add("方老师");//添加
list.add("苍老师");
list.add("胡老师");
//list.add(10); 指定泛型<String>后,即不能添加整型的数值了
int size = list.size(); //先将list.size()求出存于临时变量,临时变量进栈,这样在每次for循环时不用再做一次list.size()节省性能
for(int i=0;i<size;i++) {
System.out.println(list.get(i));
}
System.out.println(list.contains("胡老师")); //判断是否包含
list.remove("方老师"); //删除
String[] array = list.toArray(new String[] {});//转换成数组,参数为数组类型对象
for(String f:array) { //转换成数组后就可以使用foreach()遍历了
System.out.println(f);
}
}
/**
* Vector实现类
* 1、实现原理:采用动态对象数组实现,默认构造方法创建了一个大小为10的对象数组
* 2、扩充的算法:当增量为0时,扩充为原来大小的2倍;当增量大于0时,扩充为原来大小+增量
* 3、不适合删除或插入操作
* 4、为了防止数组动态扩充次过多,建议创建Vector时,给定初始容量
* 5、线程安全的,适合在多线程访问时使用,但是在单线程时效率较低
*/
public static void vector() {
Vector<String> v = new Vector<>();
v.add("方老师");
v.add("苍老师");
v.add("胡老师");
int size=v.size();
for(int i=0;i<size;i++) {
System.out.println(v.get(i));
}
}
/**
* LinkedList
* 1、实现原理:采用双向链表结构实现
* 2、适合插入,删除操作,性能高
*/
public static void linkedlist() {
LinkedList<String> list = new LinkedList<>();
list.add("方老师");
list.add("苍老师");
list.add("胡老师");
int size = list.size();
for(int i=0;i<size;i++) {
System.out.println(list.get(i));
}
}
}