JAVA设计模式之单例模式:https://blog.csdn.net/jason0539/article/details/23297037/
Ant:ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具
ant 是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点:1、跨平台性:Ant是纯Java语言编写的,所以具有很好的跨平台性。
2、操作简单:Ant是由一个内置任务和可选任务组成的,用ant任务就像是在dos中写命令行一样。Ant运行时需要一个XML文件(构建文件)。 Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。
3、维护简单、可读性好、集成简单:由于Ant构建文件 时XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
通过ANT生成MANIFEST.MF中的Class-Path属性:reason2003.iteye.com/blog/1627353
学习Ant编译脚本:https://blog.csdn.net/chenyz_cn/article/details/6877480
ant 使用指南:www.cnblogs.com/hoojo/archive/2013/06/14/java_ant_project_target_task_run.html
Ant打包可运行的Jar包(加入第三方jar包):www.cnblogs.com/alfredinchange/p/5372657.html
示例:
<?xml version="1.0" encoding="utf-8"?>
<project name="SqlCollect" default="package" basedir=".">
<property name="src.dir" value="${basedir}/src/main/java">
</property>
<property name="src.lib" value="${basedir}/lib">
</property>
<property name="class.path" value="${basedir}/bin">
</property>
<property name="resource.dir" value="${basedir}/src/main/resources">
</property>
<property name="jarname" value="AppTransferToolSqlCollect.jar">
</property>
<property name="version" value="V1.0">
</property>
<property name="src.extlib" value="${basedir}/extlib">
</property>
<property environment="SystemVariable">
</property>
<property name="java_home" value="${SystemVariable.JAVA_HOME}">
</property>
<!--1. 初始化删除旧文件-->
<target name="init">
<echo>"${java_home}"</echo>
<echo>...开始清理老的class文件...</echo>
<echo>"${src.extlib}"</echo>
<delete dir="${basedir}/bin">
</delete>
<mkdir dir="${class.path}">
</mkdir>
<copy file="${resource.dir}/applicationContext.xml" todir="${class.path}" overwrite="true"/>
<copy file="${resource.dir}/SqlCollect.properties" todir="${class.path}" overwrite="true"/>
</target>
<pathconvert property="libs.project" pathsep=" ">
<mapper>
<chainedmapper>
<!-- remove absolute path -->
<flattenmapper />
<!-- add lib/ prefix -->
<globmapper from="*" to="lib/*" />
</chainedmapper>
</mapper>
<path>
<!-- lib.home contains all jar files, in several subdirectories -->
<path id="classpath">
<fileset dir="${src.lib}">
<include name="*.jar" />
</fileset>
<fileset dir="${src.extlib}">
<include name="*.jar" />
</fileset>
</path>
</path>
</pathconvert>
<!--2. 编译src java-->
<target name="compile" depends="init">
<echo>...Compiling build...</echo>
<javac srcdir="${src.dir}" destdir="${class.path}" classpathref="classpath"
debug="true" debuglevel="source,lines,vars" includeantruntime="false" encoding="UTF-8">
</javac>
</target>
<!-- 3. 打包jar文件 -->
<target name="package" depends="compile">
<echo>...Compiling package...</echo>
<!-- jar文件的输出路径 -->
<jar jarfile="${basedir}/${jarname}" basedir="${class.path}">
<!-- 向jar包中的main文件中添加内容 -->
<manifest>
<attribute name="Main-class" value="com.huawei.bgapp.apptransfertool.sqlcollect.Application"/>
<attribute name="Class-Path" value="${libs.project}" />
</manifest>
</jar>
</target>
</project>
利用-Xbootclasspath来显示指明引用包:http://www.zeali.net/entry/15
语法如下: (分隔符与classpath参数类似,unix使用:号,windows使用 ; 号,这里以unix为例)
java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar
MANIFEST.MF 文件内容完全详解:https://blog.csdn.net/zhifeiyu2008/article/details/8829637
几种任务调度的 Java 实现方法与比较:https://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/
Java NIO与IO:ifeve.com/java-nio-vs-io/
同步阻塞IO:在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!
同步非阻塞IO:在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。
异步阻塞IO:此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!
异步非阻塞IO:在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。
TimeUnit是 java.util.concurrent 包下面的类,这个包下的方法都建议学习
不给用Thread.sleep方法,可以用下面这个TimeUnit.SECONDS.sleep( 5 );
使用FileUtils简化你的文件操作:https://blog.csdn.net/lqclh502/article/details/38338327
java中从键盘输入的三种方法:https://blog.csdn.net/u012249177/article/details/49586383
JAVA中的反射机制:https://blog.csdn.net/liujiahan629629/article/details/18013523
java调用外部程序Runtime.getRuntime().exec:https://www.cnblogs.com/jianyungsun/p/6546553.html
java语法性能:
1、Map 遍历性能:http://blog.csdn.net/chenleixing/article/details/44087131
values()是返回Map的所有value的集合collection,只能遍历到值,很难遍历到key所以一般不用,除非在某种特殊场合。如果对Map讲究效率的遍历的话,还是采用entrySet()方法。
2、split、subString、StringTokenizer 性能比较:http://blog.csdn.net/sdauzyh/article/details/48137487
Split 低!因为正则实现。
3、Date.getTime 不如 System.currentTimeMillis() ,建议看看new Date() 源码.
计算一段代码处理时间,建议用System.nanoTime() : https://blog.csdn.net/u012581453/article/details/53706573
4、装箱指的是基本类型转换为包装类型,拆箱指的是包装类型转换为基本类型。使用valueof方法效率不如使用paseXXX方法。
JAVA基本类型,不用new来创建变量,而是创建一个并非是“引用”的“自动”变量。这个变量拥有它的“值”,并置于堆栈中,因此更加高效。
Long.ValueOf(String) 最后被转换为一个Long的包装类。所以更推荐用 Long.parseLong(java.lang.String)