StringBuilder duvida

16 respostas
LPJava

ae pessoal fiquen a duvida no resultado dessa class achei que a saida era:

2Rumo
camilo lopespulga

package cap6;

public class SbMet {

	public static void main(String[] args) {
		StringBuilder sb1= new StringBuilder(2);
StringBuilder sb = new StringBuilder();
	sb.append("camilo lopes");
	sb1.append("Rumo");
	sb.append("pulga");
	System.out.println(sb1 + " ");
	System.out.println(sb);
	}

}

16 Respostas

Felipe_de_Menes_e_Mo

Ué, mas o construtor StringBuilder(2) é um cujo argumento é um inteiro, e não uma charSequence. Ou seja, StringBuilder(“2”) faria a inserção do caractere ‘2’ na string, enquanto StringBuilder(2) cria um objeto StringBuilder com capacidade para 2 caracteres.

StringBuilder() 
          //Constructs a string builder with no characters in it and an initial capacity of 16 characters. 
StringBuilder(CharSequence seq) 
          //Constructs a string builder that contains the same characters as the specified CharSequence. 
StringBuilder(int capacity) 
          //Constructs a string builder with no characters in it and an initial capacity specified by the capacity argument. 
StringBuilder(String str) 
          //Constructs a string builder initialized to the contents of the specified string.

Logo a Saída deveria ser:

Ru
camilo lopespulga

LPJava
e oque me diz desse:
public class SbEnca {

	public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
	sb.append("camilo");
StringBuilder sa=sb.reverse().insert(2,"&");
System.out.println(sa);
	sa.append(8);
	System.out.println(sa.toString());
	StringBuilder a=null;
	System.out.println(a);
	}

}
e outra duvida como façoa para saber se duas StringBuilder sao iguais... o codigo abaixo retorna a false sempre..
public class StComp {

	public static void main(String[] args) {
StringBuilder sb = new StringBuilder("camilo");
	String s="camilo";
System.out.println(sb.equals(s));//false
StringBuilder sb1 = new StringBuilder("camilo");
System.out.println(sb.equals(sb1));//false
System.out.println(sb==sb1);
	}

}

hehe

KWill

Parece que o método equals da classe StringBuilder não dá override no método equals da classe Object. Trecho do javadoc do J2SE 1.5:

Entom, acho que dentro do seu código, sb.equals(sb) deve retornar true.

Inté.

Felipe_de_Menes_e_Mo

Tomei a liberdade de comentar seu código, com fins pedagógicos! Hehehe! Acredito que tenha ficado mais fácil de seguir o raciocínio.

camilolopes:
e oque me diz desse:
public class SbEnca {

  public static void main(String[] args) {
    //Observe que apenas um objeto é criado: "sb"
    StringBuilder sb = new StringBuilder();
    sb.append("camilo");
    //sb.reverse() inverte a ordem dos caracteres no objeto "sb"
    //insert(2,"&") insere o caractere "&" no lugar do segundo caractere de "olimac" resultando em "o&imac"
    StringBuilder sa=sb.reverse().insert(2,"&");
    //imprime "o&imac"
    System.out.println(sa);
    //adiciona ao fim da string o caractere 8, resultando em o&imac8
    sa.append(8);
    System.out.println(sa.toString());
    StringBuilder a=null;
    System.out.println(a);
    }
}
maquiavelbona

Opa! Tentei responder mais cedo, mas não pude.

StringBuilder ( e seu correspondente StringBuffer ) não implementam Comparable . String implementa essa interface que determina um método (compareTo) para comparação de objetos ( nesse caso, lexicograficamente ) e faz uma reescrita no método equals para comparar o conteúdo dos objetos.

StringBuilder e StringBuffer não reescrevem o método equals e comparam o objeto por completo. Se quiser comparar conteúdo, terá que fazer manualmente.

Até!

LPJava

como?eh isso que queria saber…

maquiavelbona
Ah cara, nem é tão complicado se você olhar o Javadoc. Fiz uma implementação de teste que nem me preocupei em fazer melhor. Segue abaixo:
package org.laissez_passer.utils.test;

public class TesteCompare {
	/**
	 * 
	 * @author Marcos Iriarte
	 * @date 28/02/2007 01:33:25 GMT-3h
	 * 
	 */
	private static final int CAPACIDADE_PADRAO = 16;

	public static void main(String[] args) {
		StringBuilder str1 = new StringBuilder("builder");
		StringBuilder str2 = new StringBuilder("builder");
		StringBuilder str3 = new StringBuilder("build");
		boolean resultado = compareStringBuilders(str1, str2);
		System.out.println("O primeiro teste é: " + resultado); // builder == builder
		resultado = compareStringBuilders(str1, str3);
		System.out.println("O segundo teste é: " + resultado); // builder != build
		System.out.println("Fim!");
	}

	// compara dois StringBuilder por cada caracter
	public static boolean compareStringBuilders(StringBuilder builder1, StringBuilder builder2) {
		// pega os tamanhos dos valores
		int tamanho1 = builder1.length();
		int tamanho2 = builder2.length();

		// nao serao iguais de tamanhos diferentes! duh...
		if (tamanho1 == tamanho2) {
			// inicializa os array de char de trabalho com o valor do objeto
			// mais o valor do padrao da implementacao
			char[] charIn1 = new char[tamanho1 + CAPACIDADE_PADRAO];
			char[] charIn2 = new char[tamanho2 + CAPACIDADE_PADRAO];

			// coloca os valores dentro dos arrays de char
			builder1.getChars(0, builder1.length(), charIn1, 0);
			builder2.getChars(0, builder2.length(), charIn2, 0);

			int contador = tamanho1;
			// verifica char a char se diferem os valores
			for (int loop = 0; loop < contador; loop++) {
				if (charIn1[loop] != charIn2[loop]) {
					return false;
				}
			}
			// se nao houver nenhum discrepante, retorna verdadeiro
			return true;
		// se os tamanhos forem diferentes, retorna falso
		} else {
			return false;
		}
	}
}

Até!

bebad

E se eu quizer, pegar um valor por exemplo assim:

public void CalculaData(){
        Calendar cal = Calendar.getInstance();
        int ano = printf("1$tY",cal);
        sout("ano = "+ano);
// fazer coisas com minha variavel ano;
        
        
    }

entenderam oque eu quero fzer ? tem como ?

vlw

P

Felipe de Menes e Morais:
Ué, mas o construtor StringBuilder(2) é um cujo argumento é um inteiro, e não uma charSequence. Ou seja, StringBuilder(“2”) faria a inserção do caractere ‘2’ na string, enquanto StringBuilder(2) cria um objeto StringBuilder com capacidade para 2 caracteres.

StringBuilder() 
          //Constructs a string builder with no characters in it and an initial capacity of 16 characters. 
StringBuilder(CharSequence seq) 
          //Constructs a string builder that contains the same characters as the specified CharSequence. 
StringBuilder(int capacity) 
          //Constructs a string builder with no characters in it and an initial capacity specified by the capacity argument. 
StringBuilder(String str) 
          //Constructs a string builder initialized to the contents of the specified string.

Logo a Saída deveria ser:

Ru
camilo lopespulga

Estranho, o resultado aki na minha maquina foi:

Rumo
camilo lopespulga

deveria ser Ru ?

danielbussade

Olá a saída correta eh essa mesma:


Rumo
camilo lopespulga

Ru, deve ter sido um erro de digitação!

Att

P

Felipe de Menes e Morais:
Ué, mas o construtor StringBuilder(2) é um cujo argumento é um inteiro, e não uma charSequence. Ou seja, StringBuilder(“2”) faria a inserção do caractere ‘2’ na string, enquanto StringBuilder(2) cria um objeto StringBuilder com capacidade para 2 caracteres.

StringBuilder() 
          //Constructs a string builder with no characters in it and an initial capacity of 16 characters. 
StringBuilder(CharSequence seq) 
          //Constructs a string builder that contains the same characters as the specified CharSequence. 
StringBuilder(int capacity) 
          //Constructs a string builder with no characters in it and an initial capacity specified by the capacity argument. 
StringBuilder(String str) 
          //Constructs a string builder initialized to the contents of the specified string.

Logo a Saída deveria ser:

Ru
camilo lopespulga

Fiquei encucado foi com esse "# StringBuilder(int capacity) //Constructs a string builder with no characters in it and an initial capacity specified by the capacity argument. "

O que acontece com essa tal “capacidade inicial”?

Marky.Vasconcelos

Se o append ultrapassar a capacidade inicial essa String é destruida e criada outra maior no lugar.
Isso acontece cada vez que o limite é “estourado”

P

Mark_Ameba:
Se o append ultrapassar a capacidade inicial essa String é destruida e criada outra maior no lugar.
Isso acontece cada vez que o limite é “estourado”

entao essa capacidade “nao serve pra nada” usa-la ne?

T

pardal_nb:
Mark_Ameba:
Se o append ultrapassar a capacidade inicial essa String é destruida e criada outra maior no lugar.
Isso acontece cada vez que o limite é “estourado”

entao essa capacidade “nao serve pra nada” usa-la ne?

A capacidade é só uma otimização.
Se você souber de antemão, ou for rápido calcular, o tamanho da string resultante, o seu código roda mais rápido porque você evita uma alocação de objetos (que costuma ser rápida) e uma cópia de caracteres (que é lenta).
Por exemplo, se você for escrever uma função que concatena duas strings, você pode criar uma StringBuffer ou StringBuilder já com a capacidade certa (que é a soma dos comprimentos das duas strings).

Metaleiro

[color=darkblue] Apenas para ressaltar talvez não seja o foco da discussão, mas existem diferenças entre StringBuilder e StringBuffer:
[/color]

StringBuffer and StringBuilder

StringBuffer is used to store character strings that will be changed (String objects cannot be changed). It automatically expands as needed. Related classes: String, CharSequence.

StringBuilder was added in Java 5. It is identical in all respects to StringBuffer except that it is not synchronized, which means that if multiple threads are accessing it at the same time, there could be trouble. For single-threaded programs, the most common case, avoiding the overhead of synchronization makes the StringBuilder very slightly faster.

No imports are necessary because these are both in the java.lang package.

[color=darkblue] Apenas para ressaltar talvez não seja o foco da discussão, mas existem diferenças entre os dois, Segue o link de referência:
[/color]

http://www.leepoint.net/notes-java/data/strings/23stringbufferetc.html

wbjava

O mais fácil para compara e duas Strings contidas no StringBuilder/StringBuffer é chamando o toString() delas.

Ex:

StringBuilder sb1 = new StringBuilder("teste");
StringBuilder sb2 = new StringBuilder("teste");
if (sb1.toString().equals(sb2.toString())) {
	System.out.println("São iguais.");
} else {
	System.out.println("Não são iguais.");
}
Criado 26 de fevereiro de 2007
Ultima resposta 19 de abr. de 2008
Respostas 16
Participantes 11