判断 Java 中的空字符串

Mar 4th, 2008 Add Comment

以下是 Java 判断字符串是否为空的三种方法.
方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低.
方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法.
方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二.

以下代码在我机器上的运行结果: (机器性能不一, 仅供参考)
function 1 use time: 172ms
function 2 use time: 78ms
function 3 use time: 79ms

public class CompareStringNothing {
	String s = "";
	long n = 10000000;
 
	private void function1() {
		long startTime = System.currentTimeMillis();
 
		for(long i = 0; i < n; i++) {
			if(s == null || s.equals(""));
		}
		long endTime = System.currentTimeMillis();
 
		System.out.println("function 1 use time: "+ (endTime - startTime) +"ms");
	}
 
	private void function2() {
		long startTime = System.currentTimeMillis();
 
		for(long i = 0; i < n; i++) {
			if(s == null || s.length() <= 0);
		}
		long endTime = System.currentTimeMillis();
 
		System.out.println("function 2 use time: "+ (endTime - startTime) +"ms");
	}
 
	private void function3() {
		long startTime = System.currentTimeMillis();
 
		for(long i = 0; i < n; i++) {
			if(s == null || s.isEmpty());
		}
		long endTime = System.currentTimeMillis();
 
		System.out.println("function 3 use time: "+ (endTime - startTime) +"ms");
	}
 
	public static void main(String[] args) {
		CompareStringNothing com = new CompareStringNothing();
		com.function1();
		com.function2();
		com.function3();
	}
}
声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 判断 Java 中的空字符串

  1. http://0.gravatar.com/avatar/e863ef6909a5594649b156aae3ee46b6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博主之是填充一下博客,各位就不要认真了 呵呵,实现的方式千千万万

  2. http://0.gravatar.com/avatar/c20a22699d13188de7aa1824ef342569?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不对吧
    在循环中 s.leng() 始终只算一次 所以发的时间很少 s.equals 每次都比较所以时间长
    for(long i = 0; i < n; i++) {
    s=""+i;
    if(s == null || s.equals(""));
    }
    你这样试试 s.leng() 发的时间是更长的
    所以对于单次运算来说 s.equals 比 s.leng() 发的时间更少

  3. http://0.gravatar.com/avatar/c392fd14a2c8ee13a5e6f5db478e129f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    用apache commons 提供的StringUtils判断不是更好.有轮子.没有必要发明轮子了吧

  4. http://0.gravatar.com/avatar/c9871eff6e22bb6229fa6dd14ad09db2?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @忘记月亮:
    如果null,则throws NullPointerException;

  5. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很注重效率啊

  6. http://1.gravatar.com/avatar/5f70fab8d4b87573c035894f32ae70b1?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    public static boolean stringIsEmpty(String testStr){
    StringBuffer sb = new StringBuffer(testStr);
    for(int i = 0;i < sb.length(); i ++){
    Character ch = new Character(sb.charAt(i));
    if(!ch.equals(' '))
    return false;
    }
    return true;
    }
    这不很简单吗?用不着JDK6.0来支持.

  7. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @忘记月亮:
    s == null 是有必要存在的.
    如果 String 类型为 null, 而去进行 equals(String) 或 length() 等操作会抛出异常的.

  8. http://0.gravatar.com/avatar/c4e6643ae2a4a07665ae1723450e5e60?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    怎么3个方法中都用到了s==null,是不是没有必要考虑这个?
    String s=null和s==""应该存在区别吧,前者并没有在并没有在栈中存放数据,后者则在栈中开辟了一个内容为空的空间。前者的对象s没有指向,后面的有。
    只是个人理解,不知道对不对?

  9. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    汗... 复习一下而已.
    isEmpty 是 1.6 才有的, 现在大多还在用 1.4.2 或 1.5 吧.

  10. http://1.gravatar.com/avatar/bca4d64891bb457b13007c04e77fee19?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    也是俺偶像.^^

  11. http://0.gravatar.com/avatar/0b8c305e8b312931ee21ca18d79eab35?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    好专业!mg12是俺偶像@-@

  12. http://0.gravatar.com/avatar/e1bdf3a548d59e1d98cc812af5363902?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Java还有isEmpty函数哦...受教了

  13. http://1.gravatar.com/avatar/7c9412d8d9386b950a3ebfe8bfedc053?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    汗, 基本用第一种..

  14. http://1.gravatar.com/avatar/bc0c69a6bf72455c4abb653a1d70747a?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    深夜还发文啊, 我在边等看球, 边搞那个评论框, 头大, 搞了好久