
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
public class ListDemo {
/**
* Collection接口:用于存储单个对象的集合
*
* List接口:
* 1、有序的,可以重复
* 2、允许多个null元素
* 3、具体的实现有常用的: ArrayList, Vector, LinkedList
*
* 实际开发中我们如何选择List的具体实现?
* 1.安全问题:线程,利用工具类 ArrayList 也能变成线程安全的
* 2.是否经常插入删除?建议使用 LinkedList
* 3.是否存储后遍历?ArrayList
* Vector用的不多...
* @param args
*/
public static void main(String[] args) {
}
/**
* ArrayList
* 1.实现原理:采用动态对象数组,默认构造方法创建了一个空数组
* 2.第一次添加元素扩充容量为10,后面再扩充为原来的1.5倍,扩充容量后采用拷贝的方法将原来的数据放到新数据中
* 3.不适合进行删除或者插入操作
* 4.为了防止数组容量扩充次数过多,建议创建Arraylist时,给定一个初始容量
* 5.多线程中使用不安全,适合在单线程中使用
* JDK1.2开发
*/
public static void arrayList(){
//父类的引用指向子类的对象
//使用List来存储多个不同类型的元素(对象),那么在处理时会比较的麻烦,在实际开发中,不建议存储多种类型,我们应该在集合中存储相同的类型元素
List<String> list = new ArrayList<>();
//添加元素
list.add("lsq");
list.add("lbx");
list.add("刘铂西");
//移除元素
list.add("abc");
list.remove("abc");
//为更严谨,建议先用变量存贮list的长度,如果直接使用list.size()放在循环中,每次循环调用都用,影响效率
int size = list.size();//这样的好处是list.size()只调用一次
for (int i=0;i<size;i++){//遍历元素
System.out.println(list.get(i));
}
//是否包含元素
System.out.println(list.contains("lsq"));
//转换为数组
String[] strings = list.toArray(new String[]{});
for (String string : strings) {
System.out.println(string);
}
/**
* 更多方法查看API文档......
*/
}
/**
* Vector
* 1.实现原理:也是从采用动态数组,默认构造方法是创建一个大小为10的容量的对象数组
* 2.扩充的算法:当增量为0时,扩充为原来大小的两倍,当增量大于0时,扩充为原来大小+增量
* 3.不适合删除或插入操作
* 4.为了防止数组容量扩充次数过多,建议创建Vector时,给定一个初始容量
* 5.线程安全,适合在多线程时访问,在单线程下使用效率较低
*/
public static void vector(){
/**
* 方法和ArrayList相似,不一一举例,更多方法查看API文档......
*/
Vector<String> vector = new Vector<>();
vector.add("lsq");
System.out.println(vector.get(0));
}
/**
* LinkedList
* 1.实现原理:采用双向链表结构
* 2.适合插入删除操作,性能高
* 3.实现了队列(后续)
*
*/
public static void linkedList(){
/**
* 除了实现了List的接口外,还实现了在列表的开头结尾提供了get、remove、insert、元素提供了统一命名的方法
* 方法和ArrayList相似,不一一举例,更多方法查看API文档......
*/
LinkedList<String> list = new LinkedList<>();
list.add("lsq");
list.add("lbx");
System.out.println(list.getFirst()+list.getLast());
}
}