目录
List接口的常用实现类:
1.1ArrayList
1.2Vector
1.3LinkedList
1.4Queue接口
相关面试题
List是Collection的常用子类接口,可以存储一组有序,不唯一的对象
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); } }
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()); } }
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); } }
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。