Classes comumente usadas em [Java]

Índice

1. Classe de string

(I. Visão geral

(2) Características da Corda

1. A imutabilidade da String

2. Método de instanciação de string

3. Comparação de atribuição do método de concatenação de strings

4. Armadilhas de uso de strings

5. Métodos comuns da classe String

6. Conversão entre String e outras estruturas

7. Descrição do local de armazenamento do conjunto de constantes de string na JVM:

8. Exame de tópicos comuns de algoritmos:

Dois, StringBuffer e StringBuilder

(1) Classe StringBuffer

(2) classe StringBuilder

3. API de data e hora antes do JDK 8.0

1. A classe java.lang.System

2. classe java.util.Date

3. java.text.SimpleDateFormat 类

4. Classe de calendário: classe de calendário, classe abstrata

Quarto, a nova classe de data e hora no JDK 8.0

1. Iteração da API de data e hora:

2. Problemas das duas gerações anteriores:

3. Pacotes envolvidos na nova API de data e hora no Java 8.0:

4. Uso de data local, hora local, data e hora local:

5. Ponto de tempo: Instantâneo

6. Classe de formatação de data e hora: DateTimeFormatter

7. Uso de outras APIs:

5. Comparador Java

1. O pano de fundo do uso de comparadores Java:

2. Classificação natural: use a interface Comparável

3. Classificação personalizada: use a interface do Comparador

4. Comparação de dois métodos de classificação

6. Outras classes comumente usadas

1. Classe do sistema

2.Aula de matemática

3. Classe BigInteger, classe BigDecimal


1. Classe de string

java.lang.String uso de classe

(I. Visão geral

String: Uma string, representada por um par de "".

  1. String é declarada final e não pode ser herdada

  2. String implementa  Serializable a interface: indica que a string suporta serialização. Implementada  Comparable a interface: indicando que String pode ser comparada em tamanho

  3. String é definida internamente  final char[] value para armazenar dados de string

  4. String: Representa uma sequência imutável de caracteres. Nome curto: imutabilidade.

    refletir:

    4.1 Ao reatribuir uma string, é necessário reescrever a área de memória especificada para atribuição, e o valor original não pode ser usado para atribuição.

    4.2 Ao executar operações de concatenação em strings existentes, também é necessário especificar novamente a área de memória para atribuição, e o valor original não pode ser usado para atribuição.

    4.3 Ao chamar o  replace() método String para modificar o caractere ou string especificado, também é necessário especificar novamente a área de memória para atribuição, e o valor original não pode ser usado para atribuição.

  5. Por meio de literais (diferente de new atribuir um valor de string, o valor de string neste momento é declarado no conjunto de constantes de string).

  6. O conjunto de constantes de string não armazenará strings com o mesmo conteúdo (comparado usando equals() da classe String e retornando true).

(2) Características da Corda

Classe string: representa uma string. Todas as strings literais (como "abc") em programas Java são implementadas como instâncias dessa classe. String é uma classe final que representa uma sequência imutável de caracteres. Strings são constantes e são indicadas por aspas duplas. Seus valores não podem ser alterados após a criação. O conteúdo do caractere do objeto String é armazenado em um array de caracteres vaue[].

Construtor de origem da string:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

复制代码

1. A imutabilidade da String

1.1 Descrição:

  1. Ao reatribuir uma string, é necessário reescrever a área de memória especificada para atribuição e o valor original não pode ser usado para atribuição.
  2. Ao executar operações de concatenação em strings existentes, também é necessário especificar novamente a área de memória para atribuição, e o valor original não pode ser usado para atribuição.
  3. Ao chamar o  replace() método String para modificar o caractere ou string especificado, também é necessário especificar novamente a área de memória para atribuição e o valor original não pode ser usado para atribuição.

1.2 Exemplo de código:

String s1 = "abc";//通过字面量的定义方式
String s2 = "def";
s1 = "hello";

System.out.println(s1 == s2); //false 比较s1与s2的地址值

System.out.println(s1);//hello
System.out.println(s2);//def

System.out.println("-----------------------");

String s3 = "abc";
s3 += "def";
System.out.println(s3);//abcdef
System.out.println(s2);//def

System.out.println("-----------------------");

String s4 ="test";
String s5 = s4.replace("t","b");
System.out.println(s4);//test
System.out.println(s5);//besb

复制代码

1.3 Análise do diagrama:

2. Método de instanciação de string

2.1 Descrição do método de implementação:

  • Método 1: Por meio de definição literal
  • Método 2: Por meio de novo + construtor

Questões de entrevista:

String s = new String("abc"); maneira de criar objetos, quantos objetos são criados na memória?

Dois: um é a nova estrutura no espaço de heap e o outro são char[]os dados no pool constante correspondente: "abc"

2.2 Exemplo de código:

//通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
String s1 = "javaEE";
String s2 = "javaEE";
//通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
String s3 = new String("javaEE");
String s4 = new String("javaEE");

System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false

复制代码

String str1=“abc”; A diferença com  String str2= new String(“abc”); ?

Análise de memória do novo objeto String

3. Comparação de atribuição do método de concatenação de strings

3.1 Descrição:

  1. O resultado da emenda de constantes e constantes está no pool de constantes. E não haverá constantes com o mesmo conteúdo no pool de constantes.
  2. Enquanto um deles for uma variável, o resultado estará no heap.
  3. Se o resultado da união chamar  intern() o método, o valor de retorno estará no pool constante

3.2 Exemplo de código

String s1 = "javaEE";
String s2 = "hadoop";

String s3 = "javaEEhadoop";
String s4 = "javaEE" + "hadoop";
String s5 = s1 + "hadoop";
String s6 = "javaEE" + s2;
String s7 = s1 + s2;

System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false

String s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”
System.out.println(s3 == s8);//true
****************************
String s1 = "javaEEhadoop";
String s2 = "javaEE";
String s3 = s2 + "hadoop";
System.out.println(s1 == s3);//false

final String s4 = "javaEE";//s4:常量
String s5 = s4 + "hadoop";
System.out.println(s1 == s5);//true

复制代码

análise de memória

4. Armadilhas de uso de strings

  • String s1="a";

    Explicação: Uma cadeia cujo valor literal é "a" é criada no conjunto de constantes de cadeia.

  • s1=s1+"b"

    Explicação: Na verdade, o objeto string "a" original foi descartado e agora uma string s1+"b" (ou seja, "ab") é gerada no espaço de heap. Se essas operações de alteração do conteúdo da string forem executadas várias vezes, um grande número de objetos de string duplicados permanecerá na memória, reduzindo a eficiência. Se tal operação for colocada em um loop, isso afetará muito o desempenho do programa.

  • String s2="ab"; Descrição: Crie uma string cujo valor literal seja "ab" diretamente no pool de constantes de string.

  • String s3="a"+"b"; Descrição: s3 aponta para a string "ab" criada no conjunto de constantes de string.

  • String s4=s1.intern(); Observação: depois que o objeto S1 no espaço de heap chamar intern(), ele atribuirá a string "ab" que já existe no pool de constantes a s4.

5. Métodos comuns da classe String

5.1 Manipulação de strings

Personagem de operação:

  1. int length(): retorna o comprimento da string: return value.length
  2. char charAt(int index): retorna o caractere em um índice return value[index]
  3. boolean isEmpty(): Determine se é uma string vazia:return value.length == 0
  4. String toLowerCase(): Converta todos os caracteres em String para letras minúsculas usando a localidade padrão
  5. String toUpperCase(): Converta todos os caracteres em String para letras maiúsculas usando a localidade padrão
  6. String trim(): retorna uma cópia da string, ignorando os espaços em branco iniciais e finais
  7. boolean equals(Object obj): Compare se o conteúdo das strings é o mesmo
  8. boolean equalsIgnoreCase(String anotherString)equals() Semelhante ao método, ignorando maiúsculas e minúsculas
  9. String concat(String str): Concatena a string especificada ao final desta string. equivalente a usar +
  10. int compareTo(String anotherString): Compara o tamanho de duas strings
  11. String substring(int beginIndex): Retorna uma nova string, que é uma substring interceptada de beginIndex ao final desta string.
  12. String substring(int beginIndex, int endIndex) : Retorna uma nova string, que é uma substring dessa string interceptada de beginIndex a endIndex (exclusivo).

Exemplo de código:

@Test
public void test2() {
    String s1 = "helloword";
    System.out.println(s1.length());//9
    System.out.println(s1.charAt(4));//o
    System.out.println(s1.isEmpty());//false

    String s2 = "HELLOword";
    System.out.println(s2.toLowerCase());//hellowod
    System.out.println(s2.toUpperCase());//HELLOWORD

    String s3 = " hello word ";
    System.out.println(s3.trim());//hello word
    String s4 = "helloword";
    System.out.println(s4.equals(s1));//true
    System.out.println(s4.equalsIgnoreCase(s2));//true
    String s5 = "hello";
    System.out.println(s5.compareTo(s4));//-4 相等时返回0,小的时候返回负数
    System.out.println(s4.compareTo(s1));//0

    System.out.println(s4.substring(5));//word
    System.out.println(s4.substring(5, 9));//word,取值范围左开右闭

}

复制代码

Personagem de julgamento:

  1. boolean endsWith(String suffix): testa se esta string termina com o sufixo especificado
  2. boolean startsWith(String prefix): testa se esta string começa com o prefixo especificado
  3. boolean startsWith(String prefix, int toffset): Testa se uma substring desta string começando no índice especificado começa com o prefixo especificado
@Test
public void test3() {
    String s1 = "javaEE";
    System.out.println(s1.endsWith("EE"));//true
    System.out.println(s1.startsWith("a"));//false
    System.out.println(s1.startsWith("EE", 4));//true

}

复制代码

5.2 Encontrando caracteres em uma string

  1. boolean contains(CharSequence s):Retorna true se e somente se esta string contiver a sequência especificada de valores char
  2. int indexOf(String str): Retorna o índice da primeira ocorrência da substring especificada nesta string
  3. int indexOf(String str, int fromIndex): Retorna o índice da primeira ocorrência da substring especificada nesta string, começando no índice especificado
  4. int lastIndexOf(String str): Retorna o índice da ocorrência mais à direita da substring especificada nesta string
  5. int lastIndexOf(String str, int fromIndex): Retorna o índice da última ocorrência da substring especificada nesta string, iniciando a pesquisa reversa a partir do índice especificado

Nota: indexOf e  lastIndexOf o método retorna -1 se não for encontrado

Exemplo de código:

@Test
public void test3() {
    String s2="hello word";
    System.out.println(s2.contains("o"));//true
    System.out.println(s2.indexOf("h"));//0
    System.out.println(s2.indexOf("o", 5));//7
    System.out.println(s2.lastIndexOf("o"));//7
    System.out.println(s2.lastIndexOf("l", 2));//2
}

复制代码

5.3 Métodos de manipulação de strings

  1. substituir:

    • String replace(char oldChar, char newChar): Retorna uma nova string, que é obtida substituindo todas as ocorrências de oldChar nesta string por newChar.
    • String replace(CharSequence target, CharSequence replacement): Substitui substrings da sequência de destino literal correspondida por esta string com a sequência de substituição literal especificada.
    • String replaceAll(String regex, String replacement): Substitui substrings desta string que correspondem à expressão regular fornecida com a substituição fornecida.
    • String replaceFirst(String regex, String replacement): Substitui a primeira substring desta string que corresponde à expressão regular fornecida com a substituição fornecida.
  2. corresponder:

    • boolean matches(String regex): Informa se esta string corresponde à expressão regular fornecida.
  3. fatiar:

    • String[] split(String regex): divide esta string com base nas correspondências da expressão regular fornecida.

    • String[] split(String regex, int limit): Divida esta string de acordo com a correspondência com a expressão regular fornecida, até o limite. Se exceder, todo o resto será colocado no último elemento.

Exemplo de código:

@Test
public void test4() {
    String str1 = "北京你好,你好北京";
    String str2 = str1.replace('北', '南');

    System.out.println(str1);//北京你好,你好北京
    System.out.println(str2);//南京你好,你好南京

    String str3 = str1.replace("北京", "上海");
    System.out.println(str3);//上海你好,你好上海

    System.out.println("*************************");
    String str = "12hello34world5java7891mysql456";
    //把字符串中的数字替换成,,如果结果中开头和结尾有,的话去掉
    String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", "");
    System.out.println(string);//hello,world,java,mysql

    System.out.println("*************************");
    str = "12345";
    //判断str字符串中是否全部有数字组成,即有1-n个数字组成
    boolean matches = str.matches("\\d+");
    System.out.println(matches);//true
    String tel = "0571-4534289";
    //判断这是否是一个杭州的固定电话
    boolean result = tel.matches("0571-\\d{7,8}");
    System.out.println(result);//true


    System.out.println("*************************");
    str = "hello|world|java";
    String[] strs = str.split("\\|");
    for (int i = 0; i < strs.length; i++) {
        System.out.println(strs[i]);//依次输出hello word java
    }
    System.out.println();
    str2 = "hello.world.java";
    String[] strs2 = str2.split("\\.");
    for (int i = 0; i < strs2.length; i++) {
        System.out.println(strs2[i]);//依次输出hello word java
    }
}

复制代码

6. Conversão entre String e outras estruturas

6.1 Conversão entre String e tipos de dados básicos e classes wrapper

String --> tipo de dado básico, classe wrapper: chame o método estático da classe wrapper:parseXxx(str)

Tipos de dados básicos, classes wrapper --> String: chamada String sobrecarregada valueOf(xxx)

Exemplo de código:

@Test
public void StringToBasic() {
    String str1 = "123";
    int i = Integer.parseInt(str1);
    System.out.println(i);
    System.out.println(i == 123);//true

    int j = 456;
    String s = String.valueOf(j);
    System.out.println(s);
    System.out.println(s.equals("456"));//true
}

复制代码

6.2 Conversão de e para matrizes de caracteres

String --> char[]: chama o construtor da String  toCharArray() char[] --> String: chama o construtor da String

Exemplo de código:

@Test
public void BasicToString() {
    String s1 = "helloword";
    char[] chars = s1.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        System.out.println(chars[i]);
    }

    char[] charArray = new char[]{'h', 'e', 'l', 'l', 'o'};
    String s2 = new String(charArray);
    System.out.println(s2);

}

复制代码

6.3 Conversão de e para matrizes de bytes

Codificação: String --> byte[]: call String getBytes()

Decodificação: byte[] --> String: Chama o construtor de String

Codificação: string --> byte (compreensível --> dados binários ilegíveis)

Decodificação: o processo inverso da codificação, byte --> string (dados binários ininteligíveis ---> compreensíveis

Nota: Ao decodificar, o conjunto de caracteres usado para decodificação deve ser consistente com o conjunto de caracteres usado para codificação, caso contrário, caracteres ilegíveis aparecerão.

@Test
public void StringToByteTest() throws UnsupportedEncodingException {
    String s1 ="你好java世界";
    byte[] bytesArray = s1.getBytes();//使用默认字符集编码
    System.out.println(Arrays.toString(bytesArray));//[-28, -67, -96, -27, -91, -67, 106, 97, 118, 97, -28, -72, -106, -25, -107, -116]

    byte[] gbks = s1.getBytes("gbk");//使用gbk编码集合
    System.out.println(Arrays.toString(gbks));//[-60, -29, -70, -61, 106, 97, 118, 97, -54, -64, -67, -25]

    System.out.println("--------------------------------");

    String str1=new String(bytesArray);//使用默认字符进行解码
    System.out.println(str1);//你好java世界

    String str2 = new String(gbks);//使用默认字符对gbk编码进行解码
    System.out.println(str2);//���java����解码错误,出现中文乱码,原因:编码和解码不一致

    String str3 = new String(gbks,"gbk");//使用gbk格式进行解码
    System.out.println(str3);//你好java世界,解码正确,原因:编码和解码一致
}

复制代码

6.4 Conversão com StringBuffer e StringBuilder

1.String -->StringBuffer, StringBuilder: chama StringBuffer, construtor StringBuilder

@Test
public void StringToStringBufferTest(){
    String str1 ="helloword";

    StringBuffer stringBuffer = new StringBuffer(str1);
    System.out.println(stringBuffer);//helloword

    StringBuilder stringBuilder = new StringBuilder(str1);
    System.out.println(stringBuilder);//helloword

    stringBuffer.append("isStringBuffer");
    System.out.println(stringBuffer);//hellowordandgood

    stringBuilder.append("isStringBuider");
    System.out.println(stringBuilder);
}

复制代码

2.StringBuffer、StringBuilder -->String:

①Chame o construtor String; ②StringBuffer, toString() do StringBuilder

@Test
public void StringBuiderOrStringBufferToStringTest() {
    StringBuffer sb1 = new StringBuffer("hello StringBuffer");
    System.out.println(sb1);

    StringBuilder sb2 = new StringBuilder("hello StringBuider");
    System.out.println(sb2);

    System.out.println("----------------------");

    String str1 = new String(sb1);
    System.out.println(str1);

    String str2 = new String(sb2);
    System.out.println(str2);

    System.out.println("----------------------");
    System.out.println(sb1.toString());
    System.out.println(sb2.toString());
}

复制代码

7. Descrição do local de armazenamento do conjunto de constantes de string na JVM:

jdk 1.6 (jdk 6.0, java 6.0): o conjunto de constantes de string é armazenado na área de método (área permanente)

jdk 1.7: O conjunto de constantes de string é armazenado no espaço de heap

jdk 1.8: O conjunto de constantes de string é armazenado na área de método (metaespaço)

8. Exame de tópicos comuns de algoritmos:

1) Simule um método de corte para remover espaços em ambas as extremidades da string.

public String myTrim(String str) {
    if (str != null) {
        int start = 0;//记录从前往后首次索引位置不是空格的位置索引
        int end = str.length() - 1;//记录从后往前首次索引位置不是空格的位置索引
        while (start < end && str.charAt(start) == ' ') {
            start++;
        }
        while (start < end && str.charAt(end) == ' ') {
            end--;
        }
        if (str.charAt(start) == ' ') {
            return "";
        }
        return str.substring(start, end + 1);
    }

    return null;
}

复制代码

2) Inverta uma string. Inverte a parte especificada da string. Por exemplo, "abcdefg" é revertido para "abfedcg"

//方式一
public String reverse1(String str, int start, int end) {
    if (str != null) {
        //1.转换成char型数组
        char[] charArray = str.toCharArray();
        //2.进行反转操作
        for (int i = start, j = end; i < j; i++, j--) {
            char temp = charArray[i];
            charArray[i] = charArray[j];
            charArray[j] = temp;
        }
        //3.返回值
        return new String(charArray);
    }
    return null;
}

//方式二
//分析:整个字符串分为三部分不反转的、反转的、不反转的
//先将前面不反转的部分取出来,将反转的部分取出后进行拼接
public String reverse2(String string, int start, int end) {
    if(string != null){
        //第一部分
    String newStr = string.substring(0, start);
    //第二部分
    for (int i = end; i >= start; i--) {
        newStr += string.charAt(i);
    }
    //第三部分
    newStr += string.substring(end + 1);
	//拼接操作
    return newStr;
    }
    return null;
}

//方式三,使用StringBuffer或StringBuilder替换String优化
public String reverse3(String str, int start, int end) {
    if(str != null){
      //1.新建StringBuffer
    StringBuffer stringBuffer = new StringBuffer(str.length());
    //2.第一部分
    stringBuffer.append(str.substring(0, start));
    //3.第二部分
    for (int i = end; i >= start; i--) {
        stringBuffer.append(str.charAt(i));
    }
    //4.第三部分
    stringBuffer.append(str.substring(end + 1));
    //5.拼接操作
    return stringBuffer.toString();  
    }
    return null;
}

复制代码

3) Obtenha o número de vezes que uma string ocorre em outra string. Por exemplo: Obter o número de ocorrências de "ab" em "abkkcadkabkebfkabkskab"

public int count(String mainStr, String subStr) {
    //1.判断主串和部分串的大小
    if (mainStr.length() >= subStr.length()) {
        int index = 0;
        int count = 0;
        //2.在主串中取出子串下标,并将新的下标赋值给主串,统计量加1
        //            while ((index = mainStr.indexOf(subStr) )!= -1){
        //                count++;
        //				//从已经找到的子串的下一个开始
        //                mainStr = mainStr.substring(index + subStr.length());
        //            }
        //改进,不再新建字符串,只做位置比对
        while ((index = mainStr.indexOf(subStr, index)) != -1) {
            index += subStr.length();
            count++;
        }
        return count;
    } else {
        return 0;
    }
}

复制代码

4) Obtenha a maior substring idêntica em duas strings. Por exemplo: str1 = "abcwerthelloyuiodef";str2 = "cvhellobnm" Dica: compare a string mais curta com as substrings cujos comprimentos estão diminuindo em ordem e a string mais longa.

//只存在一个子串的情况
public String getMaxSameSubString(String str1, String str2) {
    //1.判断两个字串的大小
    if (str1 != null && str2 != null) {
        String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
        String minStr = (str1.length() < str2.length()) ? str1 : str2;

        int len = minStr.length();
        //2.用小的依次去比对大的子串
        for (int i = 0; i < len; i++) {//这层for循环用来确定需要比对的字符次数
            for (int x = 0, y = len - i; y <= len; x++, y++) {
                if (maxStr.contains(minStr.substring(x, y))) {
                    return minStr.substring(x, y);
                }
            }

        }
    }
    return null;
}

//存在多个相同子串的情况
// 此时先返回String[],后面可以用集合中的ArrayList替换,较方便
public String [] getMaxSameSubStrings(String str1, String str2) {
    //1.先比较出两个子串的大小
    if (str1 != null && str2 != null) {
        StringBuffer stringBuffer = new StringBuffer();
        String maxStr = (str1.length() > str2.length()) ? str1 : str2;
        String minStr = (str1.length() > str2.length()) ? str2 : str1;
        //2.用小的去依次匹配大的
        int len = minStr.length();
        for (int i = 0; i < len; i++) {
            for (int x = 0, y = len - i; y <= len; x++,y++ ){
                String subString = minStr.substring(x,y);
                //3.取出匹配到的子串
                if (maxStr.contains(subString)){
                    stringBuffer.append(subString+",");
                }
            }
            //System.out.println(stringBuffer);
            if (stringBuffer.length() != 0){
                break;
            }
        }

        String [] split = stringBuffer.toString().replaceAll(",$","").split("\\,");
        return split;
    }
    return null;
}

复制代码

5) Classifique os caracteres na string em ordem natural. dica:

  1. A string se torna uma matriz de caracteres.

  2. Classificar, selecionar, bolha, matriz Arrays.sort();

  3. Transforme a matriz classificada em uma string.

@Test
public void charTest() {
    String str1 = "hello java";
    char[] charArray = str1.toCharArray();

    Arrays.sort(charArray);

    String str2 = new String(charArray);
    System.out.println(str2);
}

复制代码

Dois, StringBuffer e StringBuilder

(1) Classe StringBuffer

1. Visão Geral:

java.lang.String.Buffer Representa uma sequência de caracteres variável, declarada em JDK1.0, podendo adicionar ou deletar o conteúdo da string, e nenhum novo objeto será gerado neste momento. Muitos métodos são iguais a String, quando passado como parâmetro, o valor pode ser alterado dentro do método.

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;//value没有final声明,value可以不断扩容

    /**
     * The count is the number of characters used.
     */
    int count;//count记录有效字符个数

复制代码
  • A classe StringBuffer é diferente de String, e seus objetos devem ser gerados por meio de construtores.
  • Existem três construtores:
    • StringBuffer(): Buffer de string com uma capacidade inicial de 16
    • StringBuffer(int size): Constrói um buffer de string da capacidade especificada
    • StringBuffer(String str): Inicializa o conteúdo para o conteúdo da string especificada
String s= new String("我喜欢学习");
StringBuffer buffer= new StringBuffer("我喜欢学习");
buffer. append("数学");

复制代码

2. Métodos comuns:

  1. StringBuffer append(xxx): Fornece muitos  append() métodos para concatenação de strings
  2. StringBuffer delete(int start,int end): Excluir o conteúdo no local especificado
  3. StringBuffer replace(int start, int end, String str): Substitua a posição [start, end) por str
  4. StringBuffer insert(int offset, xxx): Insira xxx na posição especificada
  5. StringBuffer reverse() : reverte a sequência de caracteres atual

Ao anexar e inserir, se o comprimento da matriz de valores original não for suficiente, ela poderá ser expandida. Os métodos acima suportam operações de encadeamento de métodos. O princípio da cadeia de métodos:

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

复制代码
  • public int indexOf(String str): retorna o subscrito da substring
  • public String substring(int start,int end): Retorna uma substring de um intervalo fechado à esquerda e aberto à direita do início ao fim do índice
  • public int length(): obtém o comprimento da string
  • public char charAt(int n ): Retorna o caractere na posição especificada
  • public void setCharAt(int n ,char ch): Defina o caractere na posição especificada

Resumir:

adicionar append(xxx) :;

excluir: delete(int start,int end) ;

mudar: setCharAt(int n ,char ch) /  replace(int start, int end, String str) ;

confira charAt(int n ) :;

Inserir: insert(int offset, xxx) ;

comprimento: length();

percorrer: for() + charAt() /  toString();

Exemplo de código:

@Test
public void stringBufferMethodTest(){
    StringBuffer s1 = new StringBuffer("abc");
    System.out.println(s1);

    System.out.println(s1.append("1"));//abc1
    System.out.println(s1.delete(0, 1));//bc1
    System.out.println(s1.replace(0, 1, "hello"));//helloc1
    System.out.println(s1.insert(3, "v"));//helvloc1
    System.out.println(s1.reverse());//1colvleh
}

复制代码

(2) classe StringBuilder

StringBuilder e StringBuffer são muito semelhantes, ambos representam sequências de caracteres variáveis ​​e o método de fornecer funções relacionadas é o mesmo, mas a classe StringBuilder não possui bloqueio de thread e a eficiência de execução é maior.

1. Comparação de String, StringBuffer e StringBuilder

  • String: uma sequência de caracteres imutável; o  char[] armazenamento subjacente é usado; a memória está ocupada (objetos serão continuamente criados e reciclados)
  • StringBuffer: sequência de caracteres variável; thread-safe, baixa eficiência; thread-safe; camada inferior usa armazenamento char[];
  • StringBuilder: sequência de caracteres variável; novo em jdk5.0, thread inseguro, alta eficiência; thread inseguro; camada inferior usa  char[] armazenamento

Obs: Se passado como parâmetro, Stng dentro do método não irá alterar seu valor, mas StringBuffer e StringBuilder irão alterar seu valor.

2. Análise de memória de StringBuffer e StringBuilder

Tome StringBuffer como exemplo:

String str = new String();//char[] value = new char[0];
String str1 = new String("abc");//char[] value = new char[]{'a','b','c'};

StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的数组。
System.out.println(sb1.length());//
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';

StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16];

复制代码

Código-fonte do construtor StringBuffer:

public StringBuffer(String str) {
    super(str.length() + 16);
    append(str);
}

复制代码

Questão 1. System.out.println(sb2.length());//3

Questão 2. Problema de expansão de capacidade: Se o array subjacente de dados a serem adicionados não puder conter, o array subjacente precisa ser expandido. Por padrão, a expansão é o dobro da capacidade original + 2, e os elementos da matriz original são copiados para a nova matriz ao mesmo tempo.

Significado orientador: Durante o desenvolvimento, é recomendável que você use: StringBuffer(int capacity) ou StringBuilder(int capacity)

3. Compare a eficiência de execução de String, StringBuffer e StringBuilder

Organize de cima para baixo: StringBuilder > StringBuffer > String

@Test
public void test3(){
    //初始设置
    long startTime = 0L;
    long endTime = 0L;
    String text = "";
    StringBuffer buffer = new StringBuffer("");
    StringBuilder builder = new StringBuilder("");
    //开始对比
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        buffer.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuffer的执行时间:" + (endTime - startTime));

    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        builder.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuilder的执行时间:" + (endTime - startTime));

    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        text = text + i;
    }
    endTime = System.currentTimeMillis();
    System.out.println("String的执行时间:" + (endTime - startTime));

}

复制代码

3. API de data e hora antes do JDK 8.0

1.  java.lang.System classe

Fornecido pela classe System  public static long currentTimeMillis() para retornar a diferença de horário em milissegundos entre o horário atual e 1º de janeiro de 1970 0:00:00. (timestamp) Este método é adequado para calcular diferenças de tempo.

Os principais padrões para calcular a hora mundial são:

  • UTC (Tempo Universal Coordenado)
  • GMT (horário médio de Greenwich)
  • CST (horário padrão central)

Exemplo de código:

//获取系统当前时间:System类中的currentTimeMillis()
long time = System.currentTimeMillis();
//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
//称为时间戳
System.out.println(time);

复制代码

2.  java.util.Dateclasse

Representa um instante específico, com precisão de milissegundos

2.1 Construtor

Date(): você pode obter a hora atual local usando um construtor sem parâmetros para criar um objeto

Date(long date)

2.2 Métodos comuns

getTime(): Retorna o número de milissegundos representados por este objeto Date desde 1º de janeiro de 1970 00:00:00GMT

tostring(): Converta este objeto Date em uma String da seguinte forma:

  • baixo seg dd
  • hh: mm:ss zzz aaaa

Entre eles: doW é um determinado dia da semana (Dom, Seg, Ter, Qua, Qui, Sex, Sab), zzz é o padrão de tempo. Muitos outros métodos são obsoletos

2.3  java.util.Date类与java.sql.Date categoria

  • java.util.Date tipo

  • java.sql.Date tipo

1. O uso de dois construtores

  • Construtor 1: Date(): Cria um objeto Date correspondente à hora atual
  • Construtor 2: Crie um objeto Date com o número especificado de milissegundos

2. O uso de dois métodos

  • toString(): Exibe o ano atual, mês, dia, hora, minuto, segundo
  • getTime(): obtém os milissegundos correspondentes ao objeto Date atual. (carimbo de hora)

3. java.sql.Date Uma variável correspondente ao tipo de data no banco de dados

como  java.util.Date converter objeto em  java.sql.Date objeto

@Test
public void dateTest(){
    //构造器一:Date():创建一个对应当前时间的Date对象
    Date date1 = new Date();
    System.out.println(date1.toString());//Sun Apr 19 13:35:12 CST 2020
    System.out.println(date1.getTime());//1587274512876

    //构造器二:创建指定毫秒数的Date对象
    Date date2 = new Date(15872745176L);
    System.out.println(date2.toString());
    System.out.println("-----------------------");

    //创建java.sql.Date对象
    java.sql.Date date3 = new java.sql.Date(1587274512876L);
    System.out.println(date3.toString());

    //如何将java.util.Date对象转换为java.sql.Date对象
    Date date4 = new Date();
    //第一种方式,存在问题:java.util.Date cannot be cast to java.sql.Date
    //        java.sql.Date date6 = (java.sql.Date) date4;
    //        System.out.println(date6);
    //第二种方式
    java.sql.Date date5 = new java.sql.Date(date4.getTime());
    System.out.println(date5);
}

复制代码

3.  java.text.SimpleDateFormat classe

O AP da classe Date não é fácil de internacionalizar e é quase obsoleto,  java.text.SimpleDateFormat uma classe concreta para formatar e analisar datas de maneira independente da localidade.

Permite formatação: data→texto, análise: texto→data

formatar:

SimpleDateFormat(): esquema padrão e objeto de criação de localidade

public SimpleDateFormat(String pattern): Este construtor pode criar um objeto no formato especificado pelo padrão de parâmetro, que chama:

public String format(Datedate): método para formatar a data do objeto time

Analisarpublic Date parse(String source): Analisa o texto desde o início da string fornecida para gerar uma data

1. Formatação e análise de SimpleDateFormat da classe Date

Duas operações:

1.1 Formatação: data ---> string

1.2 Parsing: o processo inverso de formatação, string ---> data

2.  SimpleDateFormat A instanciação de:new + 构造器

Formate e analise conforme especificado: chame o construtor com parâmetros

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");

复制代码

Exemplo de código:

@Test
public void test2() throws ParseException {
    //实例化Date对象
    Date date1 = new Date();
    //实例化SimpleDateFormate对象,并设置显示格式
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:aaa");
    //格式化date对象
    String format = simpleDateFormat.format(date1);
    System.out.println(format.toString());//2020-09-19 02:09:下午
    //解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
    //否则,抛异常
    Date date2 = simpleDateFormat.parse("2020-04-20 14:20:下午");
    System.out.println(date2.toString());//Tue Jan 21 02:20:00 CST 2020
}

复制代码

Pequeno exercício:

Converta a string "2020-09-08" para  java.sql.Date uma hora no formato

@Test
public void test3() throws ParseException {
    String brith = "1997-10-15";
    //新建SimpleDateFormat对象并设置时间格式
    SimpleDateFormat simpBrith = new SimpleDateFormat("yyyy-mm-dd");
    //将字符串格式的时间格式化为Date类
    Date brithday = simpBrith.parse(brith);
    //通过Date的getTime方法将Date对象转化为时间戳放到java.sql.date类的构造方法中
    java.sql.Date brithDate = new java.sql.Date(brithday.getTime());
    System.out.println(brithDate);
}

复制代码

4. Classe de calendário: classe de calendário, classe abstrata

Calendar é uma classe base abstrata, usada principalmente para completar a função de interoperabilidade entre os campos de data.

  • O método de obtenção da instância de Calendar usa o método Calendar.getInstance() para chamar o construtor de sua subclasse GregorianCalendarl.
  • Uma instância de Calendar é uma representação abstrata da hora do sistema, e as informações de hora desejadas podem ser obtidas por meio do método get(int field). Por exemplo, YEAR, MONTH, DAY_OF_WEEK, HOUR_OF_DAY, MINUTE, SECOND

Nota: Ao obter o mês: janeiro é 0, fevereiro é 1 e assim por diante, dezembro é 11 Ao obter a semana: domingo é 1, terça-feira é 2. . . sábado é 7

4.1 Instanciação

Método 1: Criar um objeto de sua subclasse (GregorianCalendar)

Método 2: Chame seu método estático getInstance()

Calendar calendar = Calendar.getInstance();

复制代码

4.2 Métodos comuns

get(): obter data

set(): definir data

add(): data adicionada, modificada

getTime:Aula do calendário-->Data

setTime:Data-->Aula do calendário

Exemplo de código:

Calendar calendar = Calendar.getInstance();
//        System.out.println(calendar.getClass());

//2.常用方法
//get()
int days = calendar.get(Calendar.DAY_OF_MONTH);//获取本月第几天
System.out.println(days);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//获取本年第几天

//set()
//calendar可变性
calendar.set(Calendar.DAY_OF_MONTH,22);//设置本月第几天
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);

//add()
calendar.add(Calendar.DAY_OF_MONTH,-3);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);

//getTime():日历类---> Date
Date date = calendar.getTime();
System.out.println(date);

//setTime():Date ---> 日历类
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);

复制代码

Quarto, a nova classe de data e hora no JDK 8.0

1. Iteração da API de data e hora:

A primeira geração: classe data jdk 1.0

A segunda geração: jdk 1.1 classe Calendar, que substitui a classe Date até certo ponto

A terceira geração: jdk 1.8 propõe um novo conjunto de API

2. Problemas das duas gerações anteriores:

Mutabilidade: Classes como datas e horas devem ser imutáveis.

Offset: O ano em Date começa em 1900 e o mês começa em 0.

Formatação: A formatação é usada apenas para Data, mas não para Calendário. Além disso, eles não são thread-safe; não podem lidar com segundos bissextos, etc.

API java.time recentemente introduzida no Java 8.0:

O Java 8.0 absorve a essência do Joda-Time, com um novo começo para criar excelentes APIs para Java. O novo java.time contém todas as classes sobre data local (LocalDate), hora local (Localtime), data e hora local (LocalDate time), fuso horário (ZonedDate time) e duração (Duration). A antiga classe Date adicionou um método tolnstant() para converter Date em uma nova representação. Essas novas APIs de data e hora localizadas simplificam muito o gerenciamento de datas e localizações.

3. Pacotes envolvidos na nova API de data e hora no Java 8.0:

4. Uso de data local, hora local, data e hora local:

LocalDate / LocalTime / LocalDateTime

4.1 Descrição:

① Indica data, hora, data e hora usando o sistema de calendário ISO-8601, respectivamente. Eles fornecem uma data ou hora local simples e não contêm informações de hora atual ou informações relacionadas ao fuso horário.

② LocalDateTime é usado com mais frequência que LocalDate e LocalTime

③ Semelhante ao calendário

4.2 Métodos comuns:

Exemplo de código:

@Test
public void test1(){
    //now():获取当前的日期、时间、日期时间
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();

    System.out.println(localDate);//2020-04-21
    System.out.println(localTime);//18:52:54.929
    System.out.println(localDateTime);//2020-04-21T18:52:54.929

    //of():设置指定的年、月、日、时、分、秒。没有偏移量
    LocalDateTime localDateTime1 = LocalDateTime.of(2020,10,6,12,13,12);
    System.out.println(localDateTime1);//2020-10-06T12:13:12

    //getXxx():获取相关的属性
    System.out.println(localDateTime.getDayOfMonth());//21
    System.out.println(localDateTime.getDayOfWeek());//TUESDAY
    System.out.println(localDateTime.getMonth());//APRIL
    System.out.println(localDateTime.getMonthValue());//4
    System.out.println(localDateTime.getMinute());//52

    //体现不可变性
    //withXxx():设置相关的属性
    LocalDate localDate1 = localDate.withDayOfMonth(22);
    System.out.println(localDate);//2020-04-21
    System.out.println(localDate1);//2020-04-22

    LocalDateTime localDateTime2 = localDateTime.withHour(4);
    System.out.println(localDateTime);//2020-04-21T18:59:17.484
    System.out.println(localDateTime2);//2020-04-21T04:59:17.484

    //不可变性
    LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
    System.out.println(localDateTime);//2020-04-21T18:59:17.484
    System.out.println(localDateTime3);//2020-07-21T18:59:17.484

    LocalDateTime localDateTime4 = localDateTime.minusDays(6);
    System.out.println(localDateTime);//2020-04-21T18:59:17.484
    System.out.println(localDateTime4);//2020-04-15T18:59:17.484
}

复制代码

5. Ponto de tempo: Instantâneo

5.1 Descrição:

① Um instante na linha do tempo. Conceitualmente, ele simplesmente representa o número de segundos desde 1º de janeiro de 1970 00:00:00 (UTC.)

② semelhante à  java.util.Date classe

5.2 Métodos comuns:

Exemplo de código:

@Test
public void test2(){
    //now():获取本初子午线对应的标准时间
    Instant instant = Instant.now();
    System.out.println(instant);//2020-04-21T11:03:21.469Z

    //添加时间的偏移量
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime);//2020-04-21T19:03:21.469+08:00

    //toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数  ---> Date类的getTime()
    long milli = instant.toEpochMilli();
    System.out.println(milli);//1587467105795

    //ofEpochMilli():通过给定的毫秒数,获取Instant实例  -->Date(long millis)
    Instant instant1 = Instant.ofEpochMilli(1587467105795L);
    System.out.println(instant1);//2020-04-21T11:05:05.795Z
}

复制代码

6. Classe de formatação de data e hora:DateTimeFormatter

6.1 Descrição:

① Formatar ou analisar data e hora

② Semelhante a SimpleDateFormat

6.2 Métodos comuns:

  1. Método de instanciação: Formato padrão pré-definido. como:ISO\_LOCAL\_DATE\_TIME;
  • ISO_LOCAL_DATE;ISO_LOCAL_TIME formatos relacionados à localização:
  • como:ofLocalizedDateTime(FormatStyle.LONG)
  • Formato personalizado: como:ofPattern(“yyyy-MM-dd hh:mm:ss”)
  1. Métodos comuns:

    Especial: formato personalizado. como:ofPattern(“yyyy-MM-dd hh:mm:ss”)

    Exemplo de código:

    @Test
    public void test3(){
        //        方式一:预定义的标准格式。
        //        如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //格式化:日期-->字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String str1 = formatter.format(localDateTime);
        System.out.println(localDateTime);//2020-04-21T19:13:13.530
        System.out.println(str1);//2020-04-21T19:13:13.53
    
        //解析:字符串 -->日期
        TemporalAccessor parse = formatter.parse("2000-04-21T19:13:13.53");
        System.out.println(parse);//{},ISO resolved to 2000-04-21T19:13:13.530
        //        方式二:
        //        本地化相关的格式。如:ofLocalizedDateTime()
        //        FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime
        DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
        //格式化
        String str2 = formatter1.format(localDateTime);
        System.out.println(str2);//2020年4月21日 下午07时16分57秒
    
        //      本地化相关的格式。如:ofLocalizedDate()
        //      FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate
        DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
        //格式化
        String str3 = formatter2.format(LocalDate.now());
        System.out.println(str3);//2020-4-21
    
        //       重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        String Str4 = formatter3.format(LocalDateTime.now());
        System.out.println(Str4);//2020-04-21 07:24:04
    
        TemporalAccessor accessor = formatter3.parse("2020-02-03 05:23:06");
        System.out.println(accessor);//{SecondOfMinute=6, HourOfAmPm=5, NanoOfSecond=0, MicroOfSecond=0, MinuteOfHour=23, MilliOfSecond=0},ISO resolved to 2020-02-03
    }
    
    复制代码

7. Uso de outras APIs:

7.1 Data e hora com fuso horário:

ZonedDateTime / ZoneId

Exemplo de código:

// ZoneId:类中包含了所的时区信息
@Test
public void test1(){
    //getAvailableZoneIds():获取所的ZoneId
    Set<String> zoneIds = ZoneId.getAvailableZoneIds();
    for(String s : zoneIds){
        System.out.println(s);
    }
    System.out.println();

    //获取“Asia/Tokyo”时区对应的时间
    LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
    System.out.println(localDateTime);


}
//ZonedDateTime:带时区的日期时间
@Test
public void test2(){
    //now():获取本时区的ZonedDateTime对象
    ZonedDateTime zonedDateTime = ZonedDateTime.now();
    System.out.println(zonedDateTime);
    //now(ZoneId id):获取指定时区的ZonedDateTime对象
    ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
    System.out.println(zonedDateTime1);
}

复制代码

7.2 Intervalo de tempo:

Duração - usado para calcular dois intervalos de "tempo", com base em segundos e nanossegundos

Exemplo de código:

@Test
public void test3(){
    LocalTime localTime = LocalTime.now();
    LocalTime localTime1 = LocalTime.of(15, 23, 32);
    //between():静态方法,返回Duration对象,表示两个时间的间隔
    Duration duration = Duration.between(localTime1, localTime);
    System.out.println(duration);

    System.out.println(duration.getSeconds());
    System.out.println(duration.getNano());

    LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
    LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);

    Duration duration1 = Duration.between(localDateTime1, localDateTime);
    System.out.println(duration1.toDays());

}

复制代码

7.3 Intervalo de datas:

Período -- usado para calcular o intervalo entre duas "datas", medido em anos, meses e dias

Exemplo de código:

@Test
public void test4(){
    LocalDate localDate = LocalDate.now();
    LocalDate localDate1 = LocalDate.of(2028, 3, 18);

    Period period = Period.between(localDate, localDate1);
    System.out.println(period);

    System.out.println(period.getYears());
    System.out.println(period.getMonths());
    System.out.println(period.getDays());

    Period period1 = period.withYears(2);
    System.out.println(period1);

}

复制代码

7.4 Corretor de Data e Hora:TemporalAdjuster

Exemplo de código:

@Test
public void test5(){
    //获取当前日期的下一个周日是哪天?
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);

    LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
    System.out.println(localDateTime);

    //获取下一个工作日是哪天?
    LocalDate localDate = LocalDate.now().with(new TemporalAdjuster(){

        @Override
        public Temporal adjustInto(Temporal temporal) {
            LocalDate date = (LocalDate)temporal;
            if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)){
                return date.plusDays(3);
            }else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
                return date.plusDays(2);
            }else{
                return date.plusDays(1);
            }

        }

    });

    System.out.println("下一个工作日是:" + localDate);
}

复制代码

7.5 Problemas de conversão entre a nova API de data e a API original:

5. Comparador Java

1. O pano de fundo do uso de comparadores Java:

  • Objetos em Java, em circunstâncias normais, só podem ser comparados: == ou  !=. não pode ser   usado > ou <
  • Mas no cenário de desenvolvimento, precisamos classificar vários objetos, e a implicação é que precisamos comparar o tamanho dos objetos.
  • Como conseguir? Use uma das duas interfaces: Comparable (ordenação natural) ou Comparator (ordenação personalizada)

2. Classificação natural: use a interface Comparável

2.1 Descrição

  1. Como String ou classes wrapper, etc., implemente a interface Comparable, reescreva  compareTo(obj) o método e forneça uma maneira de comparar o tamanho de dois objetos.

  2. Depois de reescrever métodos como String ou classes wrapper  compareTo() , eles são organizados de pequeno para grande

  3. Regras reescritas  compareTo(obj) : Se o objeto atual this for maior que o objeto de parâmetro formal obj, retorne um inteiro positivo; se o objeto atual this for menor que o objeto de parâmetro formal obj, retorne um inteiro negativo; se o objeto atual this for igual ao objeto de parâmetro formal obj, retorna zero.

  4. Para classes personalizadas, se a classificação for necessária, podemos fazer com que a classe personalizada implemente a interface Comparable e substitua  compareTo(obj) o método.  compareTo(obj) Indique como classificar no método

  5. Implementação típica de Comparable: (o padrão é organizado de pequeno para grande) String: compare de acordo com o valor Uincode do caractere na string Character: compare de acordo com o valor Unicode do caractere Classe wrapper correspondente e BigInteger, BigDecimal: de acordo com eles Compare os valores numéricos correspondentes Booleano: a instância da classe wrapper correspondente a true é maior que a instância da classe wrapper Date, Time, etc. correspondente a false: a data e hora posterior é maior que a data e hora anterior

2.2 Exemplo de código de classe personalizada:

public class Goods implements  Comparable{

    private String name;
    private double price;

    //指明商品比较大小的方式:照价格从低到高排序,再照产品名称从高到低排序
    @Override
    public int compareTo(Object o) {
        //        System.out.println("**************");
        if(o instanceof Goods){
            Goods goods = (Goods)o;
            //方式一:
            if(this.price > goods.price){
                return 1;
            }else if(this.price < goods.price){
                return -1;
            }else{
                //                return 0;
                return -this.name.compareTo(goods.name);
            }
            //方式二:
            //           return Double.compare(this.price,goods.price);
        }
        //        return 0;
        throw new RuntimeException("传入的数据类型不一致!");
    }
    // getter、setter、toString()、构造器:省略
}

复制代码

3. Classificação personalizada: use a interface do Comparador

3.1 Descrição:

  1. fundo:

Quando o tipo de elemento não implementa  java.lang.Comparable a interface e é inconveniente modificar o código, ou as regras de classificação que implementam a interface java.lang.Comparable não são adequadas para a operação atual, você pode considerar o uso do objeto Comparator para classificar

 2. Reescreva  compare(Object o1,Object o2) o método para comparar o tamanho de o1 e o2:

  • Se o método retornar um inteiro positivo, significa que o1 é maior que o2;
  • Se retornar 0, significa igual;
  • Retorna um inteiro negativo, indicando que o1 é menor que o2.

3.2 Exemplo de código:

Comparator com = new Comparator() {
    //指明商品比较大小的方式:照产品名称从低到高排序,再照价格从高到低排序
    @Override
    public int compare(Object o1, Object o2) {
        if(o1 instanceof Goods && o2 instanceof Goods){
            Goods g1 = (Goods)o1;
            Goods g2 = (Goods)o2;
            if(g1.getName().equals(g2.getName())){
                return -Double.compare(g1.getPrice(),g2.getPrice());
            }else{
                return g1.getName().compareTo(g2.getName());
            }
        }
        throw new RuntimeException("输入的数据类型不一致");
    }
}

复制代码

4. Comparação de dois métodos de classificação

  • O método da interface Comparable é certo e é garantido que os objetos da classe de implementação da interface Comparable podem ser comparados em qualquer posição.
  • A interface do Comparator é uma comparação temporária.

6. Outras classes comumente usadas

1. Classe do sistema

  • A classe System representa o sistema, e muitos atributos e métodos de controle no nível do sistema são colocados dentro dessa classe. Essa classe está localizada no pacote java.lang.
  • Como o construtor desta classe é privado, um objeto desta classe não pode ser criado, ou seja, a classe não pode ser instanciada. Suas variáveis ​​de membros internos e métodos de membros são estáticos, portanto, podem ser chamados facilmente.

Método de membro:

  • native long currentTimeMillis():

    A função deste método é retornar a hora atual do computador.O formato de expressão da hora é o número de milissegundos de diferença entre a hora atual do computador e a hora GMT (Greenwich Mean Time) em 1º de janeiro de 1970 às 0:00:00.

  • void exit(int status)

    A função deste método é sair do programa. O valor de status é 0 para saída normal e diferente de zero para saída anormal. Usando este método pode realizar a função de saída do programa na programação da interface gráfica, etc.

  • void gc()

    A função deste método é solicitar ao sistema que realize a coleta de lixo. Quanto ao fato de o sistema reciclar imediatamente, isso depende da implementação do algoritmo de coleta de lixo no sistema e da situação em que o sistema é executado.

  • String getProperty(String key)

    A função deste método é obter o valor correspondente ao atributo denominado chave no sistema. Os nomes de atributos comuns e suas funções no sistema são mostrados na tabela a seguir:

Exemplo de código:

@Test
public void test1() {
    String javaVersion = System.getProperty("java.version");
    System.out.println("java的version:" + javaVersion);

    String javaHome = System.getProperty("java.home");
    System.out.println("java的home:" + javaHome);

    String osName = System.getProperty("os.name");
    System.out.println("os的name:" + osName);

    String osVersion = System.getProperty("os.version");
    System.out.println("os的version:" + osVersion);

    String userName = System.getProperty("user.name");
    System.out.println("user的name:" + userName);

    String userHome = System.getProperty("user.home");
    System.out.println("user的home:" + userHome);

    String userDir = System.getProperty("user.dir");
    System.out.println("user的dir:" + userDir);

}

复制代码

2.Aula de matemática

java.lang.Math Fornece um conjunto de métodos estáticos para computação científica. Os tipos de parâmetro e valor de retorno de seu método geralmente são do tipo duplo.

3. Classe BigInteger, classe BigDecimal

3.1BigInteger

java.math O pacote BigInteger pode representar inteiros imutáveis ​​de precisão arbitrária.

BigInteger fornece as contrapartes de todos os operadores inteiros básicos de Java e fornece  java.lang.Math todos os métodos relacionados. Além disso, BigInteger fornece as seguintes operações: aritmética modular, cálculos GCD, teste de números primos, geração de números primos, manipulação de bits e algumas outras.

Construtor:  BigInteger(String val): Constrói um objeto BigInteger a partir de uma string

Exemplo de código:

@Test
public void test2() {
    BigInteger bi = new BigInteger("1243324112234324324325235245346567657653");
    BigDecimal bd = new BigDecimal("12435.351");
    BigDecimal bd2 = new BigDecimal("11");
    System.out.println(bi);
    //         System.out.println(bd.divide(bd2));
    System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
    System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP));

}

复制代码

3.2 BigDecimal

A precisão digital deve ser relativamente alta e  java.math.BigDecimal a classe

A classe BigDecimal dá suporte a números de ponto fixo decimais com sinal de precisão arbitrária e imutáveis.

Construtor:

public BigDecimal(double val)

public BigDecimal(String val)

Métodos comuns:

public BigDecimal add(BigDecimal augend)

public BigDecimal subtract(BigDecimal subtrahend)

public BigDecimal multiply(BigDecimal multiplicand)

public BigDecimal divide(BigDecimal divisor, int scale, int rounding Mode)

Exemplo de código:

@Test
public void test2() {
    BigInteger bi = new BigInteger("1243324112234324324325235245346567657653");
    BigDecimal bd = new BigDecimal("12435.351");
    BigDecimal bd2 = new BigDecimal("11");
    System.out.println(bi);
    //         System.out.println(bd.divide(bd2));
    System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
    System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP));

}

Acho que você gosta

Origin blog.csdn.net/SFalS/article/details/127055833
Recomendado
Clasificación