论坛首页 Java企业应用论坛

验证String是不是整数,用异常作判断怎么了!

浏览 13417 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-12-30  
public static boolean validateInteger(String str) { 
try { 
        Integer.parseInt(str); 
     } catch (Exception ex) { 
         return false; 
     } 
     return true; 


怎么就那么多人想不开呢?
我就不明白了,用异常做判断怎么了?

这方法到底有什么问题呀?

看不懂?不可能呀。6行代码。

性能不好?我只能说,没看见的话,别瞎说。

和书里说的不一样? 书里就算列了180条异常怎么用的规则。在实践中就是有一种用法和书里不一样,那怎么办?这并不代表这种方法错了,你要看实践的效果,这才能衡量这个方法好不好.. 多动动脑,想想是不是书里的那些规则对于这个代码不起作用。

那到底什么原因,说这代码不能用呢???
   发表时间:2010-12-30   最后修改:2010-12-30
gdpglc 写道


性能不好?我只能说,没看见的话,别瞎说。



我只好来瞎说一下了。主要还是性能问题,这个方法如果调用次数不多,怎么写都无所谓,如果次数多还是不要这样用的好。

public class Test {
	public static boolean validateInteger(String str) {
		try {
			Integer.parseInt(str);
		} catch (Exception ex) {
			return false;
		}
		return true;
	}

	public static boolean validateInteger2(String str) {
		char[] chars = str.toCharArray();
		for (int i = 0; i < chars.length; i++) {
			if ((chars[i] > '9' || chars[i] < '0') && !(i == 0 && chars[0] == '-' && chars.length > 1)) {
				return false;
			}
		}
		return chars.length > 0;
	}

	private static final int TIME = 100000;

	private static final String STR_WRONG = "1234567890XX";
	private static final String STR_RIGHT = "1234567890";

	private static final boolean JIT = false;

	public static void main(String[] args) {

		if (JIT) {
			for (int i = 0; i < 1000000; i++) {
				validateInteger("0");
				validateInteger2("0");
			}
			System.out.println("进行JIT预热");
		} else {
			System.out.println("不进行JIT预热");
		}

		long l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger(STR_RIGHT);
		}
		System.out.println("字符串为整数,验证方式1:" + (System.nanoTime() - l) + "ns");
		l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger2(STR_RIGHT);
		}
		System.out.println("字符串为整数,验证方式2:" + (System.nanoTime() - l) + "ns");
		l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger(STR_WRONG);
		}
		System.out.println("字符串为非整数,验证方式1:" + (System.nanoTime() - l) + "ns");
		l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger2(STR_WRONG);
		}
		System.out.println("字符串为非整数,验证方式2:" + (System.nanoTime() - l) + "ns");
	}
}


引用

进行JIT预热
字符串为整数,验证方式1:9535717ns
字符串为整数,验证方式2:8934368ns
字符串为非整数,验证方式1:2029725263ns
字符串为非整数,验证方式2:7702305ns

不进行JIT预热
字符串为整数,验证方式1:25392935ns
字符串为整数,验证方式2:15882435ns
字符串为非整数,验证方式1:2058369758ns
字符串为非整数,验证方式2:9489115ns


如果不出现异常,那性能其实差不了多远,尤其是JIT编译了之后。但出现了异常就有两百多倍的差距,还是很客观的。
0 请登录后投票
   发表时间:2010-12-30  
弱弱的问一下:进行JIT预热是什么意思,为什么不进行JIT预热和进行JIT预热差别那么大呢?谢谢!
0 请登录后投票
   发表时间:2010-12-30  
9个问号, 就是不想自己写个代码测试下。

你这是撒泼呢
1 请登录后投票
   发表时间:2010-12-30   最后修改:2010-12-30
IcyFenix 写道
gdpglc 写道


性能不好?我只能说,没看见的话,别瞎说。



我只好来瞎说一下了。主要还是性能问题,这个方法如果调用次数不多,怎么写都无所谓,如果次数多还是不要这样用的好。

public class Test {
	public static boolean validateInteger(String str) {
		try {
			Integer.parseInt(str);
		} catch (Exception ex) {
			return false;
		}
		return true;
	}

	public static boolean validateInteger2(String str) {
		char[] chars = str.toCharArray();
		for (int i = 0; i < chars.length; i++) {
			if ((chars[i] > '9' || chars[i] < '0') && !(i == 0 && chars[0] == '-' && chars.length > 1)) {
				return false;
			}
		}
		return chars.length > 0;
	}

	private static final int TIME = 100000;

	private static final String STR_WRONG = "1234567890XX";
	private static final String STR_RIGHT = "1234567890";

	private static final boolean JIT = false;

	public static void main(String[] args) {

		if (JIT) {
			for (int i = 0; i < 1000000; i++) {
				validateInteger("0");
				validateInteger2("0");
			}
			System.out.println("进行JIT预热");
		} else {
			System.out.println("不进行JIT预热");
		}

		long l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger(STR_RIGHT);
		}
		System.out.println("字符串为整数,验证方式1:" + (System.nanoTime() - l) + "ns");
		l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger2(STR_RIGHT);
		}
		System.out.println("字符串为整数,验证方式2:" + (System.nanoTime() - l) + "ns");
		l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger(STR_WRONG);
		}
		System.out.println("字符串为非整数,验证方式1:" + (System.nanoTime() - l) + "ns");
		l = System.nanoTime();
		for (int i = 0; i < TIME; i++) {
			validateInteger2(STR_WRONG);
		}
		System.out.println("字符串为非整数,验证方式2:" + (System.nanoTime() - l) + "ns");
	}
}


引用

进行JIT预热
字符串为整数,验证方式1:9535717ns
字符串为整数,验证方式2:8934368ns
字符串为非整数,验证方式1:2029725263ns
字符串为非整数,验证方式2:7702305ns

不进行JIT预热
字符串为整数,验证方式1:25392935ns
字符串为整数,验证方式2:15882435ns
字符串为非整数,验证方式1:2058369758ns
字符串为非整数,验证方式2:9489115ns


如果不出现异常,那性能其实差不了多远,尤其是JIT编译了之后。但出现了异常就有两百多倍的差距,还是很客观的。

我要是用 c 重写一下这个方法,我没试,我想还能差出200倍。那你是不是要用JNI来调用C写的方法呀? 你看见过软件出问题吗? 看见过软件真出现性能瓶颈时是什么样吗? 从你写的代码上看,你100%没看见过。所以还是瞎说。
你认为你的代码代来了高性能吗?
1000000次调用最多差出2秒。你知到如果软件在1000000次涉及到数据库的处理时会产生多少延迟吗?你的软件真有这么频繁的数据处理时,数据库早就先出现问题了。

我定义一下什么叫瞎说:就是没有在真正给用户使用的软件中,发现使用异常判断方式产生性能问题的都叫瞎说。
0 请登录后投票
   发表时间:2010-12-30  
我的确遇到过几次性能问题。经验是,在内存里进行的操作,不用考虑它的执行速度,因为现在的cpu足够快,内存中的操作,是有差异,但对于应用来说几乎都是不能查觉的。那这种差异即可忽略。
0 请登录后投票
   发表时间:2010-12-30  
如果 性能问题是用户感觉不到的,只有那些自认为了不起的高手能感觉到,我看这就是笑话。
0 请登录后投票
   发表时间:2010-12-30  
象这种数据校验,通常都是用在用户输入的校验上。你认为,你费劲把力的给用户省了几个ns,用户会感谢你吗?
0 请登录后投票
   发表时间:2010-12-30  
java做的事,就是尽量给程序员空间。在性能上给程序员很大的余量。正因为如此,现在的软件行业门坎才不高。

你以为我不知道抛异常会花时间吗?可是我更知道,对于这个问题,这点时间是可以忽略的。

按你的逻辑我看,hibernate估计也是不能用了,你再测测jdbc和hibernate差多少倍...
0 请登录后投票
   发表时间:2010-12-31  
我是最受不了拿性能说事的人。因为根本不懂,还以为自已明白...
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics