List
Java的List是一个非常有用的数据类型。List是有序的Collection。Java List一共有三个实现类,分别是ArrayList、Vector和LinkedList。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//In_List();
//St_List();
}
private static void In_List() {
List<Integer> lt = new ArrayList<Integer>();
for (int i = 0; i < 20; i++) {
//添加元素
lt.add((int)(Math.random()*100+1));
}
//输出
System.out.println(lt.toString());
//排序
Collections.sort(lt);
System.out.println(lt.toString());
}
private static void St_List() {
List<String> lt = new ArrayList<String>();
lt.add("10");
for (int i = 0; i < 25; i++) {
//添加元素
lt.add(""+(int)(Math.random()*50+1));
}
System.out.println(lt.toString());
//是否包含
System.out.println("是否包含 50: "+lt.contains("50"));
//查找
System.out.println("下标为2的元素: "+lt.get(2));
System.out.println("下标为20设置为1 "+lt.set(20, "1"));
System.out.println("1所在下标:"+lt.indexOf("1"));
System.out.println("最后一个1所在下标:"+lt.lastIndexOf("1"));
//删除
lt.remove(2);
System.out.println(lt.toString());
lt.remove("10");
System.out.println(lt.toString());
//转换成数组
String[] st = new String[lt.size()];
lt.toArray(st);
System.out.println(Arrays.toString(st));
}
}
ArrayList
ArrayList是常用的List实现类,内部是通过数组实现的,它允许对元素快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动,代价比较高。因此,他适合随机查找和遍历,不适合插入和删除。
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> al= new ArrayList<Integer>();
//添加
for (int i = 0; i < 25; i++) {
al.add(i);
}
//遍历
AL_for(al);
System.out.println();
AL_For(al);
System.out.println();
AL_It(al);
}
public static void AL_It(ArrayList<Integer> al) {
//通过迭代器进行遍历
System.out.println("通过迭代器进行遍历");
Iterator<Integer> it= al.iterator();
while (it.hasNext()) {
System.out.print(it.next()+" ");
}
}
public static void AL_For(ArrayList<Integer> al) {
//增强for循环
System.out.println("增强for循环");
for (Integer num:al) {
System.out.print(num+" ");
}
}
public static void AL_for(ArrayList<Integer> al) {
//通过索引值进行遍历
System.out.println("通过索引值进行遍历");
for (int i = 0; i < al.size(); i++) {
System.out.print(al.get(i)+" ");
}
}
}
Vector
Vector与ArrayList相似但是不同之处在于它支持线程同步,及某一时刻只能有一个线程能够编写Vector,这就避免多线程同时写而引起的不一致性,但是实现同步需要花费很高的代价,并且访问速度不如ArrayList
import java.util.Vector;
import java.util.concurrent.CountDownLatch;
public class VectorTest {
public static void Ve(Vector<Integer> ve) {
// 添加元素
for (int i = 0; i < 25; i++) {
ve.add(i);
}
// 输出
System.out.println(ve.toString());
// 删除
ve.remove(1);
System.out.println(ve.toString());
ve.removeElement(9);
System.out.println(ve.toString());
// 查找
System.out.println("12的下标: " + ve.indexOf(12));
}
//线程
static class MyThread extends Thread {
private CountDownLatch countDownLatch;
private Vector<String> vector;
private String element;
public MyThread(CountDownLatch countDownLatch, Vector<String> vector, String element) {
this.countDownLatch = countDownLatch;
this.vector = vector;
this.element = element;
}
@Override
public void run() {
super.run();
try {
synchronized (vector) {
if (!vector.contains(element)) {
Thread.sleep(1000);
vector.add(element);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
}
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(2);
Vector<String> vector = new Vector<>();
MyThread myThread1 = new MyThread(countDownLatch, vector, "AA");
MyThread myThread2 = new MyThread(countDownLatch, vector, "AA");
MyThread myThread3 = new MyThread(countDownLatch, vector, "BB");
myThread1.start();
myThread2.start();
myThread3.start();
countDownLatch.await();
int vectorSize = vector.size();
System.out.println("vector size: " + vectorSize);
for (int i = 0; i < vectorSize; i++) {
System.out.println("index " + i + ": " + vector.get(i));
}
}
}
LinkList
LinkList使用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外它还有专门用于操作表头和尾元素,可以当作堆栈和双向队列使用。
import java.util.LinkedList;
import java.util.List;
public class LinkListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public static void LLT() {
LinkedList<String> ll = new LinkedList<String>();
// 添加
for (int i = 0; i < 25; i++) {
ll.add("" + i);
}
// 输出
System.out.println(ll);
ll.addFirst("12");
System.out.println(ll);
ll.addLast("23");
System.out.println(ll);
// 查找
System.out.println("链表的第一个元素是 : " + ll.getFirst());
System.out.println("链表最后一个元素是 : " + ll.getLast());
// 删除
ll.remove(2);
System.out.println(ll);
// 生成子链表
List subl = ll.subList(1, 4);
System.out.println("子链表");
System.out.println(subl);
}
}
ArrayList、Vector、LinkedList比较
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高