String, StringBuilder y StringBuffer diferencia de (a su vez)

Creo que hemos visto mucha diferencia comparando artículos String y StringBuffer, sino también comprender la diferencia entre los dos, sin embargo, desde Java 5.0, release, nuestra lista comparativa será más de un objetivo, y esta es la clase StringBuilder. clase String es de clase inmutable, cualquier cambio en el iniciador genera un nuevo objeto String String; StringBuffer es el tipo de variable, cambia su significado cualquier generación cadena no producirá un nuevo objeto, una variable y el objeto inmutable de esta clase ha sido completa, entonces ¿por qué introducir nueva clase StringBuilder? Creo que tenemos esta duda, también lo hago. Aquí, nos fijamos en las razones de la introducción de la clase.

      ¿Por qué hay tanto comparando artículo de cuerda y StringBuffer?

      La razón es que cuando se cambia el contenido de la cadena, usando StringBuffer mejor rendimiento se puede obtener. Dado que es para un mejor rendimiento, entonces el uso de StringBuffer para obtener el mejor rendimiento todavía?

      La respuesta es NO!

      ¿Por qué?

      Si usted ha leído "Piense en Java", pero en el interior HashTable y HashMap describen la diferencia entre esa parte del capítulo están más familiarizados con él, también se debe entender por qué. Sí, que el apoyo a la sincronización de hilos para asegurar los problemas de seguridad de rosca que conducen a la degradación del rendimiento. HashTable son método thread-safe, se sincronizan muchos métodos, y HashMap no es hilo de seguridad, pero su rendimiento en los programas de un solo subproceso es mayor que HashTable. La diferencia entre StringBuffer y StringBuilder clase es también aquí, la clase StringBuilder recién introducido no es hilo de seguridad, pero su rendimiento en una sola rosca es mayor que StringBuffer. Si usted no cree esto, tratar el siguiente ejemplo:

package com.hct.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author: chengtai.he
 * @created:2009-12-9 上午09:59:57
 */
public class StringBuilderTester {
 private static final String base = " base string. ";
 private static final int count = 2000000;

 public static void stringTest() {
  long begin, end;
  begin = System.currentTimeMillis();
  String test = new String(base);
  for (int i = 0; i < count/100; i++) {
   test = test + " add ";
  }
  end = System.currentTimeMillis();
  System.out.println((end - begin)
    + " millis has elapsed when used String. ");
 }

 public static void stringBufferTest() {
  long begin, end;
  begin = System.currentTimeMillis();
  StringBuffer test = new StringBuffer(base);
  for (int i = 0; i < count; i++) {
   test = test.append(" add ");
  }
  end = System.currentTimeMillis();
  System.out.println((end - begin)
    + " millis has elapsed when used StringBuffer. ");
 }

 public static void stringBuilderTest() {
  long begin, end;
  begin = System.currentTimeMillis();
  StringBuilder test = new StringBuilder(base);
  for (int i = 0; i < count; i++) {
   test = test.append(" add ");
  }
  end = System.currentTimeMillis();
  System.out.println((end - begin)
    + " millis has elapsed when used StringBuilder. ");
 }

 public static String appendItemsToStringBuiler(List list) {
  StringBuilder b = new StringBuilder();

  for (Iterator i = list.iterator(); i.hasNext();) {
   b.append(i.next()).append(" ");
  }

  return b.toString();
 }

 public static void addToStringBuilder() {
  List list = new ArrayList();
  list.add(" I ");
  list.add(" play ");
  list.add(" Bourgeois ");
  list.add(" guitars ");
  list.add(" and ");
  list.add(" Huber ");
  list.add(" banjos ");

  System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
 }

 public static String appendItemsToStirngBuffer(List list) {
  StringBuffer b = new StringBuffer();

  for (Iterator i = list.iterator(); i.hasNext();) {
   b.append(i.next()).append(" ");
  }

  return b.toString();
 }

 public static void addToStringBuffer() {
  List list = new ArrayList();
  list.add(" I ");
  list.add(" play ");
  list.add(" Bourgeois ");
  list.add(" guitars ");
  list.add(" and ");
  list.add(" Huber ");
  list.add(" banjos ");

  System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
 }

 public static void main(String[] args) {
  stringTest();
  stringBufferTest();
  stringBuilderTest();
  addToStringBuffer();
  addToStringBuilder();
 }
}

El procedimiento anterior se como sigue:
. 5266 cadena que se utiliza de millis tiene el cuando el tiempo transcurrido 
. 375 de millis tiene la StringBuffer cuando el transcurrido Utilizado 
281 de millis ha utilizado el transcurrido el cuando el StringBuilder. 
 El juego de I Bourgeois guitarras y Huber Banjos  
 el juego de I Bourgeois guitarras y Huber Banjos 
partir de los resultados por encima del punto de vista esta diferencia en el rendimiento en tres clases del programa un único subproceso de un vistazo, cuando el uso de objetos String, incluso si el número de carreras es el uso de un solo 1/100 de otros objetos, su tiempo de ejecución es todavía más de 25 veces más altos que otros objetos, y el uso de objetos StringBuffer y utilizando el objeto diferencia StringBuilder también es obvio, el primero es aproximadamente 1,5 veces el último. Por lo tanto, si nuestro programa se ejecuta en sentido único subproceso, o sin al problema de la sincronización de hilos, hay que dar prioridad a la utilización de la clase StringBuilder, por supuesto, si usted quiere asegurarse de hilos de proceso seguro, natural y no otro que StringBuffer.

Además del soporte para multithreading no es lo mismo, pero estas dos clases usando casi no hay diferencia, el ejemplo anterior es una buena descripción. appendItemsToStringBuiler appendItemsToStirngBuffer y dos métodos se utilizaron, además de los objetos externos y la StringBuffer StringBuilder, otro exactamente, pero el efecto es el mismo.

resumen:

Variabilidad
clase String utilizando la matriz de caracteres almacenado en una cadena, privada
valor carácter final [], por lo que los objetos String son inmutables. StringBuilder y StringBuffer se heredan de la clase AbstractStringBuilder, sino también el uso de una matriz de caracteres en la cadena almacenada en AbstractStringBuilder, char []
valor, estos dos objetos son variables.
Seguridad de los hilos
en los objetos String son inmutables, se puede entender como una caja fuerte hilo constante. AbstractStringBuilder StringBuilder y StringBuffer es la clase padre común define el funcionamiento básico de algunos de la cadena, tales como expandCapacity, -a, -i, indexOf otros métodos públicos. método StringBuffer añade genlock o método llamada añadió un bloqueo de sincronización, también lo son thread-safe. StringBuilder y ningún método más genlock, así que no seguro para subprocesos.
El rendimiento
de cada momento de un cambio de tipo String, genera un nuevo objeto String, entonces el puntero al nuevo objeto String. StringBuffer cada vez para
StringBuffer objeto en sí mismo para operar, en lugar de generar nuevo objeto y cambiar la referencia de objeto. Utilizar las mismas circunstancias
StirngBuilder en comparación con el uso de
StringBuffer sólo recibe aproximadamente un 10% más de rendimiento del 15%, pero con el riesgo de multithreading inseguro.

Traslado desde http://www.cnblogs.com/Fskjb/archive/2010/04/19/1715176.html

Publicado 15 artículos originales · ganado elogios 7 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/J_M_S_H_T/article/details/88181805
Recomendado
Clasificación