目录
Collection是集合框架最基础的父类接口,可以存储一组无序、不唯一的对象。
List接口
List是Collection的常用子类接口,可以存储一组有序,不唯一的对象
List接口的常用实现类:
1.1ArrayList
ArrayList可以在内存中分配连续的空间,底层是基于索引的数据结构,所以访问元素的效率较高。索引有点在与访问元素的效率高,但是添加或删除元素时会移动兄弟元素的位置,所以添加或删除元素时效率低。
下面代码举例:
/**
* @author EA_emran
*/
public class LearnArrayLest {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("Hello");
list.add("JavaEE");
list.add("JavaSE");
list.add("Spring");
list.add("Mybatis");
list.add("SpringMVC");
System.out.println("list"+list);
System.out.println("=========");
System.out.println("list长度"+list.size());
System.out.println("==========");
System.out.println("list是否包含Java:"+list.contains("Java"));
System.out.println("==========");
//使用iterator遍历
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next()+",");
}
System.out.println();
System.out.println("============");
//for循环遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+",");
}
System.out.println("===========");
System.out.println();
//移除元素
list.remove("Hello");
list.remove(4);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+",");
}
System.out.println();
System.out.println("===============");
//指定位置添加元素
list.add(0,"Java好玩");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+",");
}
System.out.println();
System.out.println("==============");
//替换元素
list.set(3,"ArrayList");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+",");
}
System.out.println();
System.out.println("JavaEE在集合中的下标"+list.indexOf("JavaEE"));
//截取集合,半闭半开区间[)
List list1 = list.subList(2,4);
System.out.println(list1);
}
}
运行结果
1.2Vector
Vector是一个早起的List实现类,用法基本跟Arraylist一致,区别在于Vector是线程安全的。
大多数的Java程序员使用ArrayList而不是Vector,Vector每次扩容请求其大小的2倍空间,相较于Arraylist占空间效率低。
Stack是Vector的子类,实现了一个“后进先出”的栈
下面代码举例:
/**
* @author EA_emran
*/
public class LearnVectorStack {
public static void main(String[] args) {
Stack stack = new Stack();
stack.push("Hello");
stack.push("JavaSE");
stack.push("JavaEE");
stack.push("JavaME");
System.out.println(stack);
for (int i = 0; i < stack.size(); i++) {
System.out.println(stack.get(i));
}
System.out.println("===========");
//peek()看查栈顶元素
System.out.println(stack.peek());
//pop()方法移除栈顶元素对象,并且作为函数的值返回该对象
System.out.println(stack.pop());
System.out.println(stack.peek());
}
}
运行结果
1.3LinkedList
LinkedList实现了一个“先进先出”的队列,采用双向链表的形式内部没有声明数组,对于频繁的插入或删除元素的操作效率高。
但是LinkedList不单单保存每个元素的节点数据,还要保存前后节点的位置信息,因此需要更多的内存空间,查询时需要从第一个元素开始遍历,所以查询效率低是它的缺点。
下面代码举例:
/**
* @author EA_emran
*/
public class LearnLinkedList {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.add("JavaSE");
linkedList.add("javaEE");
linkedList.add("Mybatis");
System.out.println(linkedList);
System.out.println("============");
//在链表的最后添加元素
linkedList.offer("Spring");
linkedList.addLast("SpringMVC");
System.out.println(linkedList);
System.out.println("==============");
linkedList.push("JavaME2");
linkedList.addFirst("JavaME");
System.out.println(linkedList);
System.out.println("============");
System.out.println("访问第一个元素:" +linkedList.peekFirst());
System.out.println("访问全部元素:"+linkedList);
System.out.println("访问最后一个元素:" +linkedList.peekLast());
System.out.println("访问全部元素:"+linkedList);
//将第一个元素从链表中取出
System.out.println(linkedList.pop());
System.out.println("取出第一个元素之外的元素"+linkedList);
//将最后一个元素从链表中取出
System.out.println(linkedList.pollLast());
System.out.println("取出最后一个元素之外的元素"+linkedList);
}
}
运行结果
1.4Queue接口
Queue是继承自Collection,它的底层实现了队列的数据结构。
在实际开发中,不能直接实例化Queue,需要实例化它的实现类,但是实现类AbstractQueue是一个抽象类,所以我们需要实例化它的子类PriorityQueue。
/**
* @author EA_emran
*/
public class LearnQueue {
public static void main(String[] args) {
PriorityQueue priorityQueue = new PriorityQueue();
priorityQueue.add(new A(2));
priorityQueue.add(new A(1));
System.out.println(priorityQueue);
}
}
class A implements Comparable{
private int num;
public A(int num){
this.num = num;
}
@Override
public int compareTo(Object o) {
A a =(A) o;
if (this.num>a.num){
return 1;
}else if(this.num == a.num){
return 0;
}else {
return -1;
}
}
@Override
public String toString() {
return "A{" +
"num=" + num +
'}';
}
}
运行结果
相关面试题:
一、请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?
ArrayList和LinkedList的异同二者都线程不安全,相对线程安全的Vector,执行效率高。 此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
二、ArrayList和Vector的区别Vector和ArrayList几乎是完全相同的
唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间, 而ArrayList是1.5倍。Vector还有一个子类Stack。