Java 数据结构三剑客!

512次阅读  |  发布于3年以前

你们业余时间做的最多的事情是什么?哪一个消耗的时间长,我每天除了上班,下班回去就是写文章,看文章,然后学习。

虽然很充实,但是很单调啊,是不是自己该找一个兴趣爱好来搭配一下。

废话不多说了,开始今天的内容。

今天主要说说 Java中的 String、StringBuffer和StringBuilder ,都是我们经常使用的,可能有些你只是使用,并不知道他好在哪里,或者有些你现在的使用是错误的。

01

概念

至于概念基本都了解,他们都是处理字符串的,比如字符串定义,拼接,截取等等。

那么他们都是来自什么类呢?

java.lang.String

java.lang.StringBuffer

java.lang.StrungBuilder

我们来说一下他们都有那些特点呢?

1,三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。

2,StringBuffer是线程安全,可以不需要额外的同步用于多线程中;

3,StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;

4,StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。

5,String实现了三个接口: Serializable、Comparable、CarSequence

StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。

02

运行速度

对比的时候我首先考虑的就是速度,毕竟效率是最主要的,我们通过时间的长短来判定,那个效率高。

public static void main(String[] args) {
long a=new Date().getTime();
        String cc="";
int n=10000;
for (int i = 0; i < n; i++) {
            cc+="."+i;
        }
   System.out.println("String的时间"+(System.currentTimeMillis()-a)/1000.0+"s");
long s1=System.currentTimeMillis();
        StringBuilder sb=new StringBuilder();
for (int i = 0; i < n; i++) {
            sb.append("."+i);
        }
   System.out.println("StringBuilder的时间"+(System.currentTimeMillis()-s1)/1000.0+"s");
long s2=System.currentTimeMillis();
        StringBuffer sbf=new StringBuffer();
for (int i = 0; i < n; i++) {
            sbf.append("."+i);
        }
        System.out.println("StringBuffer的时间"+(System.currentTimeMillis()-s2)/1000.0+"s");

    }

打印结果: String的时间1.558s StringBuilder的时间0.004s StringBuffer的时间0.012s

通过对比发现,StringBuilder效率是最高的,StringBuffer次之,String是最低的。所以建议大家以后考虑最好的使用。

03

安全考虑

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。

所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

建议使用的场景:

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

04

应用

在使用方面,这里说几个技术点,这样更能直观的了解。

1,String与StringBuffer相互转换

由于String一旦赋值就不能改变为了,所以需要转换,使用StringBuffer的功能,而StringBuffer还有多种操作。 转换方式: (StringBuffer sb = new StringBuffer(str);)

2,StringBuffer向String转。

因为需要的结果是String类型,所以直接通过 toString的方式 (String str = sb.toString();)

3.字符串拼接实例

public class StringBufferDemo {
public static void main(String[] args) {
  //创建StringBuffer对象
  StringBuffer sb2 = new StringBuffer();
  //因为append()返回缓冲区本身
  sb2.append("程序职场").append(false); //链式编程
  //sb.reverse();
  //String s = new String(sb);//反转并转成String类型,不简洁
  //反转并转成String类型
  System.out.println(sb2.reverse().toString());

  StringBuilder sb3 = new StringBuilder();
  sb3.append("公众号:程序职场");
// sb3.setLength(1);//缓冲区设置为1
  System.out.println(sb2.reverse().toString());
  }
}

1,StringBuffer可以通过append的方式拼接字符串

2,String是直接new一个对象赋值

3, StringBuilder和StringBuffer 的用法都差不多

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8