Java编程Commons lang组件简介
跟java.lang这个包的作用类似,commons lang这一组api也是提供一些基础的、通用的操作和处理,如自动生成tostring()的结果、自动实现hashcode()和equals()方法、数组操作、枚举、日期和时间的处理等等。
这一组api的所有包名都以org.apache.commons.lang开头,共有如下8个包:
org.apache.commons.lang
org.apache.commons.lang.builder
org.apache.commons.lang.enum
org.apache.commons.lang.enums
org.apache.commons.lang.exception
org.apache.commons.lang.math
org.apache.commons.lang.mutable
org.apache.commons.lang.time
其中的lang.enum已不建议使用,替代它的是紧随其后的lang.enums包。 lang包主要是一些可以高度重用的util类;lang.builder包包含了一组用于产生每个java类中都常使用到的tostring()、 hashcode()、equals()、compareto()等等方法的构造器;lang.enums包顾名思义用于处理枚 举;lang.exception包用于处理java标准api中的exception,为1.4之前版本提供nested exception功能;lang.math包用于处理数字;lang.mutable用于包装值型变量;lang.time包提供处理日期和时间的功 能。
由于commons的包和类实在很多,不可能一个一个讲了,在接下来的专题文章中我就只分别过一下lang、lang.builder、lang.math和lang.time这几个包和常见的用法,其他的我们可以在用到时临时参考一下javadoc。位置就在安装路径的
…\commons-lang-2.1\docs\api\index.html
我们首先来看org.apache.commons.lang包,这个包提供了一些有用的包含static方法的util类。除了6个exception类和2个已经deprecated的数字类之外,commons.lang包共包含了17个实用的类:
arrayutils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;
bitfield – 用于操作位元,提供了一些方便而安全的方法;
booleanutils – 用于操作和转换boolean或者boolean及相应的数组;
charencoding – 包含了java环境支持的字符编码,提供是否支持某种编码的判断;
charrange – 用于设定字符范围并做相应检查;
charset – 用于设定一组字符作为范围并做相应检查;
charsetutils – 用于操作charset;
charutils – 用于操作char值和character对象;
classutils – 用于对java类的操作,不使用反射;
objectutils – 用于操作java对象,提供null安全的访问和其他一些功能;
randomstringutils – 用于生成随机的字符串;
serializationutils – 用于处理对象序列化,提供比一般java序列化更高级的处理能力;
stringescapeutils – 用于正确处理转义字符,产生正确的java、javascript、html、xml和sql代码;
stringutils – 处理string的核心类,提供了相当多的功能;
systemutils – 在java.lang.system基础上提供更方便的访问,如用户路径、java版本、时区、操作系统等判断;
validate – 提供验证的操作,有点类似assert断言;
wordutils – 用于处理单词大小写、换行等。
下面讲下最常用的两个类
arrayutils
数组是我们经常需要使用到的一种数据结构,但是由于java本身并没有提供很好的api支持,使得很多操作实际上做起来相当繁琐,以至于我们实际编 码中甚至会不惜牺牲性能去使用collections api,用collection当然能够很方便的解决我们的问题,但是我们一定要以性能为代价吗?arrayutils帮我们解决了处理类似情况的大部分 问题。来看一个例子:
view plaincopy to clipboardprint? package sean.study.jakarta.commons.lang; import java.util.map; import org.apache.commons.lang.arrayutils; public class arrayutilsusage { public static void main(string[] args) { // data setup int[] intarray1 = { 2, 4, 8, 16 }; int[][] intarray2 = { { 1, 2 }, { 2, 4 }, { 3, 8 }, { 4, 16 } }; object[][] notamap = { { "a", new double(100) }, { "b", new double(80) }, { "c", new double(60) }, { "d", new double(40) }, { "e", new double(20) } }; // printing arrays system.out.println("intarray1: " + arrayutils.tostring(intarray1)); system.out.println("intarray2: " + arrayutils.tostring(intarray2)); system.out.println("notamap: " + arrayutils.tostring(notamap)); // finding items system.out.println("intarray1 contains '8'? " + arrayutils.contains(intarray1, 8)); system.out.println("intarray1 index of '8'? " + arrayutils.indexof(intarray1, 8)); system.out.println("intarray1 last index of '8'? " + arrayutils.lastindexof(intarray1, 8)); // cloning and resversing int[] intarray3 = arrayutils.clone(intarray1); system.out.println("intarray3: " + arrayutils.tostring(intarray3)); arrayutils.reverse(intarray3); system.out.println("intarray3 reversed: " + arrayutils.tostring(intarray3)); // primitive to object array integer[] integerarray1 = arrayutils.toobject(intarray1); system.out.println("integerarray1: " + arrayutils.tostring(integerarray1)); // build map from two dimensional array map map = arrayutils.tomap(notamap); double res = (double) map.get("c"); system.out.println("get 'c' from map: " + res); } }
以下是运行结果:
intarray1: {2,4,8,16}
intarray2: {{1,2},{2,4},{3,8},{4,16}}
notamap: {{a,100.0},{b,80.0},{c,60.0},{d,40.0},{e,20.0}}
intarray1 contains '8'? true
intarray1 index of '8'? 2
intarray1 last index of '8'? 2
intarray3: {2,4,8,16}
intarray3 reversed: {16,8,4,2}
integerarray1: {2,4,8,16}
get 'c' from map: 60.0
package sean.study.jakarta.commons.lang; import java.util.map; import org.apache.commons.lang.arrayutils; public class arrayutilsusage { public static void main(string[] args) { // data setup int[] intarray1 = { 2, 4, 8, 16 }; int[][] intarray2 = { { 1, 2 }, { 2, 4 }, { 3, 8 }, { 4, 16 } }; object[][] notamap = { { "a", new double(100) }, { "b", new double(80) }, { "c", new double(60) }, { "d", new double(40) }, { "e", new double(20) } }; // printing arrays system.out.println("intarray1: " + arrayutils.tostring(intarray1)); system.out.println("intarray2: " + arrayutils.tostring(intarray2)); system.out.println("notamap: " + arrayutils.tostring(notamap)); // finding items system.out.println("intarray1 contains '8'? " + arrayutils.contains(intarray1, 8)); system.out.println("intarray1 index of '8'? " + arrayutils.indexof(intarray1, 8)); system.out.println("intarray1 last index of '8'? " + arrayutils.lastindexof(intarray1, 8)); // cloning and resversing int[] intarray3 = arrayutils.clone(intarray1); system.out.println("intarray3: " + arrayutils.tostring(intarray3)); arrayutils.reverse(intarray3); system.out.println("intarray3 reversed: " + arrayutils.tostring(intarray3)); // primitive to object array integer[] integerarray1 = arrayutils.toobject(intarray1); system.out.println("integerarray1: " + arrayutils.tostring(integerarray1)); // build map from two dimensional array map map = arrayutils.tomap(notamap); double res = (double) map.get("c"); system.out.println("get 'c' from map: " + res); } }
以下是运行结果:
intarray1: {2,4,8,16}
intarray2: {{1,2},{2,4},{3,8},{4,16}}
notamap: {{a,100.0},{b,80.0},{c,60.0},{d,40.0},{e,20.0}}
intarray1 contains '8'? true
intarray1 index of '8'? 2
intarray1 last index of '8'? 2
intarray3: {2,4,8,16}
intarray3 reversed: {16,8,4,2}
integerarray1: {2,4,8,16}
get 'c' from map: 60.0
这段代码说明了我们可以如何方便的利用arrayutils类帮我们完成数组的打印、查找、克隆、倒序、以及值型/对象数组之间的转换等操作。
stringutils
处理文本对java应用来说应该算是家常便饭了,在1.4出现之前,java自身提供的api非常有限,如string、 stringtokenizer、stringbuffer,操作也比较单一。无非就是查找substring、分解、合并等等。到1.4的出现可以说 java的文字处理上了一个台阶,因为它支持regular expression了。这可是个重量级而方便的东东啊,缺点是太复杂,学习起来有一定难度。相较而言,jakarta commons提供的stringutils和wordutils至今还维持着那种简洁而强大的美,使用起来也很顺手。来看一个例子:
view plaincopy to clipboardprint? package sean.study.jakarta.commons.lang; import org.apache.commons.lang.stringutils; public class stringutilsandwordutilsusage { public static void main(string[] args) { // data setup string str1 = ""; string str2 = " "; string str3 = "\t"; string str4 = null; string str5 = "123"; string str6 = "abcdefg"; string str7 = "it feels good to use jakarta commons.\r\n"; // check for empty strings system.out.println("=============================="); system.out.println("is str1 blank? " + stringutils.isblank(str1)); system.out.println("is str2 blank? " + stringutils.isblank(str2)); system.out.println("is str3 blank? " + stringutils.isblank(str3)); system.out.println("is str4 blank? " + stringutils.isblank(str4)); // check for numerics system.out.println("=============================="); system.out.println("is str5 numeric? " + stringutils.isnumeric(str5)); system.out.println("is str6 numeric? " + stringutils.isnumeric(str6)); // reverse strings / whole words system.out.println("=============================="); system.out.println("str6: " + str6); system.out.println("str6 reversed: " + stringutils.reverse(str6)); system.out.println("str7: " + str7); string str8 = stringutils.chomp(str7); str8 = stringutils.reversedelimited(str8, ' '); system.out.println("str7 reversed whole words : \r\n" + str8); // build header (useful to print log messages that are easy to locate) system.out.println("=============================="); system.out.println("print header:"); string padding = stringutils.repeat("=", 50); string msg = stringutils.center(" customised header ", 50, "%"); object[] raw = new object[]{padding, msg, padding}; string header = stringutils.join(raw, "\r\n"); system.out.println(header); } }
输出的结果如下:
==============================
is str1 blank? true
is str2 blank? true
is str3 blank? true
is str4 blank? true
==============================
is str5 numeric? true
is str6 numeric? false
==============================
str6: abcdefg
str6 reversed: gfedcba
str7: it feels good to use jakarta commons.
str7 reversed whole words :
commons. jakarta use to good feels it
==============================
print header:
==================================================
%%%%%%%%%%%%%%% customised header %%%%%%%%%%%%%%%%
==================================================
package sean.study.jakarta.commons.lang; import org.apache.commons.lang.stringutils; public class stringutilsandwordutilsusage { public static void main(string[] args) { // data setup string str1 = ""; string str2 = " "; string str3 = "\t"; string str4 = null; string str5 = "123"; string str6 = "abcdefg"; string str7 = "it feels good to use jakarta commons.\r\n"; // check for empty strings system.out.println("=============================="); system.out.println("is str1 blank? " + stringutils.isblank(str1)); system.out.println("is str2 blank? " + stringutils.isblank(str2)); system.out.println("is str3 blank? " + stringutils.isblank(str3)); system.out.println("is str4 blank? " + stringutils.isblank(str4)); // check for numerics system.out.println("=============================="); system.out.println("is str5 numeric? " + stringutils.isnumeric(str5)); system.out.println("is str6 numeric? " + stringutils.isnumeric(str6)); // reverse strings / whole words system.out.println("=============================="); system.out.println("str6: " + str6); system.out.println("str6 reversed: " + stringutils.reverse(str6)); system.out.println("str7: " + str7); string str8 = stringutils.chomp(str7); str8 = stringutils.reversedelimited(str8, ' '); system.out.println("str7 reversed whole words : \r\n" + str8); // build header (useful to print log messages that are easy to locate) system.out.println("=============================="); system.out.println("print header:"); string padding = stringutils.repeat("=", 50); string msg = stringutils.center(" customised header ", 50, "%"); object[] raw = new object[]{padding, msg, padding}; string header = stringutils.join(raw, "\r\n"); system.out.println(header); } }
输出的结果如下:
==============================
is str1 blank? true
is str2 blank? true
is str3 blank? true
is str4 blank? true
==============================
is str5 numeric? true
is str6 numeric? false
==============================
str6: abcdefg
str6 reversed: gfedcba
str7: it feels good to use jakarta commons.
str7 reversed whole words :
commons. jakarta use to good feels it
==============================
print header:
==================================================
%%%%%%%%%%%%%%% customised header %%%%%%%%%%%%%%%%
==================================================
从代码中我们可以大致了解到这个stringutils类简单而强大的处理能力,从检查空串(对null的情况处理很得体),到分割子串,到生成格式化的字符串,使用都很简洁,也很直截了当。
总结
以上就是本文的全部内容,希望对大家有所帮助。
推荐阅读
-
Commons beanutils组件简介
-
Java编程Commons lang组件简介
-
java多线程编程之java线程简介
-
java多线程编程之java线程简介
-
Java Socket编程简介_动力节点Java学院整理
-
Java图形化编程中的键盘事件设计简介
-
关于Java后台解析json时报的错java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntim
-
Java Socket编程简介_动力节点Java学院整理
-
Java编程swing组件JLabel详解以及使用示例
-
Java Swing组件编程之JTable表格用法实例详解