`
zhaohaolin
  • 浏览: 1012296 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

tomcat 7 源码分析-12 Enumeration枚举

阅读更多

tomcat 7 源码分析-12 Enumeration枚举

 

Enumeration枚举,就是要把内容没有重复的遍历,而且不破坏原有的存储空间。在http headers的实现中,tomcat实现了一些枚举类。

Enumerate the distinct header names. Each nextElement() is O(n)

 

Java代码  收藏代码
  1. class  NamesEnumerator  implements  Enumeration<String> {  
  2.     int  pos;  
  3.     int  size;  
  4.     String next;  
  5.     MimeHeaders headers;  
  6.   
  7.     public  NamesEnumerator(MimeHeaders headers) {  
  8.         this .headers=headers;  
  9.         pos=0 ;  
  10.         size = headers.size();  
  11.         findNext();  
  12.     }  
  13.   
  14.     private   void  findNext() {  
  15.         next=null ;  
  16.         for (  ; pos< size; pos++ ) {  
  17.             next=headers.getName( pos ).toString();  
  18.             for int  j= 0 ; j<pos ; j++ ) {  
  19.                 if ( headers.getName( j ).equalsIgnoreCase( next )) {  
  20.                     // duplicate.   
  21.                     next=null ;  
  22.                     break ;  
  23.                 }  
  24.             }  
  25.             if ( next!= null  ) {  
  26.                 // it's not a duplicate   
  27.                 break ;  
  28.             }  
  29.         }  
  30.         // next time findNext is called it will try the   
  31.         // next element   
  32.         pos++;  
  33.     }  
  34.       
  35.     public   boolean  hasMoreElements() {  
  36.         return  next!= null ;  
  37.     }  
  38.   
  39.     public  String nextElement() {  
  40.         String current=next;  
  41.         findNext();  
  42.         return  current;  
  43.     }  
  44. }  
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代码  收藏代码
  1. package  com.test.Enumerator;  
  2.   
  3. import  java.util.Enumeration;  
  4.   
  5. public   class  CharEnumeration  implements  Enumeration<Character> {  
  6.   
  7.     Character next;  
  8.     Character characters[];  
  9.     int  pos;  
  10.     int  size;  
  11.   
  12.     CharEnumeration(Character a[]) {  
  13.   
  14.         characters = a;  
  15.         size = a.length;  
  16.         pos = 0 ;  
  17.         findNext();  
  18.     }  
  19.   
  20.     @Override   
  21.     public   boolean  hasMoreElements() {  
  22.         // TODO Auto-generated method stub   
  23.         return  next !=  null ;  
  24.     }  
  25.   
  26.     private   void  findNext() {  
  27.         next = null ;  
  28.   
  29.         for  (; pos < size; pos++) {  
  30.   
  31.             next = characters[pos];  
  32.             for  ( int  i =  0 ; i < pos; i++) {  
  33.   
  34.                 if  (next == characters[i]) {  
  35.                     next = null ;  
  36.                     break ;  
  37.                 }  
  38.             }  
  39.   
  40.             if  (next !=  null )  
  41.                 break ;  
  42.         }  
  43.         pos++;  
  44.     }  
  45.   
  46.     @Override   
  47.     public  Character nextElement() {  
  48.         // TODO Auto-generated method stub         
  49.         Character cur = next;  
  50.         findNext();  
  51.         return  cur;  
  52.     }  
  53.   
  54.     public   void  PrintAll() {  
  55.   
  56.         while  (hasMoreElements()) {  
  57.               
  58.             System.out.println(nextElement());  
  59.         }  
  60.     }  
  61.   
  62. }  
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());
		}
	}

}
 
Java代码  收藏代码
  1. package  com.test.Enumerator;  
  2. public   class  EnumeratorTest {  
  3.   
  4.     /**  
  5.      * @param args  
  6.      */   
  7.     public   static   void  main(String[] args) {  
  8.         // TODO Auto-generated method stub   
  9.   
  10.         Character [] sample = {'a' , 'b' , 'c' , 'd' , 'e' , 'a' , 'a' , 'b' };  
  11.         CharEnumeration che = new  CharEnumeration(sample);  
  12.         che.PrintAll();  
  13.     }  
  14.   
  15. }  
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();
	}

}
 

 

分享到:
评论

相关推荐

    Access-based Enumeration for sever 2003.zip

    Access-based Enumeration(基于访问权限的枚举)是Windows操作系统中的一项功能,特别是在Windows Server 2003中引入,用于改善文件服务器的用户体验。这项功能允许用户只看到他们有权限访问的文件和文件夹,而不是...

    linux-smart-enumeration:Linux枚举工具,用于具有详细级别的渗透测试和CTF

    首先,几个有用的oneliners;... 用于渗透测试和CTFLinux枚举工具 该项目的灵感来自并使用了许多测试。 不像LINENUM, lse尝试gradualy揭露根据其重要性从一个privesc点的信息。 它是什么? 该She

    linux-smart-enumeration-master.zip

    linux-smart-enumeration-master.zip

    实例179 - 高效的枚举元素组合

    首先,枚举(Enumeration)是一种在编程语言中表示固定数量的常量集合的数据类型。在Java、C#等语言中,枚举提供了方便的方式来定义一组相关的常量,通常用于表示特定的值或状态。例如,我们可以创建一个表示颜色的...

    The-PS-enumeration-process-3.2.zip_The Process_列举进程

    "The-PS-enumeration-process-3.2.zip_The Process_列举进程"是一个与进程管理相关的项目,其目标是通过源码实现对系统中进程的枚举,即查找并列出所有正在运行的进程。在Windows系统中,这种功能通常由任务管理器...

    Java 实例 - 使用 Enumeration 遍历 HashTable源代码+详细指导教程.zip

    `Enumeration`在Java早期版本中用于迭代容器中的元素,虽然在Java集合框架的后续版本中被迭代器(Iterator)所取代,但在处理`HashTable`时,`Enumeration`仍然是首选工具。 `HashTable`的主要特点包括线程安全(即...

    实例180 - 高效的枚举元素映射

    标签“源码”和“工具”表明这篇博客可能分析了某个开源工具或框架中枚举的实现方式,并提供了相关的代码示例。 在实际开发中,枚举的映射通常涉及到将枚举值与对应的业务逻辑、数据或配置关联起来。例如,一个状态...

    Process--thread-enumeration.rar_delphi thread_delphi枚举进程_进程的线程

    本文将深入探讨如何在Delphi中进行进程和线程的枚举,以及如何利用窗体组件调用例程来实现相关功能。 首先,我们要理解进程与线程的基本概念。进程是程序在内存中的运行实例,它拥有独立的资源,如内存空间、文件...

    ios-KVO和枚举的简单理解和使用,仅作学习参考.zip

    ### 枚举(Enumeration) 枚举是编程语言中用来定义一组相关的常量的类型。在Objective-C中,我们使用`enum`关键字创建枚举类型;而在Swift中,枚举更加强大,支持关联值、案列方法和原始值等特性。 #### 枚举的...

    day18-xml、枚举和注解.zip

    枚举(Enumeration)是Java中的一个特性,它允许我们创建一组预定义的常量。枚举类型可以看作是一种特殊的类,包含一组固定的实例,这些实例在编译时就已经确定。枚举提高了代码的可读性和安全性,因为枚举值只能是...

    cgs-enumeration:枚举分布式计算的一致全局状态的算法

    cgs枚举枚举分布式计算的一致全局状态的算法。 ===第一次运行=== ant的defalt目标将使用poset:d-100编译并运行程序。 ===使用不同的设置运行=== 编译代码后,使用“ ant run”执行程序。 命令“ ant run”可以采用...

    XML应用开发(软件品牌)-1期 3.6 案例分析-简单类型-限定枚举约束和模式约束.doc

    在本案例中,我们将探讨如何利用 XML Schema 的简单类型来实现枚举约束(enumeration constraint)和模式约束(pattern constraint)。 1. 枚举约束(enumeration constraint) 枚举约束允许我们限制 XML 元素的...

    Java软件开发实战 Java基础与案例开发详解 9-7 枚举 共10页.pdf

    ### 枚举(Enumeration)知识点总结 #### 一、枚举的概念及意义 枚举是Java 5中引入的一种新特性,它允许开发者定义一种特殊类型的类,用于表示一组固定的常量值。枚举类型提供了类型安全的方式,确保变量只能被...

    USB枚举过程 USB Enumeration

    USB枚举(USB Enumeration)是USB设备接入系统时的一个关键步骤,它允许主机识别和配置新连接的USB设备。枚举过程确保了设备能够与系统正确交互,从而实现数据传输和功能启用。 #### 枚举过程的重要性 USB枚举过程...

    Linux提权信息收集工具-linux-smart-enumeration

    信息收集工作整合成自动化脚本。该工具也是纯bash脚本,通用性较好,与LinPEAS类似,但收集的信息不如LinPEAS全面,但会关注一些LinPEAS没有关注到的信息,二者可结合使用,保证提权信息的全面性,防止遗漏。

    swift代码-class类和Enumeration枚举的使用

    在Swift编程语言中,`Class`和`Enumeration`(枚举)是两种基本的类型,它们在构建复杂的软件结构中起着至关重要的作用。本篇将深入探讨如何在Swift中使用这两种核心概念。 首先,我们来看`Class`。在面向对象编程中...

    Java源码查看枚举类型定义.rar

    在Java编程语言中,枚举(Enumeration)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int值更方便,因为枚举提供了更强的类型安全性和更好的可读性。本资源"Java源码查看枚举类型定义.rar...

    windows-enumeration:Windows枚举脚本

    Windows枚举 Powershell特权升级枚举脚本。 用法 运行快速标准检查。 .\WindowsEnum.ps1 直接来自CMD powershell -nologo -executionpolicy bypass -file WindowsEnum.ps1 扩展检查将搜索配置文件,各种有趣的...

    易语言源码易语言枚举托盘图标源码.rar

    在编程中,枚举(Enumeration)通常指的是遍历或列举出某个集合中的所有元素。在这个上下文中,枚举托盘图标意味着程序会逐一获取并处理任务栏通知区域(也称为系统托盘)中的所有图标。这些图标通常是系统服务、...

    大学课程讲义-Java基础-枚举&注解.pptx

    Java 中的枚举(enumeration)是一种特殊的数据类型,它可以表示有限的、固定的常量集。枚举类是一种特殊的类,它的对象是有限的、固定的和不可变的。 枚举的定义 在 Java 中,可以使用两种方式来定义枚举:手动...

Global site tag (gtag.js) - Google Analytics