字符串类性能问题

时间:2017-04-11 05:58:40

标签: java string performance performance-testing

字符串是不可变的,Java中的每个不可变对象都是线程安全的,这意味着String也是线程安全的。两个线程不能同时使用字符串。

StringBuffer是可变的,但StringBuffer中的每个方法都是同步的,StringBuffer是线程安全的。所以效果很慢

那么My Query是String有任何性能问题吗?

3 个答案:

答案 0 :(得分:2)

不可变并不意味着您不能同时在多个线程中使用相同的String。这意味着在调用append来改变缓冲区内部状态的情况下,与StringBuffer相反的实例化后,内部状态无法更改。

这意味着它的设计是线程安全的。

StringBuffer的性能很低(与StringBuilder的性能相反),因为它需要在每次操作之前锁定对象的内部状态。

答案 1 :(得分:0)

这似乎不是一个真正的编程问题,但只是你的逻辑错误。

对于StringBuffer

  • StringBuffer已同步
  • 因为它的方法是同步的,所以它的方法不会在两个线程中同时运行
  • 因为它的方法不会在两个线程中同时运行,所以它是线程安全的
  • 由于方法是同步的,因此与非同步对应方相比,性能较差。

但是,上述内容并不意味着反之亦然:

  • 因为它是线程安全的,所以它不会在两个线程中同时运行
  • 因为它是线程安全的,所以它的性能很差(与非线程安全的对应物相比)

同步/锁定只是实现线程安全的众多方法之一。

答案 2 :(得分:-2)

String没有性能问题,因为String是不可变的,每次一个进程可以使用它,并且线程安全本质上没有人可以改变它。

虽然4是可变的,但多个进程使用单个StringBuffer对象,同步成本。这就是StringBuffer的表现缓慢的原因。

<强>过程

进程具有自包含的执行环境。进程通常具有完整的私有基本运行时资源集;特别是,每个进程都有自己的内存空间。

<强>线程

线程有时被称为轻量级进程。进程和线程都提供了执行环境,但创建新线程所需的资源比创建新进程要少。