tomcat 七 源码分析-12 Enumeration枚举
tomcat 7 源码分析-12 Enumeration枚举tomcat 7 源码分析-12 Enumeration枚举?Enumeration枚举,就是要把内
tomcat 7 源码分析-12 Enumeration枚举
tomcat 7 源码分析-12 Enumeration枚举
?
Enumeration枚举,就是要把内容没有重复的遍历,而且不破坏原有的存储空间。在http headers的实现中,tomcat实现了一些枚举类。
Enumerate the distinct header names. Each nextElement() is O(n)
?

class NamesEnumerator implements Enumeration<String> { int pos; int size; String next; MimeHeaders headers; public NamesEnumerator(MimeHeaders headers) { this.headers=headers; pos=0; size = headers.size(); findNext(); } private void findNext() { next=null; for( ; pos< size; pos++ ) { next=headers.getName( pos ).toString(); for( int j=0; j<pos ; j++ ) { if( headers.getName( j ).equalsIgnoreCase( next )) { // duplicate. next=null; break; } } if( next!=null ) { // it's not a duplicate break; } } // next time findNext is called it will try the // next element pos++; } public boolean hasMoreElements() { return next!=null; } public String nextElement() { String current=next; findNext(); return current; }}?Enumeration的核心是findNext函数,实现了找到下一个元素的功能,保障与之前的不重复。
简单分析findNext的算法:
pos就表示next的位置,如果在循环pos前面的元素时,发现有重复的,就把next=null,跳出循环后,判断是否为null。
如果next为null,外边的循环仍然继续,pos后移,此举就是跳出有重复的元素。
如果next不等于null,说明此pos的元素与之前不重复,next即是下一个元素。整个循环结束。
最后pos++,为下一个next做准备。
?
类似的写了个队char的枚举类,验证了下算法

package com.test.Enumerator;import java.util.Enumeration;public class CharEnumeration implements Enumeration<Character> {Character next;Character characters[];int pos;int size;CharEnumeration(Character a[]) {characters = a;size = a.length;pos = 0;findNext();}@Overridepublic boolean hasMoreElements() {// TODO Auto-generated method stubreturn next != null;}private void findNext() {next = null;for (; pos < size; pos++) {next = characters[pos];for (int i = 0; i < pos; i++) {if (next == characters[i]) {next = null;break;}}if (next != null)break;}pos++;}@Overridepublic Character nextElement() {// TODO Auto-generated method stubCharacter cur = next;findNext();return cur;}public void PrintAll() {while (hasMoreElements()) {System.out.println(nextElement());}}}?
package com.test.Enumerator;public class EnumeratorTest {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubCharacter [] sample = {'a','b','c','d','e','a','a','b'};CharEnumeration che = new CharEnumeration(sample);che.PrintAll();}}??