68.List集合
(1)概念
List是有序的集合,就像我们的数组一样。我们可以把list理解为是一个长度可变的数组,而且提供了丰富的api。List的集合底层就是数组。
(2)List的添加和获得
import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List l1=new ArrayList(); //List中添加 l1.add("孙悟空"); l1.add("猪八戒"); l1.add("沙和尚"); //指定索引位置添加 l1.add(3,"挑担子"); List l2=new ArrayList(); l2.add("唐僧"); l2.add("白龙马"); l2.add("孙悟空"); l2.add("猪八戒"); l2.add("沙和尚"); //指定索引位置添加子集合的内容 l1.addAll(1,l2); System.out.println(l1); //Object o = l1.get(1);根据索引获得集合中的元素,默认返回的是Object的,但是如果已知是String类型可以强转 String o = (String) l1.get(1); System.out.println(o); //获得集合中"孙悟空"第一次出现的索引,如果不包含该元素则返回-1 int i=l1.indexOf("孙悟空"); System.out.println(i); //获得集合中"孙悟空"最后一次出现的索引,如果不包含该元素则返回-1 int j=l1.lastIndexOf("孙悟空"); System.out.println(j); } }
(3)List的遍历方法
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListTest1 {
public static void main(String[] args) {
List l1 = new ArrayList();
//List中添加
l1.add("孙悟空");
l1.add("猪八戒");
l1.add("沙和尚");
//指定索引位置添加
l1.add(3, "白龙马");
ListIterator listIterator = l1.listIterator();
while (listIterator.hasNext()){
Object next = listIterator.next();
System.out.println(next);
//使用迭代器遍历的过程中集合本身是不能更改的,这样有多线程的并发问题;但是可以通过迭代器更改集合,所作的更改不参与本次遍历
if(next.equals("白龙马")){
listIterator.add("蹄儿朝西");
}
}
System.out.println("-----------ListIterator第二次遍历------------");
//list使用迭代器遍历是可以逆转的,对比Collection
while (listIterator.hasPrevious()){
Object previous = listIterator.previous();
System.out.println(previous);
}
System.out.println("-----------使用for循环遍历------------");
//还可以使用for循环进行遍历
for (int i = 0; i < l1.size(); i++) {
Object o=l1.get(i);
System.out.println(o);
//for循环中是可以更改集合的,i < l1.size()此处使用的是可变的动态的集合长度,因此所作的更改参与这次的遍历
if(o.equals("蹄儿朝西")){
l1.add("马有失蹄");
}
}
}
}
(4)List删除方法
import java.util.ArrayList; import java.util.List; public class ListTest2 { public static void main(String[] args) { List l1 = new ArrayList(); //List中添加 l1.add("孙悟空"); l1.add("猪八戒"); l1.add("沙和尚"); l1.add("孙悟空"); l1.add("猪八戒"); l1.add("沙和尚"); System.out.println("//删除集合中指定索引的元素----------------"); l1.remove(2); System.out.println("//删除集合中第一次检索到的指定元素----------------"); l1.remove("猪八戒"); System.out.println(l1); List l2 = new ArrayList(); l2.add("唐僧"); l2.add("白龙马"); l2.add("猪八戒"); l2.add("沙和尚"); l1.addAll(1, l2); System.out.println("//指定索引位置添加子集合的内容----------------"); System.out.println(l1); l1.removeAll(l2); System.out.println("//删除集合所有子集合包含的元素----------------"); System.out.println(l1); l1.set(1,"孙行者"); System.out.println("//修改指定索引处的元素----------------"); System.out.println(l1); l1.clear(); System.out.println(l1); } }
69.ArrayList
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)
ArrayList的底层是数组的原理。
ArrayList中的元素和可以重复
是有序的集合,长度不固定。
不是线程安全的。
效率高。
ArrayList在添加数据的时候初始的长度是10,后续会以5个长度来扩充集合的长度。
ArrayList不是线程安全的集合,适合不要求线程安全的需求来实现。
好处是性能高。
缺点就是线程不安全,可能带来数据不准确。
如果线程要是同步的话,性能就会变低。
70.LinkedList
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。
Linked也不是线程安全的。
链表:储存了元素和前后的地址
LinkedList是链表为原理,添加修改删除的性能高。
import java.util.LinkedList; public class LinkListTest { public static void main(String[] args) { LinkedList list=new LinkedList(); list.add("取经"); list.addFirst("西天"); list.addLast("上大路"); System.out.println(list);//[西天, 取经, 上大路] /*list.removeFirst();//[取经, 上大路] list.removeLast();//[取经]*/ Object pop = list.pop();//出栈 System.out.println(pop);//西天 栈顶的元素出栈 System.out.println(list);//[取经, 上大路] list.push("小西天");//压栈 栈顶添加进去 System.out.println(list);//[小西天, 取经, 上大路] Object pop1 = list.pop(); System.out.println(pop1);//小西天 栈顶的元素出栈 System.out.println(list);//[取经, 上大路] } }
71.Vector
Vector
类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector
的大小可以根据需要增大或缩小,以适应创建 Vector
后进行添加或移除项的操作。
import java.util.Enumeration; import java.util.Vector; public class VectorTest { public static void main(String[] args) { Vector list=new Vector(); list.add("banana"); list.add(0,"apple"); Vector list2=new Vector(); list2.add("pineappple"); list2.add("pineapple cake"); list.addAll(list2); System.out.println(list.get(2)); System.out.println(list.elementAt(2)); System.out.println("---------Vector中使用elements()遍历----------"); Enumeration elements = list.elements(); while (elements.hasMoreElements()){ Object o = elements.nextElement(); System.out.println(o); } System.out.println("---------Vector中使用for循环遍历----------"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }