今天逛社区时忽然看到以下博主时的博文,说字符串判空的效率,觉得口说无凭,于是自己手动测试了一下,以下是我的测试代码,不足之处,还望大神指教
http://blog.csdn.net/fengxuezhiye/article/details/7763384
1.下面是测试100万次的代码
1 package testData; 2 3 public class TestData { 4 public static void main(String[] args) { 5 //不需要导入包 6 //在你的方法第一行加上: 7 //long a=System.currentTimeMillis(); 8 //在最好的一行加上: 9 //System.out.println(" <br>执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 "); 10 String name=""; 11 String name2="aa"; 12 String name3=null; 13 // 测试空 14 long a=System.currentTimeMillis(); 15 for(int i=0;i<1000000;i++){ 16 if(name == null || name.equals("")){ 17 18 } 19 } 20 System.out.println(" <br>执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 "); 21 // 测试长度 22 long a2=System.currentTimeMillis(); 23 for(int i=0;i<1000000;i++){ 24 if(name == null || name.length() <= 0){ 25 26 } 27 } 28 System.out.println(" <br>执行耗时 : "+(System.currentTimeMillis()-a2)/1000f+" 秒 "); 29 } 30 }
以下是三次运行的效果
(1)
(2)
(3)
2.下面是1万次的测试结果
3.结果 事实证明 比较长度确实比比较空效率 高
但是我不甘心如此,又去网上搜了其他资料
以下是搜集的资料
1.关于String str = "abc" 的内部工作。Java内部将此语句转化为以下多个 步骤:
(1 )先定义一个名为str的对String类的对象引用变量:String str;
(2 )在栈中查找有没有存放值为 "abc" 的地址,如果没有,则开辟一个存放字面值为 "abc" 的地址,接着建立 一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为 "abc" 的地址,则查找对象o,并返回o的地址。
(3 )将str指向对象o的地址。
值得留心 的是,一般String类中字符串值都是直接存值的。但像String str = "abc" ;这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!
2.官方的String的equals的重写源码
1 public boolean equals(Object anObject) { 2 if (this == anObject) { 3 return true; 4 } 5 if (anObject instanceof String) { 6 String anotherString = (String)anObject; 7 int n = count; 8 if (n == anotherString.count) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = offset; 12 int j = anotherString.offset; 13 while (n-- != 0) {//看到这忽然就明白了 14 if (v1[i++] != v2[j++]) 15 return false; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
瞬间明朗了,吃饭!