下面是一个关于表达式验证的测试代码, 令人出乎意料的是以栈方式检验检查表达式的开销要远远超出于以查找方式对表达式进行检查.
是否JVM对String类的所有接口作了强化?特此附上代码,期待大虾解释其原因.
测试代码:
@RunWith(Parameterized.class)
public class ExpressionValidatorTest {
private ExpressionValidator validator;
public ExpressionValidatorTest(ExpressionValidator validator) {
this.validator = validator;
}
@Parameters
public static Collection<Object[]> parameters() {
return Arrays.asList(
new Object[]{new StackBasedExpressionValidator()},
new Object[]{new SearchBasedExpressionValidator()}
);
}
@Test
public void plainText() throws Exception {
assertTrue(validator.validate("abc"));
}
@Test
public void leftBraceOnly() throws Exception {
assertFalse(validator.validate("{abc"));
}
@Test
public void rightBraceOnly() throws Exception {
assertFalse(validator.validate("abc}"));
}
@Test
public void simpleExpression() throws Exception {
assertTrue(validator.validate("{abc}"));
}
@Test
public void nestedBraces() throws Exception {
assertFalse(validator.validate("{{abc}}"));
}
@Test
public void antisymmetryBraces() throws Exception {
assertFalse(validator.validate("}abc{"));
}
@Test
public void badExpression() throws Exception {
assertFalse(validator.validate("{abc}}"));
assertFalse(validator.validate("{{abc}"));
}
@Test
public void mixedExpression() throws Exception {
assertTrue(validator.validate("{abc} and {efg}"));
}
@Ignore
@Test(timeout = 5000)
public void hugeExpression() throws Exception {
StringBuilder expressionBuilder = new StringBuilder();
for (int k = 0; k < 100000; k++)
expressionBuilder.append("{username} and {password}");
assertTrue(validator.validate(expressionBuilder.toString()));
}
}
Java代码:
public interface ExpressionValidator {
char START_EL = '{';
char END_EL = '}';
boolean validate(String expression);
}
public class SearchBasedExpressionValidator
implements ExpressionValidator {
public boolean validate(String expression) {
int leftPos = 0;
int prevRightPos = 0;
while (true) {
leftPos = expression.indexOf(START_EL, leftPos);
int rightPos = expression.indexOf(END_EL, prevRightPos);
if (notFound(leftPos))
return notFound(rightPos);
if (notFound(rightPos) ||
!between(leftPos, prevRightPos, rightPos))
return false;
leftPos = leftPos + 1;
prevRightPos = rightPos + 1;
}
}
private boolean notFound(int leftPos) {
return leftPos < 0;
}
private boolean between(int target, int x, int y) {
return notAfter(x, target) && notAfter(target, y);
}
private boolean notAfter(int x, int y) {
return x <= y;
}
}
public class StackBasedExpressionValidator
implements ExpressionValidator {
public static final boolean POP = false;
public static final boolean PUSH = true;
public boolean validate(String expression) {
boolean state = POP;
char[] chars = expression.toCharArray();
int length = chars.length;
int k = 0;
do {
switch (chars[k]) {
case START_EL:
if (isPushed(state))
return false;
state = PUSH;
break;
case END_EL:
if (isPopup(state))
return false;
state = POP;
break;
}
} while (++k < length);
return isPopup(state);
}
private boolean isPushed(boolean state) {
return state==PUSH;
}
private boolean isPopup(boolean state) {
return state==POP;
}
}
分享到:
相关推荐
### TDD+MISO系统中波束成形的性能分析 #### 概述 本文针对时分双工(Time Division Duplexing, ...此外,通过数值仿真验证了理论分析的正确性,这为进一步优化TDD+MISO系统中的波束成形技术提供了重要的参考依据。
《深入理解ExpSolverNet:基于System.Linq.Expressions的C#表达式编译器》 ExpSolverNet是一个使用C#语言,并基于.NET Framework中的System.Linq.Expressions库编写的开源项目,它的核心功能是将用户提供的任意...
- **测试驱动开发**:鼓励采用TDD(Test-Driven Development)的方法进行开发。 #### 总结 本开发平台基于先进的J2EE技术,利用Spring、Struts2、Hibernate等开源框架构建了一个高度集成的开发环境。通过以上各...
- **数值验证**:通过数值仿真,验证了新MSE表达式的正确性和有效性,同时也证明了所提出的减少导频污染方案的有效性。 #### 减少导频污染的方案 针对导频污染问题,研究人员提出了一种基于基站间简单协作的解决...
发送端Alice和Charlie与用户之间信道信息非完美,参考在TDD系统中被广泛应用的高斯不确定信道模型,则Alice与两个用户之间的实际信道可以被表示为: hak=hak˜+eakk∈{1,2} 式中,hak˜,k∈{1,2}表示Alice与用户...
这可能包括加减乘除等基本运算,以及可能处理括号、优先级和其他更复杂的表达式。 基于提供的标签 "Java",我们可以知道这个项目是使用Java编程语言来完成的。Java是一种广泛使用的面向对象的语言,以其“一次编写...
此外,还推导出了包含AP分簇、协作缓存及区域流行度等因素在内的内容传输时延表达式,并以传输时延为优化目标建立了缓存优化问题。通过理论分析和仿真验证,该策略被证明能够在保持较低的传输时延的同时提高缓存命中...
为了将其转换为十进制数48879我们需要应用以下简单算法: 可以使用以下正则表达式验证十六进制数: /^[0-9A-Fa-f]+$/g 对于序列中的每个数字,我们必须将数字转换为十进制版本将该数字乘以 16 的序列中基于 0 的...
在Spring项目中,开发者经常使用TestNG进行测试驱动开发(TDD)和行为驱动开发(BDD)。 2. **net.sourceforge.serp**: SERP(Serpent)是一个Java库,实现了对Perl5正则表达式的解析和模拟。在Spring中,可能会...
【TDDREGEX项目】是一个基于Java编程语言的项目,主要关注的是Test-Driven Development(TDD,测试驱动开发)和正则表达式(Regex)的结合应用。在这个项目中,开发者遵循TDD的原则,先编写测试用例,然后根据这些...
6. **验证机制**:ASP.NET MVC 3.0包含一套强大的客户端和服务器端验证机制,允许开发者轻松添加验证规则到模型属性,并自动在视图中生成相应的验证提示。 7. **单元测试和TDD**:MVC 3.0支持测试驱动开发(TDD),...
4. 使用ASP.NET身份验证和授权机制,包括Forms身份验证、Windows身份验证和基于角色的授权。 5. 学习状态管理,包括视图状态、隐藏字段、Cookie、Session状态以及应用状态的优缺点和使用场景。 6. 实现高效的数据...
4. **C#语言特性**:由于ASP.NET主要使用C#作为编程语言,所以对C#的基础语法、面向对象特性、Lambda表达式、LINQ等高级特性需要有扎实的理解。 5. **ADO.NET与Entity Framework**:掌握数据库访问技术,包括ADO...
Moq框架以其简洁的API和强大的功能,成为.NET开发者进行测试驱动开发(TDD)或行为驱动开发(BDD)的重要工具。 **Moq框架的基本概念** 1. **模拟(Mocking)**:模拟是创建一个对象来模拟另一个对象的行为,通常在...
通过这个项目,开发者不仅可以深入理解Clojure语言,还能掌握类型检查、数据验证以及表达式解析等核心编程技能,这对于提升在IT行业的专业素养具有很大的帮助。同时,这个项目也可以作为一个示例,帮助其他开发者...
《Type-Driven Development with Idris》这本书由Edwin Brady撰写,旨在介绍一种基于类型的软件开发方法,这种方法使用Idris编程语言来实现。Idris是一种功能强大的静态类型编程语言,支持依赖类型、纯函数式编程...
MVC模式更符合敏捷开发和TDD(测试驱动开发)的理念。 9. **ASP.NET Identity** 这是ASP.NET内置的身份验证系统,用于用户注册、登录、密码恢复等功能,与OAuth和OpenID Connect集成,提供安全的用户认证。 10. *...
例如,`assertEquals`方法用于比较两个值是否相等,`assertTrue`或`assertFalse`则用于判断布尔表达式是否为真或假。除此之外,JUnit还提供了丰富的异常处理和测试套件管理功能,可以组织多个测试类一起运行。 除了...