强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan

       看到String是不是有种熟悉的赶脚,String是由字符拼接成的串。他们三者虽然都是和字符串打交道,但是在性能上也是有个伯仲叔的,一般情况下String是这三者中的最慢,其次是StringBuffer,然后是StringBuilder。String是“字符串常量”,StringBuffer是“字符串变量”(线程安全),StringBuilder是“字符串变量”(非线程安全),StringBuilder经常用在单线程的情况下。相信有些编程经验的人都对常量和变量有个理解,看他们三者的汉语解释清楚的可知,String是常量,也就是一旦定义好了就不会改变,有的人就感觉很奇怪,既然是常量,我们平时也用String来拼接呀!进入正题:

 探秘String

      为了下述的Demo我们可以更高效的理解,先来弄明白equals和==的区别:

      java中的所有对象都是继承自Object类的,equals是String对象的一个方法,是可以直接点出来的,他相比较的是两个对象的值是否相等,只要值相等结果就为True。

     ==比较的不仅仅是两个对象的值是否相等,还要比较两个对象的引用是否是否一样,也就是是否指向同一个对象,在值相等,引用相同的前提下比较结果才为True。

      来看几段代码:

//<span style="font-family: Arial, Helvetica, sans-serif;">1.</span>第一种情况

   String s1 = "hello";
   String s3 = "hello";  <pre name="code" class="java">   System.out.println(s1.equals(s3);  //结果为True

System.out.println(s1==s3); //结果为True

 

       

       解说:在程序 运行的时候会创建一个字符串缓冲池用来存放创建的字符串,第一次我们创建了s1指向hello这个对象,当创建s3的时候会先去缓冲池中查找相同值的对象,找到后将s3的引用指向s1创建时的hello对象,他们指向了同一个对象,自然值也相等,因此两种类型的比较结果都是True。

                            

                               

//2.第二种情况
   s1 = new String("hello");
   s2 = new String("hello");
   System.out.println(s1.equals(s2);  //结果为True
   System.out.println(s1==s2);  //结果为False

     解说:new是创建新对象的过程,因此s1和s2是两个不同的对象。由于这两个对象的值相等,所以equals的结果为True,而==的结果为False.

                           

区别String、StringBuffer、StringBuilder

     String拼接字符串有两种情况:这两种情况虽然结果相同,但是效率相差甚远,第一种情况下JVM自动默认优化,默认为s1="ab",在本文开篇就讲解了String是字符串常量,也就意味着对String对象进行拼接是不会对原对象造成影响,而是会形成新对象,对新对象进行的操作。也就出现了第二种情况,创建一个s1对象,再创建第s2对象,拼接的时候再创建一个s3对象,拼接处的s3="ab",自然效率是不同的。

//1.第一种情况
   String s1 = "a" + "b"; //拼接

//2.第二种情况
   String s1 = "a";
   String s2 = "b";
   String s3 = "a" + "b";  //拼接

      String是不可变的,每一次改变都会生成新的对象,而StringBuffer每次拼接是在原对象的基础上拼接,以append方法为例:

//3.第三种情况
//String和StringBuffer
   String s = "a";
   StringBuffer s1 = new StringBuffer(a);
   s1.append("b");   //拼接
   s = "a" + "b";     //拼接

       
       4.StringBuffer和StringBuilder

        他们两个前者是线程安全,后者是非线程安全,前者在线程同步保证线程安全时导致性能下降,后者不是线程安全的,在单线程的情况下提高了性能。在单线程的情况下后者是比较快的。

结论

      1.需要动态拼接的时候使用StringBuffer或StringBuilder,而不建议使用String

      2.没必要多线程同步时使用StringBuilder效率较高

      3.必须用多线程时使用StringBuffer效率较高
 


 

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐