代码

package com.hdwang;

import java.util.HashMap;
import java.util.Map; /**
* Created by hdwang on 2017/12/19.
*/
public class MyTemplate { public static void main(String[] args){ String template = "${name},${sex},${birthYear}年出生,${graduateYear}年毕业于${university}。";
Map<String,String> params = new HashMap<>();
params.put("name","张三");
params.put("sex","男");
params.put("birthYear","1990");
params.put("graduateYear","2012");
params.put("university","清华大学"); long start = System.currentTimeMillis(); for(int i=0;i<10000;i++) {
String result = render(template, params); if(i==9999) {
System.out.println(result);
}
}
long end = System.currentTimeMillis(); System.out.println("cost time:"+(end-start)+"ms"); start = System.currentTimeMillis();
for(int i=0;i<10000;i++) {
String result = render2(template, params); if(i==9999) {
System.out.println(result);
}
}
end = System.currentTimeMillis();
System.out.println("cost time:"+(end-start)+"ms"); } public static String render(String template,Map<String,String> params){
//使用builder拼接,比string相加提高不少效率
StringBuilder builder = new StringBuilder(); //定义控制变量
boolean $Begin = false;
boolean paramBegin = false;
//boolean paramEnd = false;
StringBuilder key = null; //循环匹配
for(int i=0;i<template.length();i++){
char c = template.charAt(i);
//开始标识
if(c=='$'){
$Begin = true;
}
if($Begin && c=='{'){
paramBegin = true;
builder.deleteCharAt(builder.length()-1); //删除添加的$字符 key = new StringBuilder();
continue;
} //参数key
if(paramBegin && c!='}'){
if(c=='{'){
System.out.println("模板格式错误!位置:"+i);
}else {
key.append(c);
}
continue;
} //结束标识
if(paramBegin && c=='}'){
//paramEnd = true;
//拼接参数key对应的值
builder.append(params.get(key.toString())); //重置控制变量
$Begin = false;
paramBegin = false;
//paramEnd = false;
continue;
} //默认情况
builder.append(c); //添加字符
} return builder.toString();
} public static String render2(String template,Map<String,String> params){
for(Map.Entry<String,String> entry:params.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
template = template.replace("${"+key+"}",value);
}
return template;
}
}

运行结果

张三,男,1990年出生,2012年毕业于清华大学。
cost time:65ms
张三,男,1990年出生,2012年毕业于清华大学。
cost time:161ms

Java实现的一个简单的模板渲染的更多相关文章

  1. 一个简单的模板引(han)擎(shu)

    自制一个简单的模板引(han)擎(shu) 原理 说大了 实际上是模板函数 原理呢就是简单的字符串替换 第一版 var data = { username: 'Muhha' } str = '< ...

  2. JAVA课程设计——一个简单的教务人事管理系统

    大三上学期期末总结,没错,上学期,写在下学期新学期开始,哈哈哈. 上学期学习了面向对象程序设计,课程设计的题目使用JAVA语言完成一个简单的教务人事管理系统,能够实现访问数据库的登录验证,分别按部门和 ...

  3. 使用JAVA实现的一个简单IOC注入实例

    https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...

  4. 使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能。并且在界面上有radio 的选择内容也要上传

    使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能.并且在界面上有radio 的选择内容也要上传 uploadify 插件的 下载和文档地址  ...

  5. Java RMI 实现一个简单的GFS(谷歌文件系统)——介绍篇

    本系列主要是使用Java RMI实现一个简单的GFS(谷歌文件系统,google file system),首先整体简单介绍下该项目. [为了更好的阅读以及查看其他篇章,请查看原文:https://w ...

  6. Java RMI 实现一个简单的GFS(谷歌文件系统)——背景与设计篇

    目录 背景 系统设计 1. 系统功能 2. Master组件 2.1 命名空间 2.2 心跳机制 2.3 故障恢复和容错机制 3. ChunkServer组件 3.1 本地存储 3.2 内存命中机制 ...

  7. Java Swing实现一个简单而优美的记事本( 较详细注释 )

    Java Swing实现具有基本功能的记事本 目前实现了: 文件 新建 打开 保存 退出前保存询问 编辑 剪切 复制 粘贴 清除 撤销 格式 字体选择 字体颜色选择 帮助 关于 (样式采用了css与h ...

  8. 【Java】 实现一个简单文件浏览器(1)

    学习Java的Swing的时候写的一个超简单文件浏览器 效果如图: 项目结构: 这里面主要用了两个控件,JTree和JTable 下面先说下左侧的文件树如何实现: 首先是FileTree类,继承于JT ...

  9. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

随机推荐

  1. VS新建一个模板工程

    新建一个模板工程的好处:    1.就不用每次都走一边新建向导了,新建工程一步到位. 2.可以往项目中每次都的输入的代码,如一些声明注释-- 效果图: 具体步骤: 1.自己先新建一个属于自己的工程. ...

  2. ZAB协议和Paxos算法

    前言在上一篇文章Paxos算法浅析中主要介绍了Paxos一致性算法应用的场景,以及对协议本身的介绍:Google Chubby是一个分布式锁服务,其底层一致性实现就是以Paxos算法为基础的:但这篇文 ...

  3. linux下如何解除被占用的端口号

    在本例中,假设8080端口被占用. 1.查看8080端口是否被占用: netstat -anp | grep 8080输出结果:tcp        0      0 :::8080         ...

  4. Flutter - 创建底部导航栏

    之前写过的一篇文章介绍了 Flutter - 创建横跨所有页面的侧滑菜单, 这次就一起来学习一下底部导航栏. 底部导航栏在ios平台上非常常见,app store就是这样的风格.还有就是大家最常用的微 ...

  5. sudo apt-get update 去除设置的代理

    今天想装个软件(wine),使用 sudo apt-get update 命令时,发现给出很多Ign 语句,总出现 Connecting to proxy.http://10.0.126.1:1312 ...

  6. C#图片处理(转zhjzwl/archive)

    基本原理: 获取每一个像素值,然后处理这些每一个像素值.   原始图片: ISINBAEVA ~~~~~~~~ 一. 底片效果 原理: GetPixel方法获得每一点像素的值, 然后再使用SetPix ...

  7. 【转载】kafka 基础知识

    1.       kafka介绍 1.1.       主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and ...

  8. Apache Ignite 学习笔记(一): Ignite介绍、部署安装和REST/SQL客户端使用

    Apache Ignite 介绍 Ignite是什么呢?先引用一段官网关于Ignite的描述: Ignite is memory-centric distributed database, cachi ...

  9. Todo&Rocket

    Todo是怎么实现的? 前面两篇博客分别介绍了MVC和Backbone.js的逻辑,但是实战获真知,在来一篇来显示下Todo是怎么通过Backbone.js连接起来的. 忽略掉所有的代码,我们只是打开 ...

  10. Daily Scrumming* 2015.12.10 今天集体请假一天

    今天由于所有成员均在进行编译原理实验的相关工作,全体请假一天.......