有序的(存取的顺序是一致的);有索引;允许存储重复的元素;
//初始代码
List<String> list = new ArrayList<>();
list.add("大哥");
list.add("二哥");
list.add("三哥");
System.out.println(list);//[大哥, 二哥, 三哥]
System.out.println("====================="); //下面演示list特有的带索引的方法
//1、为指定位置添加一个元素
list.add(1,"我插个队");
System.out.println(list);//[大哥, 我插个队, 二哥, 三哥]
System.out.println("====================="); //2、删除指定位置的元素
String string = list.remove(1);
System.out.println(list);//[大哥, 二哥, 三哥]
System.out.println("被移除的元素是"+string);//我插个队
System.out.println("====================="); //3、替换指定位置的元素
String string1 = list.set(2,"小弟");
System.out.println(list);//[大哥, 二哥, 小弟]
System.out.println("被替换的元素"+string1);
System.out.println("====================="); //4、获取指定位置的元素
String string2 = list.get(1);
System.out.println(string2);//二哥 //5、使用迭代器遍历,以及多个循环遍历的方法
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
for(Iterator<String> iterator1 = list.iterator();iterator1.hasNext();){
System.out.println(iterator1.next());
}
//增强for循环-底层是迭代器
for(String s : list){
System.out.println(s);
}
//for循环遍历,使用get方法
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}List接口的大小可变的数组的实例(底层是数组);
此实现不是同步的(意思是多线程,效率高);
里面包含了很多通过索引操作元素的方法;
简化:基于数组实现,增删快,查询慢,线程不安全;
增删慢,查询快;
很多程序员非常随意的使用ArrayList完成任何需求,并不严谨,不提倡!
ArrayList底层是基于数组实现的,数组是一串连续的存储空间,所以ArrayList集合内部的元素必须是连续存储的,当要在中间删除或者插入一个元素,其后面的元素都需要进行一移动,因此ArrayList集合不适合删除和插入,而适合查找和遍历操作;
ArrayList集合不需要在定义时指定数组的长度,当所要存储的元素超过ArrayList长度的时候,系统会自动创建一个更大长度的数组,将之前的元素复制进去,然后继续进行添加操作;
List 接口的链接列表实现(底层是链表结构);
此实现不是同步的(意思是多线程,效率高);
里面包含了多个操作首尾元素的方法;
简化:基于双向链表实现,增删快,查询慢,线程不安全!
查询慢,增删快;
使用LinkedList集合特有的方法时不能使用多态;
LinkedList采用双向链表结构存储元素,对LinkedList元素进行插入和删除时,只需要在对应节点上进行,对其他元素没有影响,因此插入和删除操作很快,但是在随机访问时需要对内部元素进行从头直到遍历到该元素为止,速度较慢;
//创建LinkedList,添加默认数据
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("大哥");
linkedList.add("二哥");
linkedList.add("三哥");
System.out.println(linkedList);//[大哥, 二哥, 三哥]
System.out.println("====================="); //1、将指定的元素插入到集合的开头
linkedList.addFirst("大姐");//[大姐, 大哥, 二哥, 三哥]
System.out.println(linkedList);
System.out.println("====================="); //2、将指定的元素插入到集合的末尾
linkedList.addLast("小妹");
System.out.println(linkedList);//[大姐, 大哥, 二哥, 三哥, 小妹]
System.out.println("====================="); //3、将一个元素推入此列表所表示的堆栈,此方法等效于addFirst
linkedList.push("大姐之前");
System.out.println(linkedList);//[大姐之前, 大姐, 大哥, 二哥, 三哥, 小妹]
System.out.println("====================="); //4、获取集合的第一个元素
System.out.println("获取集合的第一个元素为"+linkedList.getFirst());
System.out.println("====================="); //5、获取集合的最后一个元素
System.out.println("获取集合的最后一个元素为"+linkedList.getLast());
System.out.println("====================="); //6、移除并返回集合的第一个元素
System.out.println("所移除的集合的第一个元素为"+linkedList.removeFirst());
System.out.println(linkedList);//[大姐, 大哥, 二哥, 三哥, 小妹]
System.out.println("====================="); //7、移除并返回集合的最后一个元素
System.out.println("所移除的集合的最后一个元素为"+linkedList.removeLast());
System.out.println(linkedList);//[大姐,大哥, 二哥, 三哥]
System.out.println("====================="); //8、从列表所表示的堆栈出弹出一个元素,等效于removeLast
System.out.println(linkedList.pop());
System.out.println(linkedList);//[大哥, 二哥, 三哥]
System.out.println("====================="); //9、使用迭代器遍历(为了增强对迭代器的熟悉度)
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
for(Iterator<String> iterator1 = linkedList.iterator();iterator1.hasNext();){
System.out.println(iterator1.next());
}
//增强for循环-底层是迭代器
for(String string : linkedList){
System.out.println(string);
}所有单列集合的祖宗;
Vector 类可以实现可增长的对象数组(底层是数组);
与新 collection 实现不同,Vector 是同步的(单线程,速度慢);
JDK1.0版本的,非常古老;
简化:基于数组实现,增删慢,查询快,线程安全;
与ArrayList不同的是,Vector支持线程同步,即同一时刻只允许一个线程对Vector进行新增、删除、修改等操作,以保证多线程环境下数据的一致性,但需要对Vector进行频繁的加锁解锁操作,效率很低;