String判空效率比较

今天逛社区时忽然看到以下博主时的博文,说字符串判空的效率,觉得口说无凭,于是自己手动测试了一下,以下是我的测试代码,不足之处,还望大神指教

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("\r<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("\r<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("\r<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     }

瞬间明朗了,吃饭!

时间: 2024-10-18 21:33:15

String判空效率比较的相关文章

C#:string判空

1.  string.IsNullOrEmpty (str) .Net 2 可用,也就是 Unity 能用 str = ""    ---> true str = " "   ---> false str = null  ---> true 2. String.IsNullOrWhiteSpace(str) namespace为:System.String .Net 4 可用,也就是 Unity 不能用 本质上相当于:string.IsNullOr

String类型判空、

针对前后含有空格.有空格的.空字符串.以及null字符的判断 public static void main(String[] args) { String s1 = ""; String s2 = null; String s3 = " "; String s4 = "hello"; String s5 = " hello "; System.out.println("1:" + isEmpty(s1))

【Java】String的首尾去空和判空

去除字符串首尾空白字符:包括\t,\r,\n及" ": //去除字符串首尾空白字符:包括\t,\r,\n及" ": System.out.println("\t \nHello\r".trim()); System.out.println("\t \nHello\r".strip()); 判空和空白字符串: 1 //判空和空白字符串 2 System.out.println("".isEmpty()); /

判空工具类——Java

代码 import java.util.Collection; /** * 判空工具类 */ public class EmptyUtil { /** * 判断字符串是否为空,长度为0被认为是空字符串. * * @param str * @return */ public static boolean isEmpty(String str) { if (str != null) { return str.trim().length() == 0; } else { return true; }

java / android int类型如何判空?

/** TextUtils.isEmpty() 方法的实现 * Returns true if the string is null or 0-length. * @param str the string to be examined * @return true if str is null or zero length */ public static boolean isEmpty(@Nullable CharSequence str) { if (str == null || str.

StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)

Apache commons lang3包下的StringUtils工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便.最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的方法总结了一下,方便以后查阅,大家有兴趣也可以看一下.   首先需要说明的一点是,StringUtils类在操作字符串时,即使操作的为null值也是安全的,不会报NullPointerException,这一点在后面的例子中再具体说明.因此,在操作字符串时使用StringUtils相比使用原生的Strin

高级工程师系列之在Java中如何优雅地判空

判空灾难 NullPointerException 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException. 不过NullPointerException对于很多猿们来说,也是Exception家族中最亲近的一员了. Wowo 为了避免NullPointerException来找我们,我们经常会进行如下操作. if (data != null) {do sth.}如果一个类中多次使用某个对象,那你可能要一顿操作,so: 1 "

在Java中如何优雅地判空

http://blog.imuxuan.com/archives/86 在Java中如何优雅地判空 2018年11月22日 / 665次浏览 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException. 不过NullPointerException对于很多猿们来说,也是Exception家族中最亲近的一员了. 为了避免NullPointerException来找我们,我们经常会进行如下操作. if (data != nu

【C++】容器适配器实现队列Queue的各种功能(入队、出队、判空、大小、访问所有元素等)

适配器: 将一个通用的容器转换为另外的容器,所谓的容器,指的是存放数据的器具,像我们知道的顺序表和链表都是容器Container.举个例子解释一下吧,我们的电压都是220v,而像充电线就起到转换到合适的电压的作用.而这里,我们的主角就是将通用的链表结构转换为来实现队列Queue这一数据结构,(意思就是,链表还可以去实现其他的数据结构). 在线性表中,分为链表和顺序表,我们知道其中的差别: 链表:节点灵活,使得插入删除元素方便灵活,但是对于单链表若有节点指针_head._tail,查找元素较为麻烦