我选择HashSet和LinkedList来保存待访问URL和已访问的URL。
package com.js.demo01;
/**
* 队列用于保存待爬取的URL
*/
import java.util.LinkedList;
public class Queue {
private LinkedList<Object> queue = new LinkedList<Object>();
/**
* 入队列
* @param t 待进入队列的URL
* @return void 无返回值
*/
public void enQueue(Object t){
queue.addLast(t);
}
/**
* 出队列
* @return 本次出队列的URL
*/
public Object deQueue(){
return queue.removeFirst();
}
/**
* 判断队列是否为空
* @return 返回判断结果 true为空
*/
public boolean isQueueEmpty(){
return queue.isEmpty();
}
/**
* 判断队列是否包含
* @param t 待判断是否包含的对象t
* @return 返回判断结果 true为包含
*/
public boolean contains(Object t) {
return queue.contains(t);
}
/**
* 清空队列
* @return 返回队列是否为空的判断结果
*/
public boolean empty(){
return queue.isEmpty();
}
}
package com.js.demo01;
import java.util.HashSet;
import java.util.Set;
/**
* HashSet用于记录已爬取的URL
* @author js
*
*/
public class LinkQueue {
//已访问的URL集合
private static Set<Object> visitedUrl = new HashSet<Object>();
//待访问的URL集合
private static Queue unVisitedUrl = new Queue();
//获得URL队列
public static Queue getUnVisitedUrl(){
return unVisitedUrl;
}
//添加到访问过的URL队列中
public static void addVisitedUrl(String url){
visitedUrl.add(url);
}
//移除访问过的URL
public static void removeVisitedUrl(String url){
visitedUrl.remove(url);
}
//未访问过的URL出列
public static Object unVisitedUrlDeQueue(){
return unVisitedUrl.deQueue();
}
//保证每个URL只被访问一次
public static void addUnvisitedUrl(String url){
if(url!=null&&url.trim().equals("")&&!visitedUrl.contains(url)&&!unVisitedUrl.contains(url))
unVisitedUrl.enQueue(url);
}
//获得已访问的URL数目
public static int getVisitedUrlNum(){
return visitedUrl.size();
}
//判断未访问的URl队列中是否为空
public static boolean unVisitedurlsEmpty(){
return unVisitedUrl.empty();
}
}