java jdk1.6 string.isempty 和"".equals(string)哪个性能快?理由是什么?请高人指...

javajdk1.6string.isempty和"".equals(string)哪个性能快?理由是什么?请高人指点,谢...... java jdk1.6 string.isempty 和"".equals(string)哪个性能快?理由是什么?请高人指点,谢... 展开
 我来答
dngoryaner
推荐于2016-10-02 · TA获得超过2350个赞
知道小有建树答主
回答量:2404
采纳率:0%
帮助的人:1137万
展开全部
以下是 Java 判断字符串是否为空的三种方法.

方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低.

方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法.

方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二.

以下代码在我机器上的运行结果: (机器性能不一, 仅供参考)

function 1 use time: 141ms

function 2 use time: 46ms

function 3 use time: 47ms

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();

}

}

我使用的equals()、length()和JDK6之后的 isEmpty(),在性能上原文分析结果是equals()性能几乎是length()的3.5倍,这个我不敢苟同,我实际测试的结果如下:

equals use time: 110ms
length use time: 78ms

还没到2倍,于是乎我查看了String的源码:

public int length() {
return count;
}

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}

通过源码我很容易发现length()的效率要高于equals(),length()直接返回String对象的Count属性,而equals()需要先进行判断目标比对对象的类型,然后再进行其它操作,同时还要遍历String对象的每一个char,查看是否相同。

同时原文提到的JDK6提供的String .isEmpty()方法我没有安装JDK6,所以只能替代行的查看了Commons-lang-2.6内StriingUtils的该方法,我相信JDK6的源码与它应该是相同的,源码如下:

public static boolean isEmpty(String str)
{
return (str == null) || (str.length() == 0);
}

可见isEmpty()同样也使用了length()方法,呵呵~只能说apache不傻。

综上我们可以清晰的得出三者性能上的优劣。equals() << length() / isEmpty()
coffeezhu007
2012-05-08 · TA获得超过715个赞
知道小有建树答主
回答量:638
采纳率:0%
帮助的人:427万
展开全部
isEmpty()快于equals

equals 的底层是还要转成CHAR比较的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
artintin
2012-05-08 · TA获得超过1.2万个赞
知道大有可为答主
回答量:7508
采纳率:80%
帮助的人:2882万
展开全部
效果一样
若是string 是不是空值,比较两者长度自然就返回了正确结果
但当string 是空值时string.isempty 会抛出java.lang.NullPointerException例外
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式