1.你知道ApacheCommon包中isNumeric方法是坑吗?
2.HttpClient4.5使用Commons-logging作为日志记录接口
3.JSP ä¸ä¼ ä¸è½½ä»£ç
4.Java必修课判断String是否包含子串的四种方法及性能对比
5.java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
你知道ApacheCommon包中isNumeric方法是坑吗?
使用的Apache-Common包的版本是commons-lang-2.6.jar
本文就来分享一个这个坑的情况,以免其它tx也掉坑中
费话不多说,来看代码: package chapter4; import org.apache.commons.lang.StringUtils; /** * Created by MyWorld on /3/. */ public class StringUtilsIsNumericChecker { public static void main(String[] args) { System.out.println(StringUtils.isNumeric("1")); System.out.println(StringUtils.isNumeric("-1")); } }
围观的tx,认为上面api的输出结果会是什么呢?两个true? 好吧,执行一行看看结果: true false
什么情况,-1不是cgi plus源码数字吗? 为什么是false呢 来分析下源码: public static boolean isNumeric(String str) { if (str == null) { return false; } int sz = str.length(); for (int i = 0; i sz; i++) { if (Character.isDigit(str.charAt(i)) == false) { return false; } } return true; }
源码中判断是否数字的依据是JDK的API: java.lang.Character.isDigit(str.charAt(i)) 看看个API的源码: public static boolean isDigit(char ch) { return isDigit((int)ch); }
看看isDigit(int codePoint)的源码: public static boolean isDigit(int codePoint) { boolean bDigit = false; if (codePoint = MIN_CODE_POINT codePoint = FAST_PATH_MAX) { bDigit = CharacterDataLatin1.isDigit(codePoint); } else { int plane = getPlane(codePoint); switch(plane) { case(0): bDigit = CharacterData.isDigit(codePoint); break; case(1): bDigit = CharacterData.isDigit(codePoint); break; case(2): bDigit = CharacterData.isDigit(codePoint); break; case(3): // Undefined case(4): // Undefined case(5): // Undefined case(6): // Undefined case(7): // Undefined case(8): // Undefined case(9): // Undefined case(): // Undefined case(): // Undefined case(): // Undefined case(): // Undefined bDigit = CharacterDataUndefined.isDigit(codePoint); break; case(): bDigit = CharacterData0E.isDigit(codePoint); break; case(): // Private Use case(): // Private Use bDigit = CharacterDataPrivateUse.isDigit(codePoint); break; default: // the argument's plane is invalid, and thus is an invalid codepoint // bDigit remains false; break; } } return bDigit; }
下面还有更深的调用,貌似还涉及到ASCII码了。 水太深,就不继续看了。 有一点是肯定的,这个API不是通过类似Regex expression的方式来判断是数字,而通过每个字符的ASCII的值类确定的 回到API的isNumeric(String str), 看看Doc是怎么说的: /** * pChecks if the String contains only unicode digits. * A decimal point is not a unicode digit and returns false./p * * pcodenull/code will return codefalse/code. * An empty String (length()=0) will return codetrue/code./p * * pre * StringUtils.isNumeric(null) = false * StringUtils.isNumeric("") = true * StringUtils.isNumeric(" ") = false * StringUtils.isNumeric("") = true * StringUtils.isNumeric(" 3") = false * StringUtils.isNumeric("ab2c") = false * StringUtils.isNumeric("-3") = false * StringUtils.isNumeric(".3") = false * /pre * * @param str the String to check, may be null * @return codetrue/code if only contains digits, and is non-null */
看完上面的Doc,感觉水好深。 这个API的方法名直接命名为isInt不就完了。方法名很容易误导人 这也是给开发的tx敲了一个警钟, api使用之前一定要确认清楚,公益组织源码至少看看Doc文档吧
HttpClient4.5使用Commons-logging作为日志记录接口
Apache HttpClient 4.5采用Commons-logging作为日志记录接口,此接口被广泛应用于日志实现与解耦设计。在org.apache..jci.upload.servlet;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet..jci.upload.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
5.åå¸
okäº
è¿æ¯æåå§çä¸ä¼ æ件çåæ³ï¼ç°å¨struts2ä¸ä¼ çè¯ï¼å°±è¦è½»æ¾å¥½å¤
Java必修课判断String是否包含子串的四种方法及性能对比
判断一个字符串是否包含某个特定子串是常见的场景,比如判断一篇文章是否包含敏感词汇、判断日志是否有ERROR信息等。本文将介绍四种方法并进行性能测试。 在String的函数中,提供了indexOf(subStr)方法,spring 2.5.6 源码返回子串subStr第一次出现的位置,如果不存在则返回-1。例子如下: 最直观判断的方法是contains(subStr),返回类型为boolean,如果包含返回true,不包含则返回false。例子如下: 实际上,String的mule esb源码contains方法是通过调用indexOf方法来判断的,源码如下: 通过强大的正则匹配来判断,虽然有点杀鸡用牛刀的感觉,但也不是不能用,例子如下: Apache的commons-lang3提供许多开箱即用的功能,StringUtils就提供了许多与字符串相关的功能,例子如下: 我们使用JMH工具来对四种方法进行性能测试,Maven引入代码如下: 测试代码如下: 测试结果如下: 最快的就是indexOf方法,其次是goahead 源码下载contains方法,二者应该没有实际区别,contains是调用indexOf来实现的。Apache的StringUtils为第三方库,相对慢一些。最慢的是使用了正则的Pattern的方法,这不难理解,正则引擎的匹配是比较耗性能的。 本文介绍了判断一个字符串是否包含某个特定子串的四种方法,并通过性能测试进行了对比。其中性能最好的是String的indexOf方法和contains方法,建议使用contains方法,性能好,跟indexOf相比,更直观,更不容易犯错。毕竟让每个人时刻记住返回-1代表不存在也不是一件容易的事。 但是,使用indexOf和contains方法都需要注意做判空处理,这时StringUtils的优势就体现出来了。 总结,四种方法如下:indexOf(subStr):返回子串第一次出现的位置,不存在返回-1。
contains(subStr):返回true或false,是否包含。
Pattern匹配:使用正则匹配,相对耗性能。
StringUtils.contains:Apache库提供,相对慢。
性能测试结果显示,indexOf和contains方法最佳,建议使用contains方法。Apache库的StringUtils方法相对慢,正则匹配方法最慢。在使用方法时,注意处理空值问题。希望本文能帮助你更好地理解和使用这些方法。java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
å»ä¸è½½ä¸ä¸ªapache commons
mons.apache.org/
log4j.jar
Logging.jar
OK
Log4jæ¯Apacheçä¸ä¸ªå¼æ¾æºä»£ç 项ç®ï¼éè¿ä½¿ç¨Log4jï¼æ们å¯ä»¥æ§å¶æ¥å¿ä¿¡æ¯è¾éçç®çå°æ¯æ§å¶å°ãæ件ãGUIç»ä»¶ãçè³æ¯å¥æ¥å£æå¡å¨ãNTçäºä»¶è®°å½å¨ãUNIX Syslogå®æ¤è¿ç¨çï¼æ们ä¹å¯ä»¥æ§å¶æ¯ä¸æ¡æ¥å¿çè¾åºæ ¼å¼ï¼éè¿å®ä¹æ¯ä¸æ¡æ¥å¿ä¿¡æ¯ç级å«ï¼æ们è½å¤æ´å ç»è´å°æ§å¶æ¥å¿ççæè¿ç¨ãæ令人æå ´è¶£çå°±æ¯ï¼è¿äºå¯ä»¥éè¿ä¸ä¸ªé ç½®æ件æ¥çµæ´»å°è¿è¡é ç½®ï¼èä¸éè¦ä¿®æ¹åºç¨ç代ç ã
static Logger logger = Logger.getLogger(MyApp.class.getName());
logger.info("exception");