Java学习里程-----Java基础_17String类(下)

我们接着说,不知道的可以先去看看上一篇《Java学习里程-----Java基础_17String类(上)

七、String和StringBuffer和StringBuilder

这三个东西在面试的时候经常会被提问道,他们都可以创建字符串对象,但是却又有着区别。

我们可以通过源码来看一下他们的继承关系。

Java学习里程-----Java基础_17String类(下)

Java学习里程-----Java基础_17String类(下)

Java学习里程-----Java基础_17String类(下)

我们可以发现StringBuffer和StringBuilder是继承、实现的接口是一样的。但是呢却不能说他俩也是一样的。

我们上面讲过,在实例化一个String对象的时候,会在内存空间中会操作两次,弄两个对象出来。这样就意味着内存的浪费,效率还低,所以为了应对经常性的字符串相关的操作,Java中引入了两个新的类——StringBuffer类和StringBuild类。

这也是StringBuffer和StringBuilder的一种特性,它俩实例化对象能够被多次的修改,并且不产生新的未使用对象。

我们上面提到了,他俩继承、实现的接口都是一样的,为啥不同呢?我们可以继续看源码,我们来看一个他俩都有的方法。

StringBuffer:

Java学习里程-----Java基础_17String类(下)

StringBuilder:

Java学习里程-----Java基础_17String类(下)

是不是,你瞅瞅,一个是有synchronized,一个没有。我们学过synchronized关键字的都知道,(如果大家忘记了或者没有看过,可以去看我另外一个博客《Java学习里程-----Java基础_15Java中一些关键字的定义与使用》)这个关键字是同步的,也就是说,没事在append的时候,只有一个线程进来操作。(稍后我们简单介绍一下append的使用)

这也就是说StringBuffer 和 StringBuilder相比,StringBuffer是线程安全的,而StringBuilder不是线程安全的。

但是啊,这样的话也会产生另外一个问题,就是效率,安全了,但是效率低了,不安全,效率提高了。

而且你仔细去看,StringBuffer的方法都是带着关键字synchronized的。

所以啊,我们在使用的时候要去注意是多线程环境还是单线程环境。

八、StringBuffer和StringBuilder的一些基本操作

因为这俩实现和继承的类啊都是一样的,所以我们用一个来说就好,区别就是一个线程安全,一个不安全。

顺便我们再打开api,我估计肯定有小伙伴没有收藏,我再来发一下:Java Jdk 8 api

打开之后,我们找到StringBuffer,我们往下看,去找Method Summary,我们会发现,有好多的append()

Java学习里程-----Java基础_17String类(下)

这些方法呢,都是重载方法,你看他们的参数就知道了。

通过看方法下面的说明,我们可以知道,这个方法可以追加一些东西,具体追加什么玩意,是看传入的参数。我们来应用一下。

Java学习里程-----Java基础_17String类(下)

我们先实例化一个StringBuffer,但是呢,这个刚实例化好的这个对象是个空对象。然后我们来用一下append()

Java学习里程-----Java基础_17String类(下)

我们会发现,调用append()之后,在这个字符串你后面追加了一个你好,StringBuffer!

insert():

这个方法不常用,但是我们也来说一下,这个的意思是插入,上代码:

Java学习里程-----Java基础_17String类(下)

这个在第二个字符后面插入一个字符串String,我们可以看到,在好的后面插入了一个Stirng。

toString():

这个方法是可以将这个StringBuffer或者StringBuilder转换成String。

Java学习里程-----Java基础_17String类(下)

我们主要说说几个常用的,大家可以看api文档,然后自己去学习一下其他的。

好,String暂时完结掉,大家先去好好学习,然后我们后期来应用。