1.有些情況下,Arrays滿足不到你對(duì)數(shù)組的操作?不要緊,ArrayUtils幫你
ArrayUtils
public class TestMain {
public static void main(String[] args) {
int[] nums1 = { 1, 2, 3, 4, 5, 6 };
// 通過(guò)常量創(chuàng)建新數(shù)組
int[] nums2 = ArrayUtils.EMPTY_INT_ARRAY;
// 比較兩個(gè)數(shù)組是否相等
ArrayUtils.isEquals(nums1, nums2);
// 輸出數(shù)組,第二參數(shù)為數(shù)組為空時(shí)代替輸出
ArrayUtils.toString(nums1, "array is null");
// 克隆新數(shù)組,注意此拷貝為深拷貝
int[] nums3 = ArrayUtils.clone(nums1);
// 截取數(shù)組
ArrayUtils.subarray(nums1, 1, 2);
// 判斷兩個(gè)數(shù)組長(zhǎng)度是否相等
ArrayUtils.isSameLength(nums1, nums2);
// 判斷兩個(gè)數(shù)組類型是否相等,注意int和Integer比較時(shí)不相等
ArrayUtils.isSameType(nums1, nums2);
// 反轉(zhuǎn)數(shù)組
ArrayUtils.reverse(nums1);
// 查找數(shù)組元素位置
ArrayUtils.indexOf(nums1, 5);
// 查找數(shù)組元素最后出現(xiàn)位置
ArrayUtils.lastIndexOf(nums1, 4);
// 查找元素是否存在數(shù)組中
ArrayUtils.contains(nums1, 2);
// 將基本數(shù)組類型轉(zhuǎn)為包裝類型
Integer[] nums4 = ArrayUtils.toObject(nums1);
// 判斷是否為空,length=0或null都屬于
ArrayUtils.isEmpty(nums1);
// 并集操作,合并數(shù)組
ArrayUtils.addAll(nums1, nums2);
// 增加元素,在下標(biāo)5中插入10,注意此處返回是新數(shù)組
ArrayUtils.add(nums1, 5, 1111);
// 刪除指定位置元素,注意返回新數(shù)組,刪除元素后面的元素會(huì)前移,保持?jǐn)?shù)組有序
ArrayUtils.remove(nums1, 5);
// 刪除數(shù)組中值為10的元素,以值計(jì)算不以下標(biāo)
ArrayUtils.removeElement(nums1, 10);
}
}
2.還在使用傳統(tǒng)反射嗎?還在被反射的樣板代碼困擾?看commons如何幫助我們簡(jiǎn)化反射的工作,從樣板代碼抽身
ClassUtils
public class TestMain {
public static void main(String[] args) {
// 獲取Test類所有實(shí)現(xiàn)的接口
ClassUtils.getAllInterfaces(Test.class);
// 獲取Test類所有父類
ClassUtils.getAllSuperclasses(Test.class);
// 獲取Test類所在的包名
ClassUtils.getPackageName(Test.class);
// 獲取Test類簡(jiǎn)單類名
ClassUtils.getShortClassName(Test.class);
// 判斷是否可以轉(zhuǎn)型
ClassUtils.isAssignable(Test.class, Object.class);
// 判斷是否有內(nèi)部類
ClassUtils.isInnerClass(Test.class);
}
}
ConstructorUtils
public class TestMain {
public static void main(String[] args) {
// 獲取參數(shù)為String的構(gòu)造函數(shù)
ConstructorUtils.getAccessibleConstructor(Test.class, String.class);
// 執(zhí)行參數(shù)為String的構(gòu)造函數(shù)
Test test = (Test) ConstructorUtils.invokeConstructor(Test.class,
"Hello");
}
}
MethodUtils
public static void main(String[] args) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
// 調(diào)用無(wú)參方法
Test test = new Test();
MethodUtils.invokeMethod(test, "publicHello", null);
// 調(diào)用一參方法
MethodUtils.invokeMethod(test, "publicHello", "Hello");
// 調(diào)用多參方法
MethodUtils.invokeMethod(test, "publicHello", new Object[] { "100",
new Integer(10) });
// 調(diào)用靜態(tài)方法
MethodUtils.invokeStaticMethod(Test.class, "staticHello", null);
}
FieldUtils
public class TestMain {
public static void main(String[] args) throws IllegalAccessException {
Test test = new Test("1", "Ray", "hello");
// 以下兩個(gè)方法完全一樣,都能獲取共有或私有變量,因?yàn)榈谌齻€(gè)參數(shù)都設(shè)置了不檢查
FieldUtils.getDeclaredField(Test.class, "username", true);
FieldUtils.getField(Test.class, "username", true);
// 讀取私有或公共變量的值
FieldUtils.readField(test, "username", true);
// 讀取靜態(tài)變量
FieldUtils.readStaticField(Test.class, "STATIC_FIELD");
// 寫入私有或共有變量
FieldUtils.writeField(test, "username", "RayRay", true);
// 寫入靜態(tài)變量
FieldUtils.writeStaticField(Test.class, "STATIC_FIELD", "static_value");
}
}
3. 很多情況下我們都需要將字符串轉(zhuǎn)換為數(shù)字,或判斷字符串是否是數(shù)字等等操作,NumberUtils幫助我們方便的從字符串轉(zhuǎn)換為數(shù)字,在不使用NumberUtils情況下,若然字符串值不是數(shù)字,使用Integer.parseInt()時(shí)會(huì)報(bào)出java.lang.NumberFormatException,但在NumberUtils的情況下,只會(huì)返回0而不產(chǎn)生錯(cuò)誤
NumberUtils and RandomUtils
public class TestMain {
public static void main(String[] args) throws IllegalAccessException {
String str = "12.7";
/*
* org.apache.commons.lang.NumberUtils已經(jīng)被棄用,
* 注意要引入org.apache.commons.lang.math.NumberUtils
*/
// 判斷字符串是否為整數(shù)
NumberUtils.isDigits(str);
// 判斷字符串是否為數(shù)字
NumberUtils.isNumber(str);
// 獲取參數(shù)中最大的值,支持傳入數(shù)組
NumberUtils.max(10, 20, 30);
// 獲取參數(shù)中最小的值,支持傳入數(shù)組
NumberUtils.min(10, 20, 30);
// 將字符串轉(zhuǎn)換為int類型,支持float,long,short等數(shù)值類型
NumberUtils.toInt(str);
// 通過(guò)字符串創(chuàng)建BigDecimal類型 ,支持int,float,long等數(shù)值
NumberUtils.createBigDecimal(str);
/*
* RandomUtils幫助我們產(chǎn)生隨機(jī)數(shù),不止是數(shù)字類型 ,
* 連boolean類型都可以通過(guò)RandomUtils產(chǎn)生
*/
RandomUtils.nextBoolean();
RandomUtils.nextDouble();
RandomUtils.nextLong();
// 注意這里傳入的參數(shù)不是隨機(jī)種子,而是在0~1000之間產(chǎn)生一位隨機(jī)數(shù)
RandomUtils.nextInt(1000);
}
}
4. 在開(kāi)發(fā)當(dāng)中字符串的使用和操作時(shí)最為頻繁的,而null的字符串經(jīng)常讓我們報(bào)出NullPointerException,在使用StringUtils后,將不需要為字符串的null值而煩惱,卻又提供了更多的操作讓我們更方便的操作字符串
StringUtils
public class TestMain {
public static void main(String[] args) throws IllegalAccessException {
String str = "Hello World";
/*
* 由于StringUtils擁有100+的方法,筆者不逐一列舉用法,
* 只列舉筆者認(rèn)為常用的或筆者使用過(guò)的
*/
// isEmpty和isBlank的區(qū)別在于isEmpty不會(huì)忽略空格,
// " "<--對(duì)于這樣的字符串isEmpty會(huì)認(rèn)為不是空,
// 而isBlank會(huì)認(rèn)為是空,isBlank更常用
StringUtils.isEmpty(str);
StringUtils.isNotEmpty(str);
StringUtils.isBlank(str);
StringUtils.isNotBlank(str);
// strip --> 去除兩端的aa
// stripStart --> 去除開(kāi)始位置的hell
// stripEnd --> 去除結(jié)尾位置的orld
StringUtils.strip(str, "aa");
StringUtils.stripStart(str, "hell");
StringUtils.stripEnd(str, "orld");
// 返回字符串在第三次出現(xiàn)A的位置
StringUtils.ordinalIndexOf(str, "A", 3);
// 獲取str 開(kāi)始為hello結(jié)尾為orld中間的字符串
// 注意此方法返回字符串 -->substringBetween
// 注意此方法返回字符串?dāng)?shù)組(多了個(gè)s) --> substringsBetween
StringUtils.substringBetween(str, "hell", "orld");
StringUtils.substringsBetween(str, "hell", "orld");
// 重復(fù)字符串,第二種重載形式為在重復(fù)中用hahah拼接
StringUtils.repeat(str, 3);
StringUtils.repeat(str, "hahah", 2);
// 統(tǒng)計(jì)參數(shù)2在字符串中出現(xiàn)的次數(shù)
StringUtils.countMatches(str, "l");
// 判斷字符串是否全小寫或大寫
StringUtils.isAllLowerCase(str);
StringUtils.isAllUpperCase(str);
// isAlpha --> 全部由字母組成返回true
// isNumeric -->全部由數(shù)字組成返回true
// isAlphanumeric -->全部由字母或數(shù)字組成返回true
// isAlphaSpace -->全部由字母或空格組成返回true
// isWhitespace -->全部由空格組成返回true
StringUtils.isAlpha(str);
StringUtils.isNumeric(str);
StringUtils.isAlphanumeric(str);
StringUtils.isAlphaSpace(str);
StringUtils.isWhitespace(str);
// 縮進(jìn)字符串,第二參數(shù)最低為 4,要包含...
// 現(xiàn)在Hello World輸出為H...
StringUtils.abbreviate(str, 4);
// 首字母大寫或小寫
StringUtils.capitalize(str);
StringUtils.uncapitalize(str);
// 將字符串?dāng)?shù)組轉(zhuǎn)變?yōu)橐粋€(gè)字符串,通過(guò)","拼接,支持傳入iterator和collection
StringUtils.join(new String[] { "Hello", "World" }, ",");
/*
* 經(jīng)常性要把后臺(tái)的字符串傳遞到前提作為html代碼進(jìn)行解釋,
* 可以使用以下方法進(jìn)行轉(zhuǎn)換,以下方法輸出為
* <p>Hello</p>
*/
StringEscapeUtils.escapeHtml("Hello
");
}
}
5.DateUtils and DateFormatUtils
public class TestMain {
public static void main(String[] args) throws IllegalAccessException {
Date day1 = new Date();
/*
* 由于Aache的DateUtils和DateFormatUtils并沒(méi)有Joda強(qiáng)大,
* 所以在這里只作簡(jiǎn)單的示例
*/
// 增加一天
DateUtils.addDays(day1, 1);
// 減少一年
DateUtils.addYears(day1, -1);
// 格式化時(shí)間,第三參數(shù)為國(guó)際化,表示按美國(guó)時(shí)間顯示
DateFormatUtils.format(day1, "yyyy-MM-dd", Locale.UK);
}
}
讀者在使用時(shí)可能會(huì)發(fā)現(xiàn),MethodUtils和ConstructUtils在org.apache.commons.lang.reflect和org.apache.commons.beanutils都存在,但FieldUtils和ClassUtils只在reflect當(dāng)中存在,因?yàn)閎eanutils提供了另外一種名為PropertyUtils的對(duì)屬性存取更為方便的工具,但PropertyUtils不能獲取傳統(tǒng)反射的Field對(duì)象,筆者建議MethodUtils和ConstructUtils應(yīng)該傾向使用beanutils,因?yàn)閎eanutils就是為反射而存在,更專業(yè)(雖然提供的方法幾乎一樣),而使用ClassUtils和要獲取傳統(tǒng)的Field對(duì)象時(shí)使用reflect中的FieldUtils
總結(jié):
commons工具包很多開(kāi)源組織都有提供,例如google,spring,apache都有各自的工具包,有眾多的選擇,但最終的目的只是為了方便我們程序的開(kāi)發(fā)和維護(hù),簡(jiǎn)化我們編寫一些常用的邏輯,提升我們開(kāi)發(fā)的效率,從而達(dá)到活在開(kāi)源,善用開(kāi)源
ps:
Apache Commons是一個(gè)非常有用的工具包,解決各種實(shí)際的通用問(wèn)題,下面是一個(gè)簡(jiǎn)述表,詳細(xì)信息訪問(wèn)http://jakarta.apache.org/commons/index.html
BeanUtils
Commons-BeanUtils 提供對(duì) Java 反射和自省API的包裝
Betwixt
Betwixt提供將 JavaBean 映射至 XML 文檔,以及相反映射的服務(wù).
Chain
Chain 提供實(shí)現(xiàn)組織復(fù)雜的處理流程的“責(zé)任鏈模式”.
CLI
CLI 提供針對(duì)命令行參數(shù),選項(xiàng),選項(xiàng)組,強(qiáng)制選項(xiàng)等的簡(jiǎn)單API.
Codec
Codec 包含一些通用的編碼解碼算法。包括一些語(yǔ)音編碼器, Hex, Base64, 以及URL encoder.
Collections
Commons-Collections 提供一個(gè)類包來(lái)擴(kuò)展和增加標(biāo)準(zhǔn)的 Java Collection框架
Configuration
Commons-Configuration 工具對(duì)各種各式的配置和參考文件提供讀取幫助.
Daemon
一種 unix-daemon-like java 代碼的替代機(jī)制
DBCP
Commons-DBCP 提供數(shù)據(jù)庫(kù)連接池服務(wù)
DbUtils
DbUtils 是一個(gè) JDBC helper 類庫(kù),完成數(shù)據(jù)庫(kù)任務(wù)的簡(jiǎn)單的資源清除代碼.
Digester
Commons-Digester 是一個(gè) XML-Java對(duì)象的映射工具,用于解析 XML配置文件.
Discovery
Commons-Discovery 提供工具來(lái)定位資源 (包括類) ,通過(guò)使用各種模式來(lái)映射服務(wù)/引用名稱和資源名稱。.
EL
Commons-EL 提供在JSP2.0規(guī)范中定義的EL表達(dá)式的解釋器.
FileUpload
FileUpload 使得在你可以在應(yīng)用和Servlet中容易的加入強(qiáng)大和高性能的文件上傳能力
HttpClient
Commons-HttpClient 提供了可以工作于HTTP協(xié)議客戶端的一個(gè)框架.
IO
IO 是一個(gè) I/O 工具集
Jelly
Jelly是一個(gè)基于 XML 的腳本和處理引擎。 Jelly 借鑒了 JSP 定指標(biāo)簽,Velocity, Cocoon和Xdoclet中的腳本引擎的許多優(yōu)點(diǎn)。Jelly 可以用在命令行, Ant 或者 Servlet之中。
Jexl
Jexl是一個(gè)表達(dá)式語(yǔ)言,通過(guò)借鑒來(lái)自于Velocity的經(jīng)驗(yàn)擴(kuò)展了JSTL定義的表達(dá)式語(yǔ)言。.
JXPath
Commons-JXPath 提供了使用Xpath語(yǔ)法操縱符合Java類命名規(guī)范的 JavaBeans的工具。也支持 maps, DOM 和其他對(duì)象模型。.
Lang
Commons-Lang 提供了許多許多通用的工具類集,提供了一些java.lang中類的擴(kuò)展功能
Latka
Commons-Latka 是一個(gè)HTTP 功能測(cè)試包,用于自動(dòng)化的QA,驗(yàn)收和衰減測(cè)試.
Launcher
Launcher 組件是一個(gè)交叉平臺(tái)的Java 應(yīng)用載入器。 Commons-launcher 消除了需要批處理或者Shell腳本來(lái)載入Java 類。.原始的 Java 類來(lái)自于Jakarta Tomcat 4.0 項(xiàng)目
Logging
Commons-Logging 是一個(gè)各種 logging API實(shí)現(xiàn)的包裹類.
Math
Math 是一個(gè)輕量的,自包含的數(shù)學(xué)和統(tǒng)計(jì)組件,解決了許多非常通用但沒(méi)有及時(shí)出現(xiàn)在Java標(biāo)準(zhǔn)語(yǔ)言中的實(shí)踐問(wèn)題.
Modeler
Commons-Modeler 提供了建模兼容JMX規(guī)范的 Mbean的機(jī)制.
Net
Net 是一個(gè)網(wǎng)絡(luò)工具集,基于 NetComponents 代碼,包括 FTP 客戶端等等。
Pool
Commons-Pool 提供了通用對(duì)象池接口,一個(gè)用于創(chuàng)建模塊化對(duì)象池的工具包,以及通常的對(duì)象池實(shí)現(xiàn).
Primitives
Commons-Primitives提供了一個(gè)更小,更快和更易使用的對(duì)Java基本類型的支持。當(dāng)前主要是針對(duì)基本類型的 collection。.
Validator
The commons-validator提供了一個(gè)簡(jiǎn)單的,可擴(kuò)展的框架來(lái)在一個(gè)XML文件中定義校驗(yàn)器 (校驗(yàn)方法)和校驗(yàn)規(guī)則。支持校驗(yàn)規(guī)則的和錯(cuò)誤消息的國(guó)際化。
聯(lián)系客服