String、StringBuffer、StringBuilder有什么区别

262 阅读2分钟

基本回答

String

Java对String的态度,我认为就像基本是把String当作一个基本数据类型来对待。 String和基本数据类型主要区别:

  • 存数据进常量池;
  • String类型对象拥有很多行为; 在Java中,浅拷贝,意味着只能拷贝对象的基本数据类型属性、String属性和其他引用数据类型的引用。

Java对String的处理方式是,属性和类均用final来修饰,表明它的不可扩展和不可更改。String实际上在内部的工作是在维护一个char数组,这是一个final属性,表明这个属性是不可更改的,所以任何对String的扩展行为都是新建一个String对象。

JVM对String的处理是,将字符串存放在常量池中,这是一个和基本类型一样的处理方式。String对象的声明方式也和基本数据类型很像,不需要使用new关键字便可以创建。这是因为它会在JVM层面获得和基本数据类型类似的处理(常量池)。而包装类不一样,包装类只有代码层面提供的缓存,而且包装类的声明方式是一种语法糖,实际上是新建了对象,只不过是放在语法层面来处理这样的工作。

比如JDBC中数据库连接的时候,使用String作为创建connection的url,这一方面也保证了这个url的不可被篡改

StringBuffer

StringBuffer和String是同时出来的,目的实际上就是为了拥有一个可扩展的String,同时也能减轻JVM堆中新增对象的压力,我们可以使用append方法对对象进行扩展。不过StringBuffer是线程安全的,而且它的保证线程安全的方式是重量级的synchronized。

StringBuilder

这是在jdk1.5之后出现的,它和StringBuffer拥有一样的功能,只是它不是线程安全的。当对字符串的需求对线程安全要求不高可以考虑使用该类。