List集合
Llist集合元素有序可重复,并且可以根据索引查找元素,List判断两个元素是否相等是通过对象的equals()方法是否相等
1、ArrayList
ArrayList类内部封装了一个动态的、允许在分配的Object[]数组,如果添加元素超过数组长度时,initialCapacity会自动增加,默认长度为10,需要添加大量元素时,可以通过ensureCapacity(int initialCapacity)方法一次性增加长度,减少重分配得次数,提高性能。
使用示例代码
public class ArrayListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
// 添加元素
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数据1
list数据:list数据2
list数据:list数据3
栈第一个数据:list数据1
栈最后一个数据:list数据3
list数据1
栈中的数据[list数据2, list数据3]
队列第一个数据:list数据2
队列最后一个数据:list数据3
list数据2
队列中的数据[list数据3]
总结:遍历list集合时,对于ArrayList集合应使用随机访问方法(get)来遍历;LinkedList应使用迭代器(Iterator)来遍历,如果需要执行插入、删除操作来改变包含大量数据的集合,推荐使用LinkedList;多线程操作集合数据时,应使用Collections将集合包装成线程安全的集合