Java项目源码学习笔记(三):PathMatcher

先来看看内部类Node节点:

private static class Node{
	private HashMap<String, Node> mMap;
	private int mKind = NOT_FOUND;

	Node addChild(String segment){
		if(null == mMap){
			mMap = new HashMap<String, Node>();
		}else{
			Node node = mMap.get(segment);
			if(node != null)return node;
		}

		Node n = new Node();
		mMap.put(segment, n);
		return n;
	}

	Node getChild(String segment){
		if(mMap == null)return null;
		return mMap.get(segment);
	}

	void setKind(int kind){
		mKind = kind;
	}

	int getKind(){
		return mKind;
	}
}

 很显然,这是一个单向链表数据结构:

其中mMap中Node对象指向下一个Node对象。

import java.util.ArrayList;
import java.util.HashMap;

public class PathMatcher{	

	public static final int NOT_FOUND = -1;
	private ArrayList<String> mVariables = new ArrayList<String>();
	private Node mRoot = new Node();

	public PathMatcher(){
		mRoot = new Node();
	}

	public void add(String pattern, int kind){
		String[] segments = Path.split(pattern);
		Node current = mRoot;
		for(int i = 0; i < segments.length; i++){
			current = current.addChild(segments[i]);
		}
		current.setKind(kind);
	}

	public int match(Path path){
		String[] segments = path.split();
		mVariables.clear();
		Node current = mRoot;
		for(int i = 0; i < segments.length; i++){
			Node next = current.getChild(segments[i]);
			if(null == next){
				next = current.getChild("*");
				if(next != null){
					mVariables.add(segments[i]);
				}else{
					return NOT_FOUND;
				}
			}
			current = next;
		}
		return current.getKind();
	}

}

 add构建了根节点为mRoot的单向链表,之所以Node用HashMap保存链表的下一个节点,是因为mRoot一个根节点指向了很多单向链表分支。mKind是每一条单链表分支的key值,它赋给了最后一个节点。

Path string的最后一个segment是"*",匹配任何字符,同时由mVariables保存这一字符。

时间: 2024-08-25 01:05:53

Java项目源码学习笔记(三):PathMatcher的相关文章

Java项目源码学习笔记(二):Path

import java.lang.ref.WeakReference; import java.util.ArrayList; public class Path{ private static Path sRoot = new Path(null, "ROOT"); private final Path mParent; private final String mSegment; private WeakReference<Object> mObject; privat

Java项目源码学习笔记(一):IdentityCache

import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.Set; public class IdentityCache<K, V>{ private final HashMap<K, Entry<K,V>> mWeakMap = new Ha

Java集合源码学习笔记(二)ArrayList分析

Java集合源码学习笔记(二)ArrayList分析 >>关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫"ArrayList",因为ArrayList内部是用一个数组存储元素值,相当于一个可变大小的数组,也就是动态数组. (1)继承和实现继承了AbstractList,实现了List:ArrayList是一个数组队列,提供了相关的添加.删除.修

Java集合源码学习笔记(三)LinkedList分析

前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的一种常用数据结构LinkedList的实现,LinkedList使用链表作为存储结构,链表是线性存储结构,在内存上不是连续的一段空间,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N),链表的特点是寻址困难,插入和删除容易.所有的代码都基于JDK 1.6. >>关于LinkedLis

Java集合源码学习笔记(四)HashMap分析

ArrayList.LinkedList和HashMap的源码是一起看的,横向对比吧,感觉对这三种数据结构的理解加深了很多. >>数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景,数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易:哈希表的实现结合了这两点,哈希表的实现方式有多种,在HashMap中使用的是链地址法,也就是拉链法.看下面这张流传很广的图, 拉链法实际上是一种链表数组的结构,由数组加链表组成,在这个长度为16的数

yii2源码学习笔记(三)

组件(component),是Yii框架的基类,实现了属性.事件.行为三类功能,如果需要事件和行为的功能,需要继承该类. yii\base\Component代码详解 <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base;

Java多线程之JUC包:ReentrantReadWriteLock源码学习笔记

若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5634701.html ReentrantLock提供了标准的互斥操作,但在应用中,我们对一个资源的访问有两种方式:读和写,读操作一般不会影响数据的一致性问题.但如果我们使用ReentrantLock,则在需要在读操作的时候也独占锁,这会导致并发效率大大降低.JUC包提供了读写锁ReentrantReadWriteLock,使得读写锁分离,在上述情

Java多线程之JUC包:Semaphore源码学习笔记

若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC包提供的一个共享锁,一般称之为信号量. Semaphore通过自定义的同步器维护了一个或多个共享资源,线程通过调用acquire获取共享资源,通过调用release释放. 源代码: /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to lic

Java多线程之JUC包:ReentrantLock源码学习笔记

若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5627539.html ReentrantLock是JUC包提供的一种可重入独占锁,它实现了Lock接口.与Semaphore类似,ReentrantLock也提供了两种工作模式:公平模式&非公平模式,也是通过自定义两种同步器FairSync&NonfairSync来实现的. 源代码: /* * ORACLE PROPRIETARY/CONF