项目系统中打印功能,导出 word 文档功能是挺常用的,本文介绍自定文档模板,程序实现模板内容中值替代的功能。

模板文件 template.docx

执行 main

public static void main(String[] args) {
//模板文档路径
String filePath = "D:/DOC/template.docx";
String res = String.valueOf(new Date().getTime());
//生成文档路径
String outFile = "D:/DOC/插入值后文档" + res + ".docx";
try {
GeneralTemplateTool gtt = new GeneralTemplateTool(); Map<String, Object> params = new HashMap<String, Object>();
//创建替代模板里段落中如${title}值开始
params.put("title","标题文字 by Stephen" );
params.put("Tab1Title","表一");
params.put("Tab2Title","表二");
//......对应模板扩展
//创建替代模板里段落中如${title}值结束 //创建替代&生成模板里tab1标识的表格中的值开始
List<Map<String,String>> tab1list = new ArrayList<Map<String,String>>();
for (int i = 1; i <= 3; i++) {
Map<String, String> map = new HashMap<String, String>();
map.put("name", "张" + i);
map.put("age", "1" + i);
map.put("sex", "男");
map.put("job", "职业"+i);
map.put("hobby", "爱好"+i);
map.put("phone", "1312365322"+i);
tab1list.add(map);
}
params.put("tab1", tab1list);
//创建替代&生成模板里tab1标识的表格中的值结束 //创建替代&生成模板里tab2标识的表格中的值开始
List<Map<String,String>> tab2list = new ArrayList<Map<String,String>>();
for (int i = 1; i <= 3; i++) {
Map<String, String> map = new HashMap<String, String>();
map.put("name", "王" + i);
map.put("age", "1" + i);
map.put("sex", "女");
map.put("job", "职业"+i);
tab2list.add(map);
}
params.put("tab2", tab2list);
//创建替代&生成模板里tab2标识的表格中的值结束 //创建替代&生成模板里tab3标识的表格中的值开始
List<Map<String,String>> tab3list = new ArrayList<Map<String,String>>();
for (int i = 1; i <= 4; i++) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "a列值" + i);
map.put("b", "b列值" + i);
map.put("c", "c列值" + i);
tab3list.add(map);
}
params.put("tab3", tab3list);
//创建替代&生成模板里tab3标识的表格中的值结束
//......对应模板扩展 gtt.templateWrite(filePath, outFile, params);
System.out.println("生成模板成功");
System.out.println(outFile);
} catch (Exception e) {
System.out.println("生成模板失败");
e.printStackTrace();
}
}

后台打印日志

-------解析出第 1 个表------开始处理
###表标识值:tab1
----${tab1}
----姓名
第1列:${name}
第2列:${age}
第3列:${sex}
第4列:${job}
第5列:${hobby}
第6列:${phone}
开始复制第0行
${name}
第1列:张1
${age}
第2列:11
${sex}
第3列:男
${job}
第4列:职业1
${hobby}
第5列:爱好1
${phone}
第6列:13123653221
开始复制第1行
${name}
第1列:张2
${age}
第2列:12
${sex}
第3列:男
${job}
第4列:职业2
${hobby}
第5列:爱好2
${phone}
第6列:13123653222
开始复制第2行
${name}
第1列:张3
${age}
第2列:13
${sex}
第3列:男
${job}
第4列:职业3
${hobby}
第5列:爱好3
${phone}
第6列:13123653223
-------解析出第 1 个表------结束处理
-------解析出第 2 个表------开始处理
###表标识值:tab2
----${tab2}
----姓名
第1列:${name}
第2列:${age}
第3列:${sex}
第4列:${job}
开始复制第0行
${name}
第1列:王1
${age}
第2列:11
${sex}
第3列:女
${job}
第4列:职业1
开始复制第1行
${name}
第1列:王2
${age}
第2列:12
${sex}
第3列:女
${job}
第4列:职业2
开始复制第2行
${name}
第1列:王3
${age}
第2列:13
${sex}
第3列:女
${job}
第4列:职业3
-------解析出第 2 个表------结束处理
-------解析出第 3 个表------开始处理
###表标识值:tab3
----${tab3}
----a
----列
第1列:${a}
第2列:${b}
第3列:${c}
开始复制第0行
${a}
第1列:a列值1
${b}
第2列:b列值1
${c}
第3列:c列值1
开始复制第1行
${a}
第1列:a列值2
${b}
第2列:b列值2
${c}
第3列:c列值2
开始复制第2行
${a}
第1列:a列值3
${b}
第2列:b列值3
${c}
第3列:c列值3
开始复制第3行
${a}
第1列:a列值4
${b}
第2列:b列值4
${c}
第3列:c列值4
-------解析出第 3 个表------结束处理
生成模板成功
D:/DOC/插入值后文档1558313967002.docx

程序执行完生成新的文档

查看效果:值被动态加入,格式保留。

具体实现代码:

/**
* 用一个docx文档作为模板,程序替换其中的内容,再写入目标文档中。
* @param filePath
* @param outFile
* @param params
* @throws Exception
*/
public void templateWrite(String filePath, String outFile,
Map<String, Object> params) throws Exception {
InputStream is = new FileInputStream(filePath);
//System.out.println(filePath);
XWPFDocument doc = new XWPFDocument(is);
// 替换段落里面的变量
this.replaceInPara(doc, params);
// 替换多个表格里面的变量并插入数据
this.insertValueToTables(doc, params);
OutputStream os = new FileOutputStream(outFile);
doc.write(os);
this.close(os);
this.close(is);
} /**
* 替换段落里面的变量
*
* @param doc
* 要替换的文档
* @param params
* 参数
*/
private void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = iterator.next();
this.replaceInPara(para, params);
}
} /**
* 替换段落里面的变量
*
* @param para
* 要替换的段落
* @param params
* 参数
*/
private boolean replaceInPara(XWPFParagraph para, Map<String, Object> params) {
boolean data = false;
List<XWPFRun> runs;
Matcher matcher;
if (this.matcher(para.getParagraphText()).find()) {
runs = para.getRuns();
for (int i = 0; i < runs.size(); i++) {
XWPFRun run = runs.get(i);
String runText = run.toString();
matcher = this.matcher(runText);
if (matcher.find()) {
while ((matcher = this.matcher(runText)).find()) {
String str=String.valueOf(params.get(matcher.group(1)));
//System.out.println("----"+runText);
//System.out.println("----"+str);
runText = matcher.replaceFirst(str);
}
Boolean isBold = run.isBold();
Boolean isItalic = run.isItalic();
Boolean isStrike = run.isStrike();
UnderlinePatterns Underline = run.getUnderline();
String Color = run.getColor();
int TextPosition = run.getTextPosition();
int FontSize = run.getFontSize();
String FontFamily = run.getFontFamily();
CTR ctr =run.getCTR();
para.removeRun(i);
//para.insertNewRun(i).setText(runText);
XWPFRun newrun = para.insertNewRun(i);
newrun.setText(runText);
try {
// 复制格式
newrun.setBold(isBold);
newrun.setItalic(isItalic);
newrun.setStrike(isStrike);
newrun.setUnderline(Underline);
newrun.setColor(Color);
newrun.setTextPosition(TextPosition);
if (FontSize != -1) {
newrun.setFontSize(FontSize);
CTRPr rpr = newrun.getCTR().isSetRPr() ? newrun.getCTR().getRPr() : newrun.getCTR().addNewRPr();
CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
fonts.setAscii(FontFamily);
fonts.setEastAsia(FontFamily);
fonts.setHAnsi(FontFamily);
}
if (FontFamily != null) {
newrun.setFontFamily(FontFamily);
}
if (ctr != null) {
Boolean flat = false;
try {
flat = ctr.isSetRPr();
} catch (Exception e) {
}
if (flat) {
CTRPr tmpRPr = ctr.getRPr();
if (tmpRPr.isSetRFonts()) {
CTFonts tmpFonts = tmpRPr.getRFonts();
CTRPr cellRPr = newrun.getCTR().isSetRPr() ? newrun
.getCTR().getRPr() : newrun
.getCTR().addNewRPr();
CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr
.getRFonts() : cellRPr
.addNewRFonts();
cellFonts.setAscii(tmpFonts.getAscii());
cellFonts.setAsciiTheme(tmpFonts
.getAsciiTheme());
cellFonts.setCs(tmpFonts.getCs());
cellFonts.setCstheme(tmpFonts.getCstheme());
cellFonts.setEastAsia(tmpFonts
.getEastAsia());
cellFonts.setEastAsiaTheme(tmpFonts
.getEastAsiaTheme());
cellFonts.setHAnsi(tmpFonts.getHAnsi());
cellFonts.setHAnsiTheme(tmpFonts
.getHAnsiTheme());
}
}
}
} catch (Exception e) {
e.printStackTrace();
} }
}
data = true;
} else if (this.matcherRow(para.getParagraphText())) {
runs = para.getRuns();
// System.out.println("run " + runs);
data = true;
}
return data;
} /**
* 按模版行样式填充数据,暂未实现特殊样式填充(如列合并),只能用于普通样式(如段落间距 缩进 字体 对齐)
* @param doc
* 要替换的文档
* @param params
* 参数
* @throws Exception
*/
private void insertValueToTables(XWPFDocument doc, Map<String, Object> params)
throws Exception {
Iterator<XWPFTable> iterator = doc.getTablesIterator();
XWPFTable table = null;
int z =1;
while (iterator.hasNext()) {
//行
List<XWPFTableRow> rows = null;
//列
List<XWPFTableCell> cells = null;
List<XWPFParagraph> paras;
table = iterator.next();
System.out.println("-------解析出第 "+z+" 个表------开始处理");
//获取表格行数据list
rows = table.getRows();
XWPFTableRow tmpRow = null;
//第二行为模板行
tmpRow = rows.get(1);
//模版列
List<XWPFTableCell> tmpCells = null;
XWPFTableCell tmpCell = null;
tmpCells = tmpRow.getTableCells();
List<Map> tablist =null;
List<String> listkey = new ArrayList<String>();
for (int i = 1; i <= rows.size(); i++) {
cells = rows.get(i - 1).getTableCells();
//获取当前行所有列
if(i==1){
int intcell = 1;
//遍历列
for (XWPFTableCell cell : cells) {
if (intcell == 1) {
//取第一行第一列表标识并替代${ tab1} 姓名 值 为姓名 map里取对应表list数据
String flagtemp = cell.getText();
flagtemp = flagtemp.substring(flagtemp.indexOf("{")+1, flagtemp.lastIndexOf("}"));
System.out.println("###表标识值:" +flagtemp);
tablist = (List<Map>) params.get(flagtemp);
paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
List<XWPFRun> runs;
runs = para.getRuns();
for (int m = 0; m < runs.size(); m++) {
XWPFRun run = runs.get(m);
String runText = run.toString();
System.out.println("----"+runText);
Matcher matcher;
matcher = this.matcher(runText);
if (matcher.find()) {
while ((matcher = this.matcher(runText)).find()) {
runText = matcher.replaceFirst("");
}
para.removeRun(m);
para.insertNewRun(m).setText(runText);
}
}
}
}
intcell++;
break;
}
}else if(i==2){
//第二行替代值并创建list key用
int intcell = 1;
for (XWPFTableCell cell : cells) {
System.out.println("第"+intcell + "列:" + cell.getText());
//Map mapth = tablist.get(0);
paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
//读取的值去掉${}
String keystr = para.getParagraphText();
keystr = keystr.substring(keystr.indexOf("{")+1, keystr.lastIndexOf("}"));
listkey.add(keystr);
}
intcell++;
}
}
}
//开始动态创建表
for (int i = 0; i < tablist.size(); i++) {
System.out.println("开始复制第" + i + "行");
XWPFTableRow row = table.createRow();
row.setHeight(tmpRow.getHeight());
Map<String,String> tempmap = tablist.get(i);
cells = row.getTableCells();
// 插入的行会填充与表格第一行相同的列数
for (int k = 0 ; k < cells.size(); k++) {
tmpCell = tmpCells.get(k);
XWPFTableCell cell = cells.get(k);
setCellText(tmpCell, cell, tablist.get(i).get(listkey.get(k)).toString());
System.out.println("第"+(k+1)+"列:" +tablist.get(i).get(listkey.get(k)).toString());
}
// 继续写剩余的列
for (int j = cells.size(); j < listkey.size(); j++) {
tmpCell = tmpCells.get(j);
XWPFTableCell cell = row.addNewTableCell();
setCellText(tmpCell, cell, tablist.get(i).get(listkey.get(j)).toString());
System.out.println("第"+(j+1)+"列:" +tablist.get(i).get(listkey.get(j)).toString());
}
}
// 删除表标识行
table.removeRow(1);
System.out.println("-------解析出第 "+z+" 个表------结束处理");
z++;
}
} public void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,
String text) throws Exception {
CTTc cttc2 = tmpCell.getCTTc();
CTTcPr ctPr2 = cttc2.getTcPr(); CTTc cttc = cell.getCTTc();
CTTcPr ctPr = cttc.addNewTcPr();
cell.setColor(tmpCell.getColor());
// cell.setVerticalAlignment(tmpCell.getVerticalAlignment());
if (ctPr2.getTcW() != null) {
ctPr.addNewTcW().setW(ctPr2.getTcW().getW());
}
if (ctPr2.getVAlign() != null) {
ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal());
}
if (cttc2.getPList().size() > 0) {
CTP ctp = cttc2.getPList().get(0);
if (ctp.getPPr() != null) {
if (ctp.getPPr().getJc() != null) {
cttc.getPList().get(0).addNewPPr().addNewJc()
.setVal(ctp.getPPr().getJc().getVal());
}
}
}
if (ctPr2.getTcBorders() != null) {
ctPr.setTcBorders(ctPr2.getTcBorders());
}
XWPFParagraph tmpP = tmpCell.getParagraphs().get(0);
XWPFParagraph cellP = cell.getParagraphs().get(0);
XWPFRun tmpR = null;
if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) {
tmpR = tmpP.getRuns().get(0);
String runText = tmpR.toString();
System.out.println(runText);
}
XWPFRun cellR = cellP.createRun();
cellR.setText(text);
// 复制字体信息
if (tmpR != null) {
cellR.setBold(tmpR.isBold());
cellR.setItalic(tmpR.isItalic());
cellR.setStrike(tmpR.isStrike());
cellR.setUnderline(tmpR.getUnderline());
cellR.setColor(tmpR.getColor());
cellR.setTextPosition(tmpR.getTextPosition());
if (tmpR.getFontSize() != -1) {
cellR.setFontSize(tmpR.getFontSize());
}
if (tmpR.getFontFamily() != null) {
cellR.setFontFamily(tmpR.getFontFamily());
}
if (tmpR.getCTR() != null) {
if (tmpR.getCTR().isSetRPr()) {
CTRPr tmpRPr = tmpR.getCTR().getRPr();
if (tmpRPr.isSetRFonts()) {
CTFonts tmpFonts = tmpRPr.getRFonts();
CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR
.getCTR().getRPr() : cellR.getCTR().addNewRPr();
CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr
.getRFonts() : cellRPr.addNewRFonts();
cellFonts.setAscii(tmpFonts.getAscii());
cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme());
cellFonts.setCs(tmpFonts.getCs());
cellFonts.setCstheme(tmpFonts.getCstheme());
cellFonts.setEastAsia(tmpFonts.getEastAsia());
cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme());
cellFonts.setHAnsi(tmpFonts.getHAnsi());
cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme());
}
}
}
}
// 复制段落信息
cellP.setAlignment(tmpP.getAlignment());
cellP.setVerticalAlignment(tmpP.getVerticalAlignment());
cellP.setBorderBetween(tmpP.getBorderBetween());
cellP.setBorderBottom(tmpP.getBorderBottom());
cellP.setBorderLeft(tmpP.getBorderLeft());
cellP.setBorderRight(tmpP.getBorderRight());
cellP.setBorderTop(tmpP.getBorderTop());
cellP.setPageBreak(tmpP.isPageBreak());
if (tmpP.getCTP() != null) {
if (tmpP.getCTP().getPPr() != null) {
CTPPr tmpPPr = tmpP.getCTP().getPPr();
CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP
.getCTP().getPPr() : cellP.getCTP().addNewPPr();
// 复制段落间距信息
CTSpacing tmpSpacing = tmpPPr.getSpacing();
if (tmpSpacing != null) {
CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr
.getSpacing() : cellPPr.addNewSpacing();
if (tmpSpacing.getAfter() != null) {
cellSpacing.setAfter(tmpSpacing.getAfter());
}
if (tmpSpacing.getAfterAutospacing() != null) {
cellSpacing.setAfterAutospacing(tmpSpacing
.getAfterAutospacing());
}
if (tmpSpacing.getAfterLines() != null) {
cellSpacing.setAfterLines(tmpSpacing.getAfterLines());
}
if (tmpSpacing.getBefore() != null) {
cellSpacing.setBefore(tmpSpacing.getBefore());
}
if (tmpSpacing.getBeforeAutospacing() != null) {
cellSpacing.setBeforeAutospacing(tmpSpacing
.getBeforeAutospacing());
}
if (tmpSpacing.getBeforeLines() != null) {
cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines());
}
if (tmpSpacing.getLine() != null) {
cellSpacing.setLine(tmpSpacing.getLine());
}
if (tmpSpacing.getLineRule() != null) {
cellSpacing.setLineRule(tmpSpacing.getLineRule());
}
}
// 复制段落缩进信息
CTInd tmpInd = tmpPPr.getInd();
if (tmpInd != null) {
CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd()
: cellPPr.addNewInd();
if (tmpInd.getFirstLine() != null) {
cellInd.setFirstLine(tmpInd.getFirstLine());
}
if (tmpInd.getFirstLineChars() != null) {
cellInd.setFirstLineChars(tmpInd.getFirstLineChars());
}
if (tmpInd.getHanging() != null) {
cellInd.setHanging(tmpInd.getHanging());
}
if (tmpInd.getHangingChars() != null) {
cellInd.setHangingChars(tmpInd.getHangingChars());
}
if (tmpInd.getLeft() != null) {
cellInd.setLeft(tmpInd.getLeft());
}
if (tmpInd.getLeftChars() != null) {
cellInd.setLeftChars(tmpInd.getLeftChars());
}
if (tmpInd.getRight() != null) {
cellInd.setRight(tmpInd.getRight());
}
if (tmpInd.getRightChars() != null) {
cellInd.setRightChars(tmpInd.getRightChars());
}
}
}
}
} /**
* 正则匹配字符串
*
* @param str
* @return
*/
private Matcher matcher(String str) {
Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}",
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher;
} /**
* 正则匹配字符串
*
* @param str
* @return
*/
private boolean matcherRow(String str) {
Pattern pattern = Pattern.compile("\\$\\[(.+?)\\]",
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher.find();
} /**
* 关闭输入流
*
* @param is
*/
private void close(InputStream is) {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 关闭输出流
*
* @param os
*/
private void close(OutputStream os) {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

相关 jar 的引入

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.Document;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;

注意:

有个细节,模板文档中所有诸如:${title} 元素都得替换自身一次,才能被程序识别为一个整体元素被动态替换掉值!

操作如下图:

欢迎订阅 Stephen 公众号

Java 程序动态替换 docx 模板中定制值的实现例子的更多相关文章

  1. 利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  2. 替换excel模板中的内容并使用JavaMail发送邮件

    由于在公司工作,常年出差,每天都要以日报的形式向公司汇报当天的工作内容.而日报的内容大体上就只有当天工作的主要内容时变化的,其余的都是不变 的. 而我的电脑刚打开excel有点卡,因此决定使用Java ...

  3. Jar中的Java程序如何读取Jar包中的资源文件

    Jar中的Java程序如何读取Jar包中的资源文件 比如项目的组织结构如下(以idea中的项目为例): |-ProjectName |-.idea/  //这个目录是idea中项目的属性文件夹 |-s ...

  4. 用配置文件里面的参数值替换yaml模板中的变量值【python】

    用配置文件里面的参数值替换yaml模板中的变量值[python] #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/9/20 1 ...

  5. TP框架模板中默认值输出

    TP框架模板中默认值输出 我们可以给变量输出提供默认值,例如: {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例 ...

  6. JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签

    个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法```/** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队形式 ...

  7. 利用springloaded进行java class动态替换

    我们知道对于一个java文件,如Test.java,首先需要通过javac命令(javac Test.java)进行编译,生成class文件,再将class文件在jvm上进行加载运行,也就是java命 ...

  8. java程序员--小心你代码中的内存泄漏

    当你从c&c++转到一门具有垃圾回收功能的语言时,程序员的工作就会变得更加容易,因为你用完对象,他们会被自动回收,但是,java程序员真的不需要考虑内存泄露吗? 其实不然 1.举个例子-看你能 ...

  9. Java程序员如何在竞争中保持优势

    Java程序员入门容易,进阶很难,想要在竞争中保持优势,脚踏实地的同时也要仰望星空规划自己的未来.时间在流逝,年龄在增加,你期望的薪水也在不断增多,你总得让自己能力持续增加以配得上想要的收入吧. 从初 ...

随机推荐

  1. Kendo UI 模板概述

    Kendo UI 模板概述 Kendo UI 框架提供了一个易用,高性能的 JavaScript 模板引擎.通过模板可以创建一个 HTML 片段然后可以和 JavaScript 数据合并成最终的 HT ...

  2. The great pleasure in life is doing what people say you cannot do.

    The great pleasure in life is doing what people say you cannot do.  人生最大的快乐是做到别人认为你做不到的事情.

  3. css 居中问题总结

    html代码: <div class="box"> <div class="box-item"> 文字 </div> < ...

  4. 地址栏传值 JS取值方法

    function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  5. java面试题(杨晓峰)---第八讲谈谈Vector,ArrayList,LinkedList有何区别?

    Vector,ArrayList,LinkedList均为线性的数据结构,但是从现实方式与应用场景中又存在差别. 1 底层实现方式 ArrayList内部数组来实现,LinkedList内部采用双向链 ...

  6. 在SAP C4C里触发SAP ERP的ATP check和Credit check

    在C4C里创建一个新的Sales Quote: 添加三个行项目: 执行action "Request External Pricing"会从ERP更新pricing信息,触发ATP ...

  7. UVA 12171 (hdu 2771)sculptrue(离散化)

    以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...

  8. [dp][uestc oj]J - 男神的约会

    J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  9. eclipse报错GC overhead limit exceed,卡顿

    在使用Eclipse的Build Project功能时,提示以下错误: An internal error occurred during: “Build Project”. GC overhead ...

  10. css3中的nth-child和nth-of-type的区别

    实例: 首先创建一个HTML结构 <div class="post"> <p>我是文章的第一段落</p> <p>我是文章的第二段落& ...