一、List集合的特点及常见用法
(1)元素有序,可重复,每个元素有其对应的索引(从0开始)
(2)List判断2元素相等只需equals()返回true
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
List books=new ArrayList();
books.add(new String("java"));
books.add(new String("hahahaha"));
books.add(new String("hello"));
books.add(new String("666"));
System.out.println(books);
books.add(1,new String("插入到第二个位置"));
for(int i=0;i<books.size();i++){
System.out.print(books.get(i)+",");
}
System.out.println("hahahaha元素的位置"+books.indexOf(new String("hahahaha")));
books.set(1, new String("替换元素"));//此方法不会改变list的长度
System.out.println(books);
books.sort((o1,o2)->((String)o1).length()-((String)o2).length());
System.out.println("排序"+books);
}
}
(3)List还提供了一个listIterator()方法遍历
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String[] books={"Android","java","c++","ios"};
List booklist=new ArrayList();
for(int i=0;i<books.length;i++){
booklist.add(books[i]);
}
ListIterator listIterator=booklist.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
System.out.println("反向迭代");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
二、ArrayList和Vector
(1)都是基于数组实现的,封装了一个动态的、允许再分配的Object[]数组
(2)自动增加长度(initialCapacity参数),初始化时没有指定默认10
(3)他们两个用法几乎完全相同(vector比较古老,性能较差,尽量少用)
(4)ArrayList线程不安全,Vector线程安全(但是也不建议使用Vector,可以使用Collections工具类将ArrayList线程变得安全)
(5)Vector提供了stack用来模拟栈这种数据结构(但是也不推荐使用,可以用ArrayDeque)
三、Queue集合
(1)模拟队列结构(FIFO)
(2)PriorityQueue实现类会将队列元素从小到大排序(与TreeSet类似也可以自然排序,定制排序)
import java.util.PriorityQueue;
public class PriorityQueueTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
PriorityQueue priorityQueue=new PriorityQueue();
priorityQueue.add(1);
priorityQueue.add(3);
priorityQueue.add(-8);
priorityQueue.add(-1);
System.out.println(priorityQueue);
}
}
(3)Deque接口和ArrayDeque实现类(双端队列,可从两端操纵队列,实现了栈和队列)
import java.util.ArrayDeque;
public class ArrayDequetest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//模拟栈
ArrayDeque stack=new ArrayDeque();
stack.push("java");
stack.push("android");
System.out.println(stack);
//读取第一个元素但是并不pop()
System.out.println(stack.peek());
//pop
System.out.println(stack.pop());
System.out.println(stack);
//模拟队列
ArrayDeque queue=new ArrayDeque();
queue.offer("haha");
queue.offer("2333");
queue.offer("666");
System.out.println(queue);
System.out.println(queue.peek());
System.out.println(queue.poll());
System.out.println(queue);
}
}
四、LinkedList
(1)既是list,也继承了Deque接口
(2)很强大,但是使用了链表结构,因此随机访问性能较差,插入删除性能较强
五、线性表性能分析
(1)一般来说数组一连续的内存存储元素,所以随机访问时性能最好,而链表插入删除性能较强。总体是ArrayList性能比LinkedList好。
(2)如果遍历集合元素,对于ArrayList和Vector应使用随机访问方法(get),对于LinkedList应使用迭代器(Iterator)。
(3)如要经常插入删除包含大量数据的list集合的大小,应用LinkedList。
(4)多线程时应用Collections将集合包装成线程安全的集合)