大家好,我是Morning,在CSDN写文,分享一些Java基础知识,一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,和博主一起学习Java知识。大家还可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。
今天和大家一起来探讨一个很基础的知识,可能在之前你了解的不是很清晰,希望这篇文章可以帮助到你。 String是Java中很基础的一个引用类型,它封装了对一个字符串对象的创建和一些基本操作。相信大家对这个类有一定的了解,同样Java提供的常用的可以创建、操作字符串对象的类还有俩个,分别为StringBuffer和StringBuilder,我在这篇文章中就浅谈这三个类的区别。
String类
在该类的源码中可以看到,这个类被关键字final修饰,这表示String类不可以被继承,也就是说,String类不可以拥有自己的子类。 现在让我们创建一个String对象,并操作它,看看可以发现什么:
在上图中我们可以看到,在我创建了一个String类对象之后的HashCode值和我操作之后的HashCode值是不同的,这说明该类型的值是不可变的,这就意味着我每一次操作这个字符串对象都会生成一个新的String对象,然后将指针指向这个新的对象,然后就可以用原来声明的变量名来访问操作后的这个字符串对象。 所以,如果需要大量的操作字符串的话,不建议使用String类型,因为它会大量的产生新的对象,GC就会工作,这就会影响性能。
StringBuffer类
可以看到StringBuffer类也被final关键字修饰,也不可以被继承。 同样的,我们创建一个StringBuffer对象,并操作它,看看它和String有什么不同: 由此可见,在我创建了一个StringBuffer类对象之后的HashCode值和我操作之后的HashCode值是相同的,这说明该类的值是可变的,每次的操作都是对对象本身操作,所以不会引发像String一样的问题。 所以在需要大量操作字符串的时候,建议使用StringBuffer来创建字符串对象。 然后让我们来看一看StringBuffer类中的append()方法: 可以看到该方法被synchronized关键字修饰,这表明StringBuffer 是线程安全的。
StringBuilder类
看到这里就可以知道了,这三个常用的字符串类都是被final修饰的,都是不可以被继承的。 又到了上代码的环节: 由此可见,该类的值也是可变的,其实StringBuilder类是在 Java 5 中被提出,该类与stringBuffer最大的区别在于,StringBuilder中的方法没有被synchronized关键字修饰,不是线程安全的。 但是在大多数情况下,StringBuilder要比StringBuffer要快一些,所以在一些对字符串操作较多,而且是单线程的情况下,建议使用StringBuilder。
总结
- String:值不可变,影响性能,在对字符串操作较少、单线程情况下使用
- StringBuffer:值可变,线程安全,在对字符串操作较多、多线程情况下使用
- StringBuilder:值可变,线程不安全,在对字符串操作较多、单线程情况下使用
|