List集合
Llist集合元素有序可重复,并且可以根据索引查找元素,List判断两个元素是否相等是通过对象的equals()方法是否相等
1、ArrayList
ArrayList类内部封装了一个动态的、允许在分配的Object[]数组,如果添加元素超过数组长度时,initialCapacity会自动增加,默认长度为10,需要添加大量元素时,可以通过ensureCapacity(int initialCapacity)方法一次性增加长度,减少重分配得次数,提高性能。
使用示例代码
public class ArrayListTest { public static void main(String[] args) { Listlist = new ArrayList (); // 添加元素 list.add("java se"); list.add("java ee"); list.add("java me"); list.add("c#"); // 获取元素 list.get(0); // 删除元素 list.remove(1); list.remove("c#"); // 重新咋删除的位置插入元素 list.add(1, "c++"); // 遍历集合 for (String str : list) { System.out.println(str); } }}
2、Queue集合
Queue用于模拟队列这种数据结构,队列数据“先进先出”,队列的头部保存在队列中时间最长的元素,队列的尾部保存在队列中时间最短的元素;新元素插入(offer)到队列的尾部,访问元素(poll)会返回队列头部的元素,队列不允许随机访问队列中的元素。
1 ) ArrayDeque类
双端队列,允许从两端操作队列的元素。
模拟栈数据结构(后进先出),使用push()方法插入数据,peek()方法用于获取第一个元素,pop()用于获取第一个元素并从栈中取出
代码示例:
public class ArrayDequeTest { public static void main(String[] args) { // 模拟栈数据 后进先出 ArrayDeque deque = new ArrayDeque(); // 插入数据 deque.push("java"); deque.push("xml"); deque.push("html"); // 获取第一个数据不删除 System.out.println(deque.peek()); System.out.println("栈中的数据:" + deque.toString()); //从栈中取出第一个数据并删除 System.out.println(deque.pop()); System.out.println("栈中的数据:" + deque.toString()); }}
结果是:
html栈中的数据:[java, xml, html]html栈中的数据:[java,xml]
模拟队列数据结构(先进先出),使用offer()方法插入数据,peek()方法用于获取队列头部元素,poll()获取头部元素并从队列中删除
代码示例:
public class ArrayDequeTest { public static void main(String[] args) { // 模拟队列数据 先进先出 ArrayDeque deque = new ArrayDeque(); // 插入数据 deque.offer("java"); deque.offer("xml"); deque.offer("html"); // 获取第一个数据不删除 System.out.println(deque.peek()); System.out.println("队列中的数据:" + deque.toString()); // 从队列中取出第一个数据并删除 System.out.println(deque.poll()); System.out.println("队列中的数据:" + deque.toString()); }}
结果是:
java栈中的数据:[java, xml, html]java栈中的数据:[xml, html]
2)LinkedList类
List接口的实现类,也实现了Deque接口,所以既可以通过索引随机访问元素,也可以当做双端队列和栈使用。
public class LinkedListTest { public static void main(String[] args) { LinkedList list = new LinkedList(); // list添加数据 list.add("list数据1"); list.add("list数据2"); list.add("list数据3"); // 遍历数据 for (int i = 0; i < list.size(); i++) { System.out.println("list数据:" + list.get(i)); } // 访问栈数据 System.out.println("栈第一个数据:" + list.peekFirst()); System.out.println("栈最后一个数据:" + list.peekLast()); // 取出栈数据 System.out.println(list.pop()); // 查询栈中数据 System.out.println("栈中的数据" + list.toString()); // 访问队列数据 System.out.println("队列第一个数据:" + list.peekFirst()); System.out.println("队列最后一个数据:" + list.peekLast()); // 取出队列第一个数据 System.out.println(list.poll()); // 查询队列中数据 System.out.println("队列中的数据" + list.toString()); }}
结果是
list数据:list数据1list数据:list数据2list数据:list数据3栈第一个数据:list数据1栈最后一个数据:list数据3list数据1栈中的数据[list数据2, list数据3]队列第一个数据:list数据2队列最后一个数据:list数据3list数据2队列中的数据[list数据3]
总结:遍历list集合时,对于ArrayList集合应使用随机访问方法(get)来遍历;LinkedList应使用迭代器(Iterator)来遍历,如果需要执行插入、删除操作来改变包含大量数据的集合,推荐使用LinkedList;多线程操作集合数据时,应使用Collections将集合包装成线程安全的集合