sábado, 5 de setembro de 2009

A Classe String

Sumário: java.lang.String; - Maneiras de criar Objetos String,Pool de literais,Comparação entre Strings, Concatenação


A classe String se encontra nos pacotes padrões de java(Oque te da a habilidade de em uma forma implicita usar a Classe) e de ta a habilidade de armazenar uma sequencia de caracteres(Toda essa representação deve ficar entre aspas duplas - > "caracteres").Veja que String é um tipo referência tanto que o primeiro S de String é maiúsculo.


É importantíssimo saber:
char
- É a representação de um caracter somente, em aspas simples ' '

String
- É a representação de um ou mais caracteres, em aspas duplas " "



Como Declarar um Objeto String?

Temos 2 maneiras:

1-
Usando new
String myVariable = new String("test");

Quando você faz essa declaração você , cria 2 objetos String em memória e coloca os caracteres em uma area reservada na heap para Literais que é chamada de Literal pool.

2- Sem usar a keyword new, A classe String é um tipo diferente em java, a única classe que aceita ser instanciada sem usar new:

String myVariable = "test";

ou

String myVariable = ("test");

Quando você faz essa declaração você, cria 1 objeto String em memória e coloca os caracteres em uma area reservada na heap para Literais que é chamada de Literal pool(Isso se os caracteres ja não existirem no Literal Pool), Para evitar a duplicação desnecessária de objeto String em memória , crie objetos String sem a keyword new.

Oque é esse Pool de literais?

Vamos a um exemplo, Esse exemplo serve tanto para Variaveis de referência Local quanto para variáveis de referência Atributo, toda variável do tipo String tem uma variável atributo chamada(Comparador de valor C) que tem o endereço de memória dos caracteres no Pool de literais: - A classe String mantem um POOL DE LITERAIS -


public class MinhaClasse{

public static void main(String[] array){

String minhaVariavel = "test"; //Instanciei um objeto String com a representação em
//caracteres

}
}

Teremos a representação somente da Local Variable referente ao frame de main() e a Heap referente a arquitetura da instância da Jvm operando sobre esse Class File,
Vejamos oque acabamos de fazer:



Clique na imagem para ampliar



E se eu tiver outra String com o mesmo valor de caracteres?

Então temos somente uma representação no Pool de literais de representação de caracteres(Isso somente acontence se instanciarmos o objeto String sem a keyword new):- A classe String mantem um POOL DE LITERAIS - Se uma String literal ja existe no Pool então uma referência para o Pool será o endereço da Referência ao Comparador, Isso para Strings sem o uso da keyword new e com a mesma sequência de caracteres e ordem


public class MinhaClasse{


public static void main(String[] array){
String minhaVariavel = "test";
String minhaVariavel2 = "test";


}
}




Clique na imagem para ampliar,Toda vez que você cria um literal String a jvm checa o pool de Literal primeiro, se a string não existir no pool de literal então é colocado no pool a nova representação(Isso sem usar a keyword new).

Mais exemplo:

public class MinhaClasse{


public static void main(String[] array){
String minhaVariavel = "test";
String minhaVariavel2 = "gol";


}
}


Vejamos oque aconteceu:





Clique na imagem para ampliar,
A manipulação é feita por um algoritmo da Classe.


E com a keyword new?
Objetos String com a keyword new, não se referem a objetos na Pool de literais porem pode ser feito com o método da classe String intern().

public class MinhaClasse{


public static void main(String[] array){
String minhaVariavel = "test";
String minhaVariavel2 = new String("test");


}
}


Vejamos oque aconteceu:



Clique na imagem para ampliar,
A manipulação é feita por um algoritmo da Classe.


Comparação entre String:

Temos 2 maneiras básicas de comparação:
1- o sinal de igual(Operador == )
2- o método equals()

O operador == (igual):
Avalia o endereço de memória das Strings dentro do comparador de valor C, vamos a um exemplo:


Instanciando um Objeto String sem a keyword new:

public class MinhaClasse{
public static void main(String[] array){

String minhaVariavel = "test";
String minhaVariavel2 = "test";

}
}

minhaVariavel == minhaVariavel2 ?

Sim a resposta é true, vejamos o porque:


Clique na imagem para ampliar,Perceba que o teste é feito no Comparador de valor C, Agora me responde você, 0xA2 = 0xA2?


Instanciando um objeto String com a keyword new:

public class MinhaClasse{


public static void main(String[] array){
String minhaVariavel = "test";
String minhaVariavel2 = new String("test");


}
}

minhaVariavel == minhaVariavel2 ?
Não a resposta é false, vejamos o porque:



Clique na imagem para ampliar,Perceba que o teste é feito no Comparador de valor C, Agora me responde você, 0xA2 = 0xA3?


Usando o método equals():

Retorna true se ambos tem o mesmo conteudo, ou seja a mesma sequência e ordem de caracteres.

Instanciando um Objeto String sem a keyword new:

public class MinhaClasse{
public static void main(String[] array){

String minhaVariavel = "test";
String minhaVariavel2 = "test";

}
}

minhaVariavel.equals(minhaVariavel2)?
Sim a resposta é true, os caracteres "test" nessa sequência e ordem são iguais a esse: "test"? Sim claro.



Instanciando um objeto String com a keyword new:

public static void main(String[] array){
String minhaVariavel = "test";
String minhaVariavel2 = new String("test");


}
}

minhaVariavel.equals(minhaVariavel2)?

Sim a resposta é true, os caracteres "test" nessa sequência e ordem são iguais a esse: "test" ? Sim claro.


Concatenação de String:

O operador(+ somar) é usado para concatenar Strings, veja o exemplo:

String myVariable = "He";
String myVariable1 = "llo";
String myVariable2 = myVariable + myVariable1;


Qual o valor de myVariable2?
"Hello"!!!





Convertendo String em Tipos Primitivos:
Se você quer converter um objeto String em tipos Primitivos pode usar uma classe associada com o tipo primitivo. Cada tipo primitivo tem uma classe associada com ela:

double - > Double
int - > Integer
etc

*Veja que Classes começam com letra maiúscula
E todas essas Classes tem método utilitários que fazem essa conversão, exemplo:

String d = "2";
double variable = Double.parseDouble(d);

Agora variable vale 2.0


É hora da revisão:

- Temos 2 maneiras de se instanciar objetos String, Usando a keyword new ou não usando
- Toda vez que instanciamos um objeto String sem a keyword new, mantemos a representação de caracteres dentro de um pool, onde ela não sera duplicada se ja tiver uma representação em igual ordem e representação
- Se instanciar objeto String com a keyword new, mesmo que ja haja a representação no pool em ordem e sequência mesmo assim sera duplicada a sequência(gasto de memória)
- O operador ==(igual) avalia endereços de memória, o método equals() avalia o conteúdo dos objetos
- Concatenação é a junção do conteúdo de uma String com o conteúdo de outra
- É importantíssimo saber:
char - É a representação de um caracter somente, em aspas simples ' '
String - É a representação de um ou mais caracteres, em aspas duplas " "

- Todo objeto String pode ser convertido em um numero literal ou um caracter(char), usando a classe associada ao tipo literal

Próximo post Operadores Relacionais, Condicionais e Controle de fluxo!!!

Cya DUDES!!!

Nenhum comentário:

Postar um comentário