设为首页 收藏本站
查看: 1049|回复: 0

[经验分享] tomcat 7 源码分析-12 Enumeration枚举

[复制链接]

尚未签到

发表于 2017-1-31 11:53:01 | 显示全部楼层 |阅读模式

tomcat 7 源码分析-12 Enumeration枚举

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

Java代码   DSC0000.png DSC0001.gif






  • 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的枚举类,验证了下算法

Java代码  






  • 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) {  


  •                     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) {
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());
}
}
}
 
Java代码  






  • 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();
}
}
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335697-1-1.html 上篇帖子: 解决Tomcat Too Many Open Files问题 下篇帖子: php+mysl+tomcat环境搭建手册
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表