String ou char[]?

20 respostas
B

Ola, estou com duvida em relacao a usar String ou char[] para guardar uma string.

Eu sei o tamanho da string…
Preciso usar a menor quantidade de memoria possivel…
Devo usar String ou char[]? Ou devo usar byte[]?

Vlw!

20 Respostas

V

Depende de quão restrita é sua memória… uma string guarda internamente um array de chars mas tambem algumas (poucas) outras informações no entanto a máquina virtual java tem algumas otimizações para o armazenamento da mesma especialmente em casos de repetições de strings… então o contexto a ser analizado é mais abrangente do que simplesmente a restrição da memória.

B

Nossa, vc veio da galera do C né? Hehe…
Pra criar uma string usa a classe String mesmo, se for concatenar usa StringBuilder.
Vc vai pegar essa string de onde?

G

Seguindo as boas práticas do JAVA eu recomendaria fortemente o uso de String.

A

usa String acredito que a diferença entre o uso de memoria não seja grande alem do mais
String vc ja vai ter os metodos de comporação e tudo mais

G

100% String :wink:

[]'s

P

Faça um benchmark entre as duas formas e depois veja se as mudanças necessárias para trabalhar com char[] ao invés de String não são proibitivas. Se vc tiver 2% a mais de performance compensa? Pensa bem…

B

Eh q eu achei procurando no google, o tamanho de uma String:

Total String Object incl. Dependent Array === 38±2 + 2*(String length)

Dai conclui q se usasse byte[] seria melhor. Criei uma funcao pra transformar byte[] pra String e uma pra comparar direto byte[] com String. O melhor desempenho, mesmo q seja 2%, eh necessario na minha aplicacao :slight_smile:

To em duvida :!:

T

Pergunta: por que é que é necessário usar a menor quantidade de memória possível (em vez de usar Strings usar byte[], que introduz na sua aplicação uma dependência de “encoding” e dificulta sua manipulação)?
Dependendo do que você está a fazer, você acabará economizando memória no lugar errado, talvez tornando o consumo até maior que o esperado e deixando sua aplicação muito mais complexa que o necessário.

B

Nao vai ficar complexa, fiz funcoes pra transformar byte pra string, string pra byte e compara 2 strings.
Acho q vo usar byte[], pq o ganho de memoria eh importante pra mim.
Eh eu vim da galera de C xD

Vlw!

T

Se você teve que REimplementar tudo, então já ficou complexo.

Poxa, não justificaria nem se você fosse programar em JME…

Abandone essa idéia de programar em Java pensando em C. Não é nem um pouco produtivo ficar lutando contra a linguagem, a não ser que você tenha muito tempo ( e paciência ).

T

Eu sou da galera de C++ e só uso char * (ou wchar_t *, que é a versão Unicode do char *) só em último caso.
Sempre uso <string> ou <wstring>. (A propósito, também não gosto de CString - já tive muitos problemas com ele, e embora eu saiba exatamente como ele funciona, sei que ele também é usado incorretamente.)

B

Eh q eu to fazendo um servidor, dai quanto menos memoria melhor…

T

Em minha experiência, quando você faz um servidor, quanto mais fácil de manter o código, é que é melhor. Normalmente servidores têm montes de memória para gastar (programas clientes é que têm limitações sérias de memória).

Gasto de memória só precisa ser avaliado se você determinou, através de alguma análise, que isso realmente é importante. Parece que você só está achando que vai gastar memória com strings, mas não sabe exatamente quanto.

B

Nao vai ficar complexo, pq eu n implementei ainda, mas entao, no meu banco de dados compensa fazer esta economia certo?

Mudando de assunto, existe alguma funcao q bloqueie um IP para conexoes TCP/IP via sockets? Antes do server socket dar um accept?

Vlw!

T

Você quer criar um banco de dados? Então provavelmente vai ter de lidar com dois tipos de strings:

  • A representação String como um array de caracteres (2 bytes por caracter) - isso para efetuar as comparações entre strings e outras coisas mais;

  • A representação String para ser gravada no disco como a representação UTF-8 dos dados Unicode (em média 1 byte por caracter).

Mas as strings em memória, devido à velocidade que você deve ter para poder efetuar as comparações e outras operações, devem ser representadas como String mesmo, não como byte[]. É que todos os problemas de “collation” e outras coisas são mais fáceis de serem resolvidos com String que com byte[] que você tem de converter e desconverter para String.

Acho que o único lugar onde Strings podem ser representadas como byte[] é em um cache em memória que represente um pedaço do arquivo de disco, como temporário. No resto do seu programa, use String mesmo.

B

Outra pergunta, existe um sleep em micro ou nano segundos em java?

Vlw!

T

sleep é algo que chama o sistema operacional diretamente. No caso do Windows, Thread.sleep chama (basicamente) a API do Windows “Sleep”, que aceita apenas valores com precisão de milissegundo (mas a exatidão pode ser de apenas dezenas de milissegundos).
Sleep basicamente faz com que o scheduler do Sistema Operacional chaveie para outra thread ou processo e prometa voltar dentro do tempo que você configurou para a sua thread. Pode ser que o SO se atrase porque foi tratar algo mais prioritário ou então porque as interrupções foram desabilitadas por muito tempo, por isso Sleep nunca é muito exato.
No caso do Linux ele até chama “select” ou outras APIs que aceitam valores mais precisos (nanossegundos), mas a exatidão continua sendo de alguns milissegundos.

Então a resposta simples é “não”.

Se você precisar de algo com exatidão maior (microssegundos ou nanossegundos) é preciso ver se nas APIs do Java que lidam com Multimedia existe isso.

T

http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#sleep(long,%20int) aceita milissegundos e nanossegundos (quem mandou não ter lido o Javadoc? ) mas na prática os nanossegundos são ignorados.

B

Vlw :smiley:

Outra pergunta:

Existe alguma maneira de bloquear conexoes vindas de um IP por Java ou por algum outro programa? (Preferencialmente pelo Java :shock: )

Vlw msm! Flw!

V

brunoja:
Vlw :smiley:

Outra pergunta:

Existe alguma maneira de bloquear conexoes vindas de um IP por Java ou por algum outro programa? (Preferencialmente pelo Java :shock: )

Vlw msm! Flw!

Crie tópicos novos para perguntas novas!!

Criado 15 de janeiro de 2008
Ultima resposta 15 de jan. de 2008
Respostas 20
Participantes 9