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;
- }
- }
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();
- }
- @Override
- public boolean hasMoreElements() {
- // TODO Auto-generated method stub
- return 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++;
- }
- @Override
- public Character nextElement() {
- // TODO Auto-generated method stub
- Character cur = next;
- findNext();
- return cur;
- }
- public void PrintAll() {
- while (hasMoreElements()) {
- System.out.println(nextElement());
- }
- }
- }
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();
}
@Override
public boolean hasMoreElements() {
// TODO Auto-generated method stub
return 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++;
}
@Override
public Character nextElement() {
// TODO Auto-generated method stub
Character 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 stub
- Character [] sample = {'a' , 'b' , 'c' , 'd' , 'e' , 'a' , 'a' , 'b' };
- CharEnumeration che = new CharEnumeration(sample);
- che.PrintAll();
- }
- }
package com.test.Enumerator;
public class EnumeratorTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Character [] sample = {'a','b','c','d','e','a','a','b'};
CharEnumeration che = new CharEnumeration(sample);
che.PrintAll();
}
}