List接口
List接口继承了Collection接口,它是代表有序的队列。使用此接口可以精确的控制每一 个元素插入的位置。能够使用索引来访问List中元素。
List接口中的方法
add(e)—添加元素
get(index)—获取元素
remove(index)—按索引删除元素并返回该元素
remove(object o)—按元素删除该元素并返回布尔值 contains(object o)–是否含有该元素
set(index,e)—根据索引将元素值改变
indexOf(object o)—返回该元素索引
size()—返回集合中元素数量
List子类特点:
ArrayList: 底层数据结构是数组,查询快,增删慢,线程不安全,效率高
Vector: 底层数据结构是数组,查询快,增删慢,线程安全,效率低
LinkedList: 底层数据结构是链表,查询慢,增删快,线程不安全,效率高
这三个类都重写toString方法,返回的不是地址值而是数据字符串
ArrayList类和Vector类
ArraylList和Vector一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。如果你的程序不涉及到线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用synchronized,必然会影响效率)。
二者之间还有一个区别,就是扩容策略不一样。在List被第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。
ArrayList存储字符并遍历
代码:
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> array=new ArrayList<>();
array.add("a");
array.add("b");
array.add("c");
array.add("d");array.add("e");
array.add("f");
System.out.println(array.toString());
System.out.println("-------");
//遍历(迭代器)
Iterator<String> it =array.iterator();
while(it.hasNext() ) {
String s=it.next();
System.out.print (s+" ");
}
System.out.println();
//遍历(for循环)
for(int i=0;i<array.size();i++) {
String s=array.get(i);
System.out.print (s+" ");
}
System.out.println();
//遍历(增强for)
for(String s:array) {
System.out.print(s+" ");
}
}
}
运行结果:
Vector存储字符并遍历
vector特有功能:
1.添加功能:addElement(Object o)
2.获取功能:elementAt(int index)
代码:
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
Vector<String> v = new Vector<>();
v.addElement("a");
v.add("b");
v.addElement("c");
v.add("d");
v.addElement("e");
v.add("f");
System.out.println(v.toString());
System.out.println("-------");
// 遍历(迭代器)
Iterator<String> it = v.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println();
// 遍历(for循环)
for (int i = 0; i < v.size(); i++) {
String s = v.elementAt(i);
System.out.print(s + " ");
}
System.out.println();
// 增强for
for (String s : v) {
System.out.print(s + " ");
}
System.out.println();
//vector特有的遍历
Enumeration<String> en=v.elements();
while(en.hasMoreElements()) {
String s=en.nextElement();
System.out.print(s+" ");
}
}
}
运行截图:
LinkedList类
LinkedList内部存储用的数据结构是链表。链表的特点:适合动态的插入和删除。访问遍历比较慢。另外不支持get,remove,insert方法,可以当做堆栈、队列以及双向队列使用。
代码:
import java.awt.List;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<>();
link.add("a");
link.add("b");
link.add("c");
link.add("d");
link.addFirst("s");
link.addLast("z");
System.out.println(link.toString());
for (String s : link) {
System.out.print(s + " ");
}
}
}
运行结果:
总结:
1.内部存储结构区别: ArrayList、Vector是数组存储。LinkedList是链表存储。
2.线程安全区别:ArrayList、LinkedList线程不安全。Vector线程安全。
3.使用场景区别:使用线程同步的时候Vector类首选或者使用Collections工具类初始化时候同步。需要经常删除、增加使用LinkedList(链表结构)、经常需要查询迭代使用ArrayList(数组结构)。