ArrayList & LinkedList
List接口常用类
ArrayList : 以数组方式来实现针对快速随机查询的需求,使用ArrayList执行效率较好(数组特性:便于索引快速定位对象位置)
LinkedList :双向链表存储,以链表方式来实现List接口进行插入删除等操作效率更高,适合用来实现Stack
(堆栈)和Queue
(队列)(链表特性:插入删除效率高)
Vector:与ArrayList相同,数组方式存储数据;由于使用与synchronized方法-线程安全,所以性能上比ArrayList要差
注: LinkedList的特有方法(本身定义的方法)如:addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等,若需要使用队列特性,由于LinkedList也实现了java.util.Queue接口,所以可以直接使用LinkedList的实例来实现
public class QueueDemo{
public static void main(String[] args){
//父类引用queue指向子类对象
Queue<String> queue = new LinkedList<String>();
queue.offer("Hello!");
queue.offer("hotch");
String ele = null;
while((ele=queue.poll())!=null)
System.out.println(ele+"\t");
}
}
Queue特性
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
在二叉树和图的遍历中需要借助队列实现非递归遍历方法
如:非递归方法实现层次遍历
public static void levelOrder(TreeNode node){
if (node==null) {
return;
}
//借助队列实现
Queue<TreeNode> queue = new LinkedList<TreeNode>();//java中队列(Queue)的用法:LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用
queue.offer(node);
while (!queue.isEmpty()){
TreeNode temp = queue.poll();//不推荐用add()和remove()
System.out.print(temp.val+" ");
if(temp.left != null)
queue.offer(temp.left);
if (temp.right != null)
queue.offer(temp.right);
}
}
数组(Array)和列表(ArrayList)的区别
- Array可以包含基本数据类型和对象类型,ArrayList只能包含对象类型
- Array大小是固定的,ArrayList的大小是动态变化的
- ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等
Queue常用方法
offer(E e)、add(E e)插入;poll()、remove()移除;peek()获取顶端元素
一般情况下建议使用offer()、poll()、peek()方法,因为可通过返回值判断操作成功与否,不建议使用add()和remove()方法。