Conhecer o uso da classe String e String
1. Crie uma string:
(1) Maneiras comuns de construir String:
① Método 1: (Atribuição direta)
String str1 = "hello";
② Método dois: (método de construção)
String str2 = new String("hello");
③ Método três:
char[] value = {
'a','b','c','d'};
String str3 = new String(value);
A diferença entre os três métodos:
Entrevista: A diferença entre a instanciação dos dois objetos na classe String
1. Atribuição direta : Apenas um par de espaço de memória será aberto, e o objeto string pode ser salvo automaticamente no pool de objetos para o próximo uso.
2. Método de construção : dois espaços de memória heap serão abertos e não serão salvos automaticamente no pool de objetos. Você pode usar o método intern () para entrar manualmente no pool
(2) O conceito básico de String:
string é um tipo de referência , semelhante às
referências de ponteiro da linguagem C : apenas para a estrutura de dados de objetos
(podemos imaginar um rótulo de referência "anexado" a um objeto, um objeto pode ser anexado a uma ou mais tags ; Se um objeto não tiver um rótulo, será coletado como lixo pela JVM)
String str = "cool";
String str2 = "cool";
Neste momento, alguém pode perguntar:
se str for modificado, str2 mudará de acordo?
String str = "cool";
String str2 = "cool";
str = "beautiful";
System.out.println(str2);
//执行结果: cool
Na verdade, um código como str = "beautiful" não modifica a string, mas faz a referência de str apontar para um novo objeto String. (O conteúdo da string é imutável)
2. A comparação de strings é igual:
(1) == tipo: o
tipo de dado básico compara o tamanho do valor
int x = 10 ;
int y = 10 ;
System.out.println(x == y);
// 执行结果
true
Para String, se for uma atribuição direta, porque as duas referências apontam para o mesmo objeto no pool de constantes de string, ele retorna verdadeiro
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
// 执行结果
true
Se for o método de construção, as duas referências apontam cada uma para dois objetos, porque novos dois objetos, então o resultado é falso
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
Portanto, as comparações de string usando == não comparam o conteúdo da string, mas comparam duas referências que apontam para o mesmo objeto
(2) Em Java, se você quiser comparar o conteúdo de strings, deve usar o método equals fornecido pela classe String
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true
3. Conversão de caracteres, bytes e strings
(1) Caracteres e strings
String pode ser convertida em char []
Exemplo de código:
String str = "hello" ;
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
h
Conversão de string e array de caracteres
String str = "helloworld" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换
(2) Bytes e strings
Converter entre String e byte []
Exemplo de código:
String str = "helloworld" ;
// String 转 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// byte[] 转 String
System.out.println(new String(data));
Então, quando usar byte [] e quando usar char []?
byte [] : a string é processada byte a byte. Isso é adequado para uso em cenários de transmissão de rede e armazenamento de dados, e é mais adequado para operar em dados binários.
char [] : a string é processada caractere por caractere, o que é mais adequado para operar em dados de texto, especialmente quando contém chinês.
4. Operações comuns em strings:
(1) Comparação de strings:
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
System.out.println("a".compareTo("A")); // 32
(2) Pesquisa de string:
Exemplo de código:
string search, o melhor e mais conveniente é contains ()
String str = "helloworld" ;
System.out.println(str.contains("world")); // true
Use o método indexOf () para pesquisa de localização
String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("cool")); // -1,没有查到
if (str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}
Determine o início ou o fim:
String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endwith("!!")); // true
(3) Substituição da corda:
Processamento de substituição de string:
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));
Observação:
como a string é um objeto imutável, a substituição não modifica a string atual, mas gera uma nova string
(4) Divisão de cordas:
Realize o processamento de divisão de string:
String str = "hello world " ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}
Divisão parcial da corda:
String str = "hello world " ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}
Endereço IP dividido:
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {
System.out.println(s);
}
Nota:
- Os caracteres "|", "*", "+" devem ser adicionados com caracteres de escape, precedidos de "\".
- E se for "", então deve ser escrito como "\ \".
- Se houver vários separadores em uma string, você pode usar "|" como um hífen.
Divida várias vezes:
String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split("=") ;
System.out.println(temp[0]+" = "+temp[1]);
}
(5) Interceptação de corda:
Exemplo de código:
String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0,5));
Nota:
- Índice começa em 0
- Preste atenção à maneira de escrever o intervalo antes de fechar e abrir, substring (0, 5) significa o caractere que contém o subscrito 0, não o subscrito 5.
(6) Outras operações:
Observe o uso do método trim ():
String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");
Observe o método isEmpty ():
System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());
Coloque a primeira letra em maiúscula:
public static void main(String[] args) {
System.out.println(fistUpper("yuisama"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a"));
}
public static String fistUpper(String str) {
if ("".equals(str)||str==null) {
return str ;
}
if (str.length()>1) {
return str.substring(0, 1).toUpperCase()+str.substring(1) ;
}
return str.toUpperCase() ;
}
5. A diferença entre String, StringBuffer e StringBuilder (entrevista)
(1) O conteúdo de String não pode ser modificado, enquanto o conteúdo de StringBuffer e StringBuilder pode ser modificado. Considere o uso de StingBuffer se a string é frequentemente modificada.
(2) String, StringBuilder adequado para StringBuffer de thread único
adequado para multithreading , security
(3) String, sua emenda subjacente é otimizada para StringBuilder