一般情况下,编写程序,是在规定的时间内,并且在一段时间内很好的按成,那么就必须要套用现成的东西。在一个新的功能中,如何调用现成的东西呢,那么就是使用第三方包或者是使用自己总结的代码库。接来下是自己看到的一些好的代码库和自己总结的代码库。

通用库

经常被使用的到apache 的集中包例如apache commons的包,goole guava包,至少需要知道其中的几个关键的类如StringUtils类,这些,其他的都需要记住其中的用法。至少在StringUtils中能够完成大部分字符串的处理工作。

时间处理类

在以前较多的使用JodaTime,该库能够帮助完成很多时间处理上的问题,但java8出来之后,使用java8新的时间处理,也是很方便的,但是一般都习惯使用Date类,如何高效的完成事件的处理呢,我自己是自己总结了一个DateUtil类,其中有自己经常需要使用到的时间处理方法。

集合类库

集合是被经常使用到的一个,在工作中大多数会用到ArrayList,HashMap,HashSet,这个三个集合类,这个Apache Commons Collections库能够处理很多类需要处理的部分,我个人还建议,除了常用到的三个集合类,需要了解更多的其他集合类,并且在一些特殊的场合下使用到他们,因为其他集合类设计出来,都是适合一些特殊场合的,比常见的类处理效率更好。

加密库

Apache Commons家族中的Commons Codec就提供了一些公共的编解码实现,但是我个人还是建议自己维护一个自己的加密库,因为jdk已经提供了原生的加密算法,需要自己去封装一层,而自己维护的工具类就是将这些算法集中起来。

单元测试库

单元测试是很不被重视的一个,但是时非常重要的一个,我我在工作中常用到的测试库JUnit,Mockito和PowerMock,这三个测试库满足了大部分的情况。熟练的使用它,能够在开发过程中将单元测试覆盖率提升到一定比率,并且每次改动代码,都跑一遍单元测试,那么自己维护的代码将出现很少的错误。

下面分享我的关于这些包的一些笔记:

guava包

  • Objects

    • 使用java原生的替换,其中包括equals和deepEquals
    • hashCode
    • hash(Objects)返回一组对象的hash值
  • Strings
    • padStart(String str,int min,char pad)str头部开始添加min个pad字段
    • padEnd(String str,int min,char pad)str的尾部填充pad字段,总长度为min
    • repeat(String str,int count)将str循环count次拼接成字符串
    • commonPrefix(String a,String b)输出前缀是一样的字符串
    • commonSuffix(String a,String b)输出后缀是一样的字符串
  • joiner
    • Joiner.on(",").skipNulls().join(Arrays.asList("join", "ice", "welcome"));已逗号进行拼接
    • Joiner.on("&").withKeyValueSeparator("=").join(map);键值对已=进行拼接,&连个值之间拼接
    • appendTo(StringBuilder builder,list);给builder进行追加拼接
  • Splitter
    • Splitter.on(",").trimResults().omitEmptyStrings().splitToList(str);已逗号进行分割并返回集合
    • Splitter.on("&").trimResults().omitEmptyStrings() .withKeyValueSeparator("=").split(str);对get连接进行分割,返回map
  • Ints
    • join(separator,arrays),返回字符串
    • indexOf(int[] array, int target)
  • Multimap 一键多值
  • Multiset 接口扩展设置有重复的元素
  • BiMap 存储map值,inverse()将键值对翻转
  • File
    • 文件处理 readLines()读取行的记录
  • EventBus 观察者

commons lang3包

  • RandomUtils 返回某个类型的随机数

  • RandomStringUtils 返回随机数字符串

    • random(15,true,false);//返回15长度,true表示保函字符串,false不保函数字
    • random(15,'abcdefgABCDEFG123456789');//从字符串中获取长度为15的随机数
    • randomAlphabetic(15);//从a-z、A-Z的选择出15随机数
    • randomAlphabetic(2,15);//最小长度是2,最大长度15
    • randomNumeric(15)//数字
  • ClassUtils 获取类名

    • getShortName() //获取短类名,如:ClassUtils
    • getClassFileName() //获取类文件名,如:ClassUtils.class
    • getPackageName() //获取包,如:org.apache.commons.lang3
    • getQualifiedName()//获取包名+类名,如:org.apache.commons.lang3.ClassUtils
  • ArrayUtils 数组的操作 array[]

    • add(array,3); //将3追加到数组后面
    • remove(array,3) //将数组下标为3的移除
    • subarray(array,1,3) //截取下标1-3的数组
    • clone() 拷贝
    • contains(array,"")//是否包含
    • index(array,""),返回保函的下标
    • isEquals(array,array1);//判断两个数组内部元素是否相等

beanutils 包

  • BeanUtils 前提条件,必须提供get/set方法

    • copyProperties(desc,src);//将src对象的值复制设置到desc对象中
    • populate(bean,Map);将对象的值映射到bean对象中
    • describe(bean)//将对象转化map
  • methondUtils 方法的集合

common-io包

  • FileUtil 与IOUtils

    • copyURLToFile(URL,file);//将url路径放入file
    • copyInputStreamToFile(input,file);//将input放入到file
    • copyToFile(intput,file);//inpout放入file
    • readFileToString(file);//将file内容读出为String
    • readFileToByteArray(file);//将file内容读出来为byte[]
    • readLines(file,"utf-8");//将file以行读出来放入集合,编码格式
    • writeStringToFile(file,str,"utf-8");//将字符串输入到file
  • FileAlterationMonitor文件监听

接下来是自己经常会用到的一个关于时间处理的类,该类中引用了slf4j-api包,用于日志输出。

 import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* @author: ice
* @create on:2018-04-12 23:25
*/
public class DateUtil { private static final Logger logger = LoggerFactory.getLogger(ODateu.class); public static final long SECOND = 1 * 1000;
public static final long MINUTE = 60 * SECOND;
public static final long HOUR = 60 * MINUTE;
public static final long DAY = 24 * HOUR;
public static final long WEEK = 7 * DAY;
public static final TimeZone tz = TimeZone.getDefault(); /**
* 入参格式: Sat Nov 01 14:01:55 CST 2014.
*/
public static final Date parseLocale(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US).parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 入参格式: yyyy.
*/
public static final Date parseDateyyyy(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyy").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 入参格式: yyyy-MM.
*/
public static final Date parseDateyyyy_MM(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyy-MM").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 入参格式: yyyyMMdd.
*/
public static final Date parseDateyyyyMMdd(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyyMMdd").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 入参格式: yyyy-MM-dd.
*/
public static final Date parseDateyyyy_MM_dd(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 解析yyyyMMddHH格式的日期.
*/
public static final Date parseDateyyyyMMddHH(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyyMMddHH").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 解析yyyyMMddHHmm格式的日期.
*/
public static final Date parseDateyyyyMMddHHmm(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyyMMddHHmm").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 解析yyyyMMddHHmmss格式的日期.
*/
public static final Date parseDateyyyyMMddHHmmss(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyyMMddHHmmss").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 解析yyyy-MM-dd HH:mm:ss格式的日期.
*/
public static final Date parseDateyyyy_MM_dd_HH_mm_ss(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}, date: {}", Misc.trace(e), date);
}
return null;
}
} /**
* 返回格式: yyyy-MM-dd.
*/
public static final String parseDateyyyy_MM_dd(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyy-MM-dd"), date);
} /**
* 返回格式: yyyy-MM.
*/
public static final String parseDateyyyy_MM(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyy-MM"), date);
} /**
* 返回格式:yyyy-MM-dd HH:mm:ss.
*/
public static final String parseDateyyyyMMddHHmmss(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), date);
} /**
* 返回格式:yyyy/MM/dd HH:mm.
*/
public static final String parseDateyyyyMMddHHmm2(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyy/MM/dd HH:mm"), date);
} /**
* 返回格式:yyyyMMdd.
*/
public static final String parseDateyyyyMMdd(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyyMMdd"), date);
} /**
* 返回格式:yyyyMMddHH.
*/
public static final String parseDateyyyyMMddHH(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyyMMddHH"), date);
} /**
* 返回格式:yyyyMMddHHmmss.
*/
public static final String parseDateyyyyMMddHHmmss2(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyyMMddHHmmss"), date);
} /**
* 返回格式:yyyyMMddHHmm.
*/
public static final String parseDateyyyyMMddHHmm(Date date) {
return ODateu.parse(new SimpleDateFormat("yyyyMMddHHmm"), date);
} /**
* 返回格式:MMddHHmmss.
*/
public static final String parseDateMMddHHmmss(Date date) {
return ODateu.parse(new SimpleDateFormat("MMddHHmmss"), date);
} /**
* 返回格式:HH:mm:ss.
*/
public static final String parseDateHHmmss(Date date) {
return ODateu.parse(new SimpleDateFormat("HH:mm:ss"), date);
} /**
* 返回格式: HH:mm:ss.ms.
*/
public static final String parseDateHHmmssms(Date date) {
long ms = date.getTime() % 1000;
return ODateu.parse(new SimpleDateFormat("HH:mm:ss"), date) + "."
+ (ms > 99 ? ms : (ms > 9 ? ("0" + ms) : ("00" + ms)));
} /**
* 返回格式:yyyy-MM-dd HH:mm:ss.ms.
*/
public static final String parseDateyyyyMMddHHmmssms(Date date) {
long ms = date.getTime() % 1000;
return ODateu.parse(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), date) + "."
+ (ms > 99 ? ms : (ms > 9 ? ("0" + ms) : ("00" + ms)));
} /**
* 返回格式:yyyyMMddHHmmssms.
*/
public static final String parseDateyyyyMMddHHmmssms2(Date date) {
long ms = date.getTime() % 1000;
return ODateu.parseDateyyyyMMddHHmmss2(date) + (ms > 99 ? ms
: (ms > 9 ? ("0" + ms) : ("00" + ms)));
} /**
* 置为凌晨00:00:00 000,Calendar提供的set函数.
*/
public static final Date set000000(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date.getTime() - (date.getTime() % 1000));
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0,
0);
return cal.getTime();
} /**
* 当前时间的hour, 小于10时前面补零.
*/
public static final String hour(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int hour = cal.get(Calendar.HOUR_OF_DAY);
return hour > 9 ? hour + "" : "0" + hour;
} /**
* 返回秒(0 ~ 59).
*/
public static final int secondInt(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.SECOND);
} /**
* 返回分钟(0 ~ 59).
*/
public static final int minuteInt(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.MINUTE);
} /**
* 返回小时(0 ~ 23).
*/
public static final int hourInt(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.HOUR_OF_DAY);
} /**
* 返回天.
*/
public static final int dayInt(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_MONTH);
} /**
* 返回星期.
*/
public static final int weekInt(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.WEEK_OF_YEAR);
} /**
* 星期几? (周期一返回1, 星期天返回7).
*/
public static final int week(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.DAY_OF_WEEK);
week -= 1;
return week < 1 ? 7 : week;
} /**
* 返回月份.
*/
public static final int monthInt(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.MONTH) + 1;
} /**
* 返回年份.
*/
public static final int yearInt(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.YEAR);
} /**
* yyyymm整数形式.
*/
public static final int yyyymm(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.YEAR) * 100 + (cal.get(Calendar.MONTH) + 1);
} /**
* yyyymmdd整数形式.
*/
public static final int yyyymmdd(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.YEAR) * 10000 + (cal.get(Calendar.MONTH) + 1) * 100 + cal
.get(Calendar.DAY_OF_MONTH);
} /**
* 返回这个月的总天数.
*/
public static final int monthDays(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
} /**
* 返回这个月的最后一天(时分秒跟随).
*/
public static final Date montheLastDay(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar ret = Calendar.getInstance();
ret.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.getActualMaximum(Calendar.DAY_OF_MONTH),
cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
return ret.getTime();
} /**
* 返回这个月的第一天(00:00:00).
*/
public static final Date monthFirstDay000000(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar ret = Calendar.getInstance();
ret.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.getActualMinimum(Calendar.DAY_OF_MONTH), 0, 0, 0);
return ret.getTime();
} /**
* 返回这个月的最后一天(23:59:59).
*/
public static final Date monthLastDay235959(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar ret = Calendar.getInstance();
ret.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.getActualMaximum(Calendar.DAY_OF_MONTH), 23, 59,
59);
return ret.getTime();
} /**
* 返回这一年的第一天(00:00:00).
*/
public static final Date yearFirstDay000000(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar ret = Calendar.getInstance();
ret.set(cal.get(Calendar.YEAR), cal.getActualMinimum(Calendar.MONTH),
cal.getActualMinimum(Calendar.DAY_OF_MONTH), 0, 0, 0);
return ret.getTime();
} /**
* 返回这一年的最后一天(23:59:59).
*/
public static final Date yearLastDay235959(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar ret = Calendar.getInstance();
ret.set(cal.get(Calendar.YEAR), cal.getActualMaximum(Calendar.MONTH),
cal.getActualMaximum(Calendar.DAY_OF_MONTH), 23, 59, 59);
return ret.getTime();
} /**
* 获取当前系统时区.
*/
public static final int getTimezone() {
return (int) (ODateu.tz.getRawOffset() / ODateu.HOUR);
} /**
* 将本地时间转换成指定时区的时间.
*/
public static final long changeLocalTimeZone(long ts /* 本地时间, 毫秒. */,
int gmt /* 指定时区偏移, 小时 . */) {
return (ts - ODateu.tz.getRawOffset() /* 回归零时区. */) + (gmt * ODateu.HOUR);
} /**
* 将本地时间转换成指定时区的时间.
*/
public static final Date changeLocalTimeZone2date(long ts /* 本地时间, 毫秒. */,
int gmt /* 指定时区偏移, 小时 . */) {
return new Date(ODateu.changeLocalTimeZone(ts, gmt));
} /**
* 返回当前时间在零时区的绝对时间.
*/
public static final Date nowGmt0() {
return new Date(System.currentTimeMillis() - ODateu.tz.getRawOffset() /* 回归零时区. */);
} /**
* 将指定GM+0时间回归到GMT+x.
*/
public static final Date gotoGmtxOld(Date date /* 具有gmt0时区的绝对时间. */, int gmt /* 要返回的时区. */) {
return new Date(date.getTime() + gmt * ODateu.HOUR);
} /**
* 将指定时间回归到GMT+0.
*/
public static final Date gotoGmt0Old(Date date /* 具有gmt时区的绝对时间. */, int gmt /* date的时区. */) {
return new Date((date.getTime() - gmt * ODateu.HOUR));
} /**
* 将本地时区绝对时间转换成目标时区的绝对时间.
*/
public static final Date gotoGmtx(long ts /* 本时绝对时间. */, int gmtSec /* 要返回的时区(秒) */) {
return new Date(
(ts - ODateu.tz.getRawOffset() /* 去零时区. */) + (gmtSec * ODateu.SECOND /* 去目标时区. */));
} /**
* 将指定GMT+x时间回归到GMT+0.
*/
public static final Date gmtxGoto0(Date date /* 具有gmtSec时区的绝对时间. */, int gmtSec /* date的时区. */) {
return new Date((date.getTime() - gmtSec * ODateu.SECOND));
} /**
* 将指定GM+0时间回归到GMT+x.
*/
public static final Date gmt0Gotox(Date date /* 具有gmt0时区的绝对时间. */, int gmtSec /* 要返回的时区(秒). */) {
return new Date(date.getTime() + gmtSec * ODateu.SECOND);
} /**
* 本地时间去零时区.
*/
public static final Date gotoGmt0(Date date /* 具有本地时区的时间 */) {
return new Date(date.getTime() - ODateu.tz.getRawOffset());
} /**
* 零时区时间去本地时区.
*/
public static final Date gotoLocal(Date date/* 具有0时区的时间. */) {
return new Date(date.getTime() + ODateu.tz.getRawOffset());
} /**
* 判断两个日期是否在同一天.
*/
public static final boolean isSameDay(Date arg0, Date arg1) {
return (ODateu.yearInt(arg0) == ODateu.yearInt(arg1)) && //
(ODateu.monthInt(arg0) == ODateu.monthInt(arg1)) && //
(ODateu.dayInt(arg0) == ODateu.dayInt(arg1));
} /**
* 构造一个给定的时间.
*/
public static final Date createDate(int year, int month, int day, int hourOfDay, int minute,
int second) {
Calendar cal = Calendar.getInstance();
cal.set(year, month, day, hourOfDay, minute, second);
return cal.getTime();
} /**
* 时间滚动, 按秒钟, up == true向今后滚动, 否则向以前滚动.
*/
public static final Date dateRollOfSecond(Date date, int amount, boolean up) {
return up ? new Date(date.getTime() + ((long) amount) * ODateu.SECOND)
: new Date(date.getTime() - ((long) amount) * ODateu.SECOND);
} /**
* 时间滚动, 按分钟, up == true向今后滚动, 否则向以前滚动.
*/
public static final Date dateRollOfMinute(Date date, int amount, boolean up) {
return up ? new Date(date.getTime() + ((long) amount) * ODateu.MINUTE)
: new Date(date.getTime() - ((long) amount) * ODateu.MINUTE);
} /**
* 时间滚动, 按小时, up == true向今后滚动, 否则向以前滚动.
*/
public static final Date dateRollOfHour(Date date, int amount, boolean up) {
return up ? new Date(date.getTime() + ((long) amount) * ODateu.HOUR)
: new Date(date.getTime() - ((long) amount) * ODateu.HOUR);
} /**
* 时间滚动, 按天, up == true向今后滚动, 否则向以前滚动.
*/
public static final Date dateRollOfDay(Date date, int amount, boolean up) {
return up ? new Date(date.getTime() + ((long) amount) * ODateu.DAY)
: new Date(date.getTime() - ((long) amount) * ODateu.DAY);
} /**
* 时间滚动, 按月, up == true向今后滚动, 否则向以前滚动.
*/
public static final Date dateRollOfMonth(Date date, boolean up) {
Calendar ca = Calendar.getInstance();
ca.setTime(date);
ca.roll(Calendar.MONTH, up);
int m = ODateu.monthInt(date);
if (m == 1 && !up) {
ca.roll(Calendar.YEAR, false);
}
if (m == 12 && up) {
ca.roll(Calendar.YEAR, true);
}
return ca.getTime();
} /**
* 时间滚动, 按年, up == true向今后滚动, 否则向以前滚动.
*/
public static final Date dateRollOfYear(Date date, boolean up) {
Calendar ca = Calendar.getInstance();
ca.setTime(date);
ca.roll(Calendar.YEAR, up);
return ca.getTime();
} /**
* 清除分钟.
*/
public static final Date clearMinute(Date date) {
return new Date(date.getTime() - (date.getTime() % ODateu.HOUR));
} /**
* 清除小时.
*/
public static final Date clearHour(Date date) {
return ODateu.set000000(date);
} /**
* 秒转换为毫秒, 出现这个函数的原因时, 当前时间的秒数 * 1000后总是整数(4字节)溢出, 此函数则可避免出错.
*/
public static final long sec2msec(long sec) {
return sec * 1000L;
} /**
* 按格式解析日期.
*/
private static final String parse(SimpleDateFormat format, Date date) {
try {
return date == null ? null : format.format(date);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("{}", Misc.trace(e));
}
return null;
}
}
}

java里面如何提升编写速度的更多相关文章

  1. Java动态编译优化——提升编译速度(N倍)

    一.前言 最近一直在研究Java8 的动态编译, 并且也被ZipFileIndex$Entry 内存泄漏所困扰,在无意中,看到一个第三方插件的动态编译.并且编译速度是原来的2-3倍.原本打算直接用这个 ...

  2. JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  3. Docker实用技巧之更改软件包源提升构建速度

    一.开篇 地球,中国,成都市,某小区的阳台上,一青年负手而立,闭目沉思,阵阵的凉风吹得他衣衫呼呼的飘.忽然,他抬起头,刹那间,睁开了双眼,好似一到精光射向星空,只见这夜空......一颗星星都没有.他 ...

  4. Java调用C/C++编写的第三方dll动态链接库(zz)

    这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...

  5. 【安装eclipse, 配置java环境教程】 编写第一个java程序

    写java通常用eclipse编写,还有一款编辑器比较流行叫IJ.这里我们只说下eclipse编写java的前期工作. 在安装eclipse之前要下载java的sdk文件,即java SE:否则无法运 ...

  6. Atitit 纯java项目的提升进度大法---通用json dsl接口

    Atitit 纯java项目的提升进度大法---通用json dsl接口 1. Json dsl接口1 1.1. Url:  http://aaa.com/api_jsondsl?dsl={}1 1. ...

  7. Java实战_手把手编写记事本

    Java运用SWT插件编写桌面记事本应用程序 可实现windows系统桌面记事本基本功能.傻瓜式教学,一步一步手把手操作.小白也可自己编写出完整的应用程序. 须要工具:Eclipse(带SWT插件) ...

  8. 在java web项目中编写自己的代码生成器

    在java web项目中编写自己的代码生成器

  9. 13 nginx gzip压缩提升网站速度

    一:nginx gzip压缩提升网站速度 我们观察news.163.com的头信息 请求: Accept-Encoding:gzip,deflate,sdch 响应: Content-Encoding ...

随机推荐

  1. delphi中sql实现while循环插入,不存在则插入

    ' declare @i int; '+ ' set @i=0; '+ ' while @i<4 '+ ' begin '+ ' insert into NBCommission(Type,It ...

  2. centos7 安装dnf包管理器和常用命令

    Installing DNF Currently the DNF package comes from the EPEL repository, so if your Linux system is ...

  3. wp8.1 app退出操作提示

    微软的wp8.1 sdk相比之前wp8 sdk以及相关dll类库,微软又重新编译过,相关系统类库也经过精简,删改了部分传统dll库中的方法对象,很多常用方法对象被写进Windows.UI为前缀的命名空 ...

  4. INDEX--索引页上存放那些数据

    由于索引的叶子节点和非叶子节点的作用不同,导致不同类型节点上每行记录存放的数据不同--============================================唯一聚集索引叶子节点:所有 ...

  5. 腾讯云/阿里云/微软云安装ISO镜像系统方法

    如今云服务的盛行,我们的开发和应用中场景应用也层出不穷,有时我们需要安装自由的镜像却越来越难,甚至有些云出于安全原因自己用户安装自由镜像,那么今天将带给大家安装自有镜像的方法. 前提条件:你的现有服务 ...

  6. C#字典 Dictionary<Tkey,Tvalue> 之线程安全问题 ConcurrentDictionary<Tkey,Tvalue> 多线程字典

    ConcurrentDictionary<Tkey,Tvalue>  Model #region 程序集 mscorlib, Version=4.0.0.0, Culture=neutra ...

  7. IoC概要

    控制反转基本上说的是功能调用者与功能实现者之间应该如何交互,即二者之间没有直接的强耦合(调用者new一个被调用者),而是都依赖同一个抽象,这个抽象规定了二者交互的接口.反转的意思是实现了依赖倒置,在程 ...

  8. Web Server 在iis上部署webservice基于oracle

    在iis上部署webservice基于oracle 常见错误及解决方案: 原因: 先安装.netframework后安装iis造成的: 解决方案: 1.C:\Windows\Microsoft.NET ...

  9. 初探UE4中的Profiling【转】

    http://blog.ch-wind.com/ue4-profiling-preview/ Profililng是成品制作过程中非常重要的一个步骤,通过Profiling才能提高运行效率使得作品达到 ...

  10. ACM-ICPC 2018青岛网络赛-H题 Traveling on the Axis

    题目:略(不知道怎么从ZOJ搬题) 地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4054 把这题的每个点分成两种情况 ...