Java的字符串的基础知识(必看)

news2024/9/26 3:30:15

目录

Java的字符串的基础知识(必看)

String

API的使用

String概述

创建String对象的两种方式

==号比的是什么?

难点

经典String案例

易错点

StringBuilder

疑难点:

StringJoiner

字符串相关类的底层原理

中文的存储原理

String的常见的构造方法


Java的字符串的基础知识(必看)

String

API的使用

JavaAPI(Java Application Programming Interface)是Java编程语言提供的一组类库和接口,用于开发Java应用程序。它为开发人员提供了访问Java平台功能的标准方式。JavaAPI包含了大量的类和接口,用于处理各种任务,包括文件操作、网络通信、图形用户界面(GUI)开发、数据库访问、多线程编程等。

JavaAPI是Java语言的核心部分,它定义了Java平台的基本构建块,使开发人员能够利用Java的强大功能。JavaAPI以包(package)的形式组织,每个包包含一组相关的类和接口。开发人员可以通过导入所需的包来使用JavaAPI中的类和接口。

JavaAPI的设计目标是提供简单、一致和易于使用的编程接口,以加快开发速度并降低开发难度。它提供了丰富的功能,使开发人员能够快速构建各种类型的应用程序,从简单的命令行工具到复杂的企业级应用程序。

JavaAPI还具有良好的跨平台性,因为Java程序可以在不同的操作系统上运行,只要目标系统上有Java运行时环境(Java Runtime Environment,JRE)即可。这使得JavaAPI成为广泛应用于各种领域的编程工具,包括桌面应用程序、移动应用程序、Web应用程序、嵌入式系统等。

总之,JavaAPI是Java编程语言提供的一组类库和接口,用于开发Java应用程序。它提供了丰富的功能和简单易用的编程接口,使开发人员能够快速构建各种类型的应用程序,并具有良好的跨平台性。

JRE(Java Runtime Environment)是Java运行时环境的缩写,它是Java应用程序的运行环境。JRE包含了Java虚拟机(Java Virtual Machine,JVM)以及Java类库和其他支持文件,用于执行Java程序。

当你编写一个Java程序并打算运行它时,你需要先安装JRE。JRE提供了Java程序所需的运行时环境,包括Java虚拟机,它是执行Java字节码的虚拟计算机。Java虚拟机负责解释和执行Java程序的字节码,并提供了内存管理、安全性、线程管理等功能。

除了Java虚拟机,JRE还包含了一系列的Java类库,这些类库提供了丰富的功能和工具,用于开发和执行Java程序。这些类库涵盖了各种领域,包括文件操作、网络通信、图形用户界面(GUI)开发、数据库访问、多线程编程等。

JRE的安装通常是随同Java开发工具包(Java Development Kit,JDK)一起提供的。JDK是用于开发Java应用程序的工具包,它包含了JRE以及其他开发工具,如编译器(javac)、调试器(jdb)等。在开发阶段,开发人员通常需要安装JDK来编译、调试和运行Java程序。而在部署阶段,只需要安装JRE来执行已经编译好的Java程序。

总之,JRE是Java运行时环境,它包含了Java虚拟机和Java类库,用于执行Java程序。安装JRE可以提供Java程序所需的运行时环境,使得Java程序能够在计算机上正确运行。

String概述

String name = "123";
name = "456";
System.out.println(name);

运行结果:

这几行代码展示了Java中对字符串(String)对象的操作。

首先,代码创建了一个名为name的字符串变量,并将其初始化为"123",即String name = "123";

接下来,代码将字符串变量name的值修改为"456",即name = "456";。在Java中,字符串是不可变的(immutable),这意味着一旦创建了一个字符串对象,就无法修改它的值。但是,当我们修改字符串变量时,实际上是创建了一个新的字符串对象,并将变量指向新的对象。

最后,代码使用System.out.println()方法将字符串变量name的值打印到控制台。由于name的值已经被修改为"456",所以打印的结果是"456"。

因此,这几行代码的执行结果是在控制台输出"456"。

在Java中,字符串常量(如"456")在编译时会被放入字符串常量池(String Pool)中,而不是在堆(Heap)中分配空间。字符串常量池是一块特殊的内存区域,用于存储字符串常量的引用。

当执行name = "456";时,Java会检查字符串常量池中是否已经存在值为"456"的字符串对象。如果存在,那么变量name会指向字符串常量池中的对象;如果不存在,Java会在字符串常量池中创建一个新的字符串对象,并让变量name指向它。

因此,在这段代码中,变量name实际上指向了字符串常量池中的对象,而不是在堆中分配新的空间。这是因为字符串常量是不可变的,可以被共享和重复使用。这种设计有助于提高性能和节省内存。

需要注意的是,如果使用new关键字创建字符串对象,例如String name = new String("456");,那么会在堆中分配新的空间来存储字符串对象。这种情况下,字符串常量池中不会有对应的对象,而是在堆中创建一个新的对象。但是,在一般情况下,推荐使用字符串常量来初始化字符串变量,以便利用字符串常量池的优势。

字符串常量池(String Pool)是Java中的一块特殊内存区域,用于存储字符串常量。它是在运行时存储字符串对象的一个缓存区域。

在Java中,当我们使用字符串字面量(如"hello")创建字符串对象时,Java会首先检查字符串常量池中是否已经存在相同内容的字符串对象。如果存在,那么新的字符串对象将直接引用已存在的对象,而不会创建新的对象;如果不存在,Java会在字符串常量池中创建一个新的字符串对象,并将其放入常量池中。

通过使用字符串常量池,Java实现了字符串的共享和重用。这样做有助于提高性能和节省内存,因为多个字符串变量可以共享同一个字符串常量,而不需要每次都创建新的对象。

需要注意的是,字符串常量池是存储在堆中的一部分,而不是存储在栈中。这意味着字符串常量池中的字符串对象在垃圾回收时不会被回收,除非整个字符串常量池被清空。

总之,字符串常量池是Java中用于存储字符串常量的缓存区域,它提供了字符串对象的共享和重用机制,以提高性能和节省内存。

在Java中,变量存储的是对象的引用,而不是对象本身。当我们声明一个变量并将其赋值为一个字符串对象时,变量实际上保存的是字符串对象在内存中的引用地址。

在字符串常量池中,每个字符串常量都有一个唯一的引用地址。当我们将一个字符串常量赋值给一个变量时,变量会保存该字符串常量的引用地址。这样做的好处是,可以通过变量来访问和操作字符串对象,而不需要直接操作引用地址。

例如,当我们执行以下代码:

String name = "456";

变量name会保存字符串常量"456"在字符串常量池中的引用地址。

通过使用引用地址,Java可以实现字符串的共享和重用。如果多个变量都指向同一个字符串常量,它们实际上指向的是相同的对象,而不是每个变量都拥有一个独立的对象。这样可以节省内存空间,并提高性能。

总结起来,变量保存的是对象的引用地址,而不是直接保存对象本身或字符串常量的地址。这样可以通过变量来访问和操作对象,同时实现对象的共享和重用。

在Java中,对象的引用地址和字符串常量的地址实际上是同一个概念,都表示对象在内存中的位置。引用地址是一个唯一标识对象的值,可以用来定位和访问对象。

区别在于对象的引用地址和字符串常量的地址所指向的内容不同。

  • 对象的引用地址指向堆内存中的对象实例。当我们使用new关键字创建一个对象时,Java会在堆中为该对象分配内存空间,并返回该对象在堆中的引用地址。我们可以通过该引用地址来访问和操作对象的属性和方法。

  • 字符串常量的地址指向字符串常量池中的字符串对象。字符串常量池是一个存储字符串常量的缓存区域,用于存储在代码中直接使用的字符串字面量。当我们使用字符串字面量创建字符串对象时,Java会首先检查字符串常量池中是否已经存在相同内容的字符串对象。如果存在,新的字符串对象将直接引用已存在的对象;如果不存在,Java会在字符串常量池中创建一个新的字符串对象,并将其放入常量池中。因此,字符串常量的地址指向的是字符串常量池中的对象。

需要注意的是,字符串常量池是存储在堆中的一部分,而不是存储在栈中。因此,字符串常量的地址和对象的引用地址都指向堆内存中的对象实例,只是它们指向的具体位置不同。

总结起来,对象的引用地址和字符串常量的地址都表示对象在内存中的位置,但对象的引用地址指向堆内存中的对象实例,而字符串常量的地址指向字符串常量池中的对象。

因此,System.out.println(name);语句输出的是name变量当前所引用的字符串常量的内容,即"456",而不是name变量所指向的地址.

在Java中,System.out.println()方法会根据参数的类型进行适当的转换和输出。对于字符串类型的参数,它会输出字符串的内容而不是引用地址。

创建String对象的两种方式

是的,String 是Java中的引用数据类型。在Java中,基本数据类型(如整数、浮点数等)是直接存储值的,而引用数据类型(如 String、数组、对象等)存储的是对象的引用或地址。

当我们声明一个 String 类型的变量时,实际上是在栈内存中创建了一个变量,该变量存储了字符串对象的引用。这个引用指向存储在堆内存中的实际字符串对象。

例如,以下代码中的 str 是一个 String 类型的引用变量:

String str = "Hello";

这里,str 存储了字符串 "Hello" 对象的引用。实际的字符串对象被存储在字符串常量池或堆内存中,而 str 只是指向该对象的引用。

因为 String 是引用数据类型,所以可以对字符串对象进行各种操作,例如拼接、截取、比较等。同时,由于字符串的不可变性,每次对字符串进行修改操作时,实际上是创建了一个新的字符串对象,而原始的字符串对象保持不变。

总结起来,String 是Java中的引用数据类型,用于表示字符串对象,并提供了丰富的字符串操作方法。

==号比的是什么?

在Java中,== 运算符用于比较两个对象的引用是否相等,而不是比较对象的内容。具体来说,== 比较的是两个对象的内存地址是否相同。

当使用 == 比较两个引用类型的变量时,会进行如下判断:

  • 如果两个引用变量指向同一个对象(即它们的内存地址相同),则 == 返回 true
  • 如果两个引用变量指向不同的对象(即它们的内存地址不同),则 == 返回 false

这里需要注意的是,对于基本数据类型(如 intdouble 等),== 比较的是它们的值是否相等,而不是比较内存地址。

如果我们想要比较两个字符串对象的内容是否相等,应该使用 equals() 方法,而不是 == 运算符。equals() 方法是在 Object 类中定义的,子类可以覆盖它以提供自定义的相等判断逻辑。在 String 类中,equals() 方法已经被重写,用于比较字符串对象的内容是否相等。

例如,以下示例演示了 == 运算符和 equals() 方法的使用:

String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2);      // 输出 true,因为两个引用变量指向同一个字符串常量池中的对象
System.out.println(str1 == str3);      // 输出 false,因为两个引用变量指向不同的对象
System.out.println(str1.equals(str2)); // 输出 true,因为两个字符串对象的内容相等
System.out.println(str1.equals(str3)); // 输出 true,因为两个字符串对象的内容相等

总之,== 运算符比较的是对象的引用是否相等,而 equals() 方法比较的是对象的内容是否相等。

难点

在Java中,当一个字符串与其他类型的数据进行连接操作时,Java会自动将其他类型的数据转换为字符串。这个过程称为字符串的拼接或字符串的连接。

在代码中,表达式s = s + 12;中,整数12会自动转换为字符串"12",然后与字符串s连接在一起,形成新的字符串"[12"。

经典String案例

package com.xiaonan.exercise06;

import java.util.Scanner;

public class Demo07 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的身份证号");
        //在while外定义 身份证号
        String idCard;
        while(true){
           idCard = sc.next();
            if(idCard.length()!=18){
                System.out.println("您输入的身份证号码有误,请重新输入");
            }else {
                System.out.println("输入成功");
                break;
            }
        }

        //1. 获取出生年月日
        String year = idCard.substring(6,10);
        String month = idCard.substring(10,12);
        String day = idCard.substring(12,14);
        //2. 获取性别
        String gender = idCard.substring(16,17);
        char c = gender.charAt(0);
        //这里的test的值为 ASCII码值 不是真正的"数字"
        //我要拿的是里面的之前存储的数字1,2 来计算 而不是拿数字对应的码值来计
        int test = (int)c;  //所以这是错的
        System.out.println("--------"+test);
        //**注意点1, 这里要转化**
        if((c-'0')%2==0){
            gender = "女";
        }else{
            gender = "男";
        }
        //3. 输出
        System.out.println("人物信息为");
        System.out.println(year+"年"+month+"月"+day+"日");
        System.out.println("性别为: "+gender);
    }
}

易错点

//2. 获取性别 String gender = idCard.substring(16,17); char c = gender.charAt(0); //这里的test的值为 ASCII码值 不是真正的"数字" //我要拿的是里面的之前存储的数字1,2 来计算 而不是拿数字对应的码值来计 int test = (int)c; //所以这是错的 System.out.println("--------"+test); //注意点1, 这里要转化 if((c-'0')%2==0){ gender = "女"; }else{ gender = "男"; }

StringBuilder

在Java中,你可以使用 StringBuilder 类来构建可变的字符串。StringBuilder 允许你进行字符串的修改和拼接,而不需要创建新的字符串对象。

下面是使用 StringBuilder 进行字符串替换的示例:

String talk = "Hello, world!";
String[] arr = {"Hello", "world"};

StringBuilder sb = new StringBuilder(talk);

for (String word : arr) {
    int index = sb.indexOf(word);
    while (index != -1) {
        sb.replace(index, index + word.length(), "***");
        index = sb.indexOf(word, index + 1);
    }
}

String result = sb.toString();
System.out.println(result);

在上面的示例中,我们首先创建了一个 StringBuilder 对象 sb,并将初始字符串 talk 传递给它的构造函数。然后,我们使用 indexOf 方法找到要替换的字符串的位置,并使用 replace 方法将其替换为 "***"。我们使用 indexOf 方法的第二个参数来查找下一个出现的位置,并在循环中重复这个过程,直到找不到更多的匹配。

最后,我们使用 toString 方法将 StringBuilder 对象转换回普通的字符串,并将结果打印出来。

使用 StringBuilder 可以避免每次替换都创建新的字符串对象,从而提高性能和效率。

  • 打印对象不是地址值,而是属性值

  • StringBuilder容器里的值是可以改的,而String是不可以改的,String需要创建新的字符串(重复就不用创建,两个对象都会指向这个字符串)

    在Java中,StringStringBuilder 都提供了一些常用的方法来操作字符串。下面是它们的一些常用方法:

    String常用方法:

  1. length():返回字符串的长度。

  2. charAt(int index):返回指定索引位置的字符。

  3. substring(int beginIndex):返回从指定索引开始到字符串末尾的子字符串。

  4. substring(int beginIndex, int endIndex):返回从指定索引开始到指定索引结束的子字符串。

  5. indexOf(String str):返回指定字符串在当前字符串中第一次出现的索引位置。

  6. lastIndexOf(String str):返回指定字符串在当前字符串中最后一次出现的索引位置。

  7. startsWith(String prefix):检查当前字符串是否以指定的前缀开始。

  8. endsWith(String suffix):检查当前字符串是否以指定的后缀结束。

  9. toUpperCase():将字符串转换为大写。

  10. toLowerCase():将字符串转换为小写。

  11. trim():去除字符串两端的空格。

  12. replace(CharSequence target, CharSequence replacement):将指定的目标字符串替换为指定的替换字符串。

    StringBuilder常用方法:

  13. append(String str):将指定字符串追加到当前字符串的末尾。

  14. insert(int offset, String str):在指定的偏移位置插入指定的字符串。

  15. delete(int start, int end):删除从指定开始索引到指定结束索引之间的字符。

  16. reverse():反转当前字符串。

  17. replace(int start, int end, String str):将指定范围内的字符替换为指定的字符串。

  18. length():返回字符串的长度。

  19. charAt(int index):返回指定索引位置的字符。

  20. substring(int start):返回从指定索引开始到字符串末尾的子字符串。

  21. substring(int start, int end):返回从指定索引开始到指定索引结束的子字符串。

  22. toString():将 StringBuilder 对象转换为普通的字符串。

    这些方法只是 StringStringBuilder 类中的一部分,它们提供了丰富的功能来处理字符串。你可以根据具体的需求选择适合的方法来操作字符串。

疑难点:

在你给出的代码中:

//1. 创建一个StringBuilder对象
StringBuilder sb = new StringBuilder("abc");
//2. 反转
StringBuilder s = sb.reverse();
//3. 转化为String
String str = s.toString();

这里没有错误,让我解释一下为什么这样是有效的:

  1. 首先,你创建了一个 StringBuilder 对象 sb 并用字符串 "abc" 初始化它。

  2. 然后,你调用了 sbreverse() 方法。reverse() 方法是 StringBuilder 类的一个实例方法,它的作用是将 StringBuilder 对象内部的字符序列反转。这个方法返回的是反转后的 StringBuilder 对象本身的引用,即 this 引用。因此,ssb 实际上是引用同一个对象。

  3. 接着,你调用了 s.toString() 方法。由于 sStringBuilder 类型的一个引用,它指向的是一个有效的 StringBuilder 对象(即最初的 sb 对象,现在字符序列已被反转),因此调用 toString() 方法是合法的。toString() 方法将 StringBuilder 对象内部的字符序列转换为一个新的 String 对象。

在Java中,变量名(如 ssb)只是对象的引用,它们不是对象本身。在这段代码中,ssb 都是指向同一个 StringBuilder 对象的引用。当你对这个对象调用方法时,不管是通过哪个引用调用的,效果都是相同的。因此,s.toString() 是完全有效的,它会调用那个共享对象的 toString() 方法,并不会产生错误。

在 Java 中,System.out.println() 方法用于将内容打印到控制台。当你传递一个表达式作为参数时,Java 会将其解析为一个字符串并进行打印。

在你的代码中,len + sb 是一个表达式,其中 len 是一个整数,sb 是一个 StringBuilder 对象。如果你直接将这个表达式作为参数传递给 System.out.println(),Java 会将其解析为一个整数和一个 StringBuilder 对象的相加操作,而不是将它们转换成字符串进行拼接。

为了将表达式转换为字符串拼接,你可以在表达式前面添加一个空字符串 "",这会触发 Java 将整个表达式转换为字符串的操作。这样,len + sb 就会被解析为字符串拼接,而不是数值相加。

因此,正确的写法是 System.out.println("" + len + sb);,其中空字符串 "" 会将整个表达式转换为字符串拼接。这样就可以将 lensb 转换为字符串,并进行拼接输出到控制台。

StringJoiner

在Java中,StringJoiner 是一个用于连接字符串的实用类。它可以方便地将多个字符串连接成一个字符串,并可以在字符串之间指定分隔符。

StringJoiner 类提供了以下构造方法:

  1. StringJoiner(CharSequence delimiter): 创建一个新的 StringJoiner 对象,使用指定的分隔符。
  2. StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix): 创建一个新的 StringJoiner 对象,使用指定的分隔符、前缀和后缀。

StringJoiner 类的常用方法包括:

  1. StringJoiner add(CharSequence element): 向当前 StringJoiner 对象添加一个元素。
  2. StringJoiner merge(StringJoiner other): 将另一个 StringJoiner 对象中的元素合并到当前对象中。
  3. String toString(): 返回连接后的字符串。

下面是一个示例,展示了如何使用 StringJoiner 类将多个字符串连接成一个字符串:

import java.util.StringJoiner;

public class Example {
    public static void main(String[] args) {
        StringJoiner stringJoiner = new StringJoiner(", "); // 使用逗号和空格作为分隔符
        stringJoiner.add("Apple");
        stringJoiner.add("Banana");
        stringJoiner.add("Orange");

        String result = stringJoiner.toString();
        System.out.println(result); // 输出: Apple, Banana, Orange
    }
}

在上述示例中,我们创建了一个 StringJoiner 对象 stringJoiner,指定了分隔符为逗号和空格。然后,我们使用 add() 方法向 stringJoiner 添加了三个字符串。最后,通过调用 toString() 方法,我们得到了连接后的字符串,并将其打印出来。

StringJoiner 类在处理字符串连接时非常方便,特别是在需要拼接多个字符串并指定分隔符的情况下。它可以避免手动处理分隔符和边界情况的麻烦,并提供了简洁的 API。

字符串相关类的底层原理

在Java中,字符串相关的类主要有StringStringBuilderStringBuffer。它们在内存中存储和处理字符串的方式略有不同。

  1. String类:

    • String类是不可变的,即创建后不能被修改。每次对字符串进行修改(如拼接、替换等),都会创建一个新的字符串对象。
    • 字符串常量池(String Pool)是String类的一个重要特性。当创建字符串字面量时,JVM会首先检查字符串常量池中是否存在相同内容的字符串,如果存在,则直接返回常量池中的引用,而不会创建新的对象。
    • String对象在内存中以连续的字符数组(char[])形式存储。
  2. StringBuilder类:

    • StringBuilder类是可变的,可以进行字符串的拼接、插入、删除等操作,而不会创建新的对象。
    • StringBuilder使用一个可调整大小的字符数组(char[])来存储字符串内容,当需要修改字符串时,会直接在字符数组上进行操作。
    • StringBuilder的操作是非线程安全的,适用于单线程环境。
  3. StringBuffer类:

    • StringBuffer类与StringBuilder类类似,也是可变的,可以进行字符串的修改操作。
    • StringBuffer也使用一个可调整大小的字符数组(char[])来存储字符串内容,但与StringBuilder不同的是,StringBuffer的操作是线程安全的。
    • StringBuffer的方法使用了synchronized关键字来保证线程安全,因此在多线程环境中推荐使用StringBuffer

总体来说,String类适用于字符串不经常修改的场景,而StringBuilderStringBuffer适用于需要频繁修改字符串的场景。StringBuilderStringBuffer的底层实现都是通过字符数组来存储和操作字符串,不同之处在于线程安全性。

中文的存储原理

在 Java 中,中文字符是使用 Unicode 编码进行存储的。Unicode 是一种字符集,它为世界上几乎所有的字符都分配了一个唯一的标识符,包括中文字符。

Unicode 为每个字符分配了一个唯一的代码点,用十六进制表示。例如,中文字符 "中" 的 Unicode 编码是 \u4E2D,其中 \u 表示后面跟着的是一个 Unicode 编码。

Java 中的字符串类型 String 是基于 Unicode 编码的,它可以存储任意 Unicode 字符,包括中文字符。当你在 Java 中创建一个字符串时,你可以直接使用中文字符,例如:

String chinese = "中文字符串";

在内存中,Java 使用 UTF-16 编码来表示字符串。UTF-16 是一种可变长度的编码方案,它可以用 16 位编码表示大部分常见字符,但对于一些罕见的字符,可能需要使用两个 16 位编码来表示。

Java 提供了一些方法来处理字符串和字符的 Unicode 编码。例如,可以使用 charAt() 方法获取字符串中指定位置的字符,然后使用 char 类型来表示该字符的 Unicode 编码。还可以使用 getBytes() 方法将字符串转换为字节数组,其中每个字符都使用 UTF-8 编码进行存储。

需要注意的是,Java 中的字符类型 char 是使用 UTF-16 编码的,它占用 16 位(2 字节)的存储空间。对于大部分常见的字符,一个 char 可以存储一个字符,但对于一些罕见的字符或辅助字符,可能需要使用两个 char 来表示一个字符。

总结来说,Java 使用 Unicode 编码来存储中文字符和其他字符,它提供了一种统一的方式来表示世界上几乎所有的字符。

String的常见的构造方法

在Java中,String 类有多种构造方法,可以用来以不同的方式创建字符串。以下是一些常见的 String 构造方法:

  1. 无参构造方法:创建一个空的字符串。

    String s = new String();
  2. 从数组构造:从字符数组中创建字符串。

    char[] chars = {'H', 'e', 'l', 'l', 'o'};
    String s = new String(chars);
  3. 从数组的子集构造:从字符数组的子集中创建字符串。

    char[] chars = {'H', 'e', 'l', 'l', 'o'};
    String s = new String(chars, 1, 3); // "ell"
  4. 从另一个字符串构造:复制另一个字符串的内容。

    String original = "Hello";
    String s = new String(original);
  5. 从字节数组构造:使用平台默认的字符集,将字节数组转换为字符串。

    byte[] bytes = {72, 101, 108, 108, 111};
    String s = new String(bytes);
  6. 从字节数组的子集构造:使用平台默认的字符集,将字节数组的子集转换为字符串。

    byte[] bytes = {72, 101, 108, 108, 111};
    String s = new String(bytes, 1, 3); // "ell"
  7. 指定字符集的字节数组构造:指定字符集将字节数组转换为字符串。

    byte[] bytes = {72, 101, 108, 108, 111};
    String s = new String(bytes, Charset.forName("UTF-8"));
  8. 指定字符集的字节数组的子集构造:指定字符集将字节数组的子集转换为字符串。

    byte[] bytes = {72, 101, 108, 108, 111};
    String s = new String(bytes, 1, 3, Charset.forName("UTF-8")); // "ell"
  9. StringBuilder构造:从一个StringBuilder对象中创建字符串。

    StringBuilder sb = new StringBuilder("Hello");
    String s = new String(sb);
  10. StringBuffer构造:从一个StringBuffer对象中创建字符串。

    StringBuffer sb = new StringBuffer("Hello");
    String s = new String(sb);
  11. CharSequence接口构造:从实现了CharSequence接口的任意类型(如String, StringBuilder, StringBuffer等)创建字符串。

    CharSequence cs = "Hello";
    String s = new String(cs);

注意:在实际编程中,直接使用字符串字面量(如 String s = "Hello";)是创建字符串的最常见方式,因为这种方式简洁且性能良好。Java虚拟机会在字符串常量池中维护这些字面量,以便重用。直接使用构造方法创建字符串的情况较少,通常只在需要从不同数据源(如数组或缓冲区)创建字符串时才会用到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1551445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Avue-crud表格操作栏不显示修改、删除按钮

2024-03-28 奇了怪了,CSDN自动把我之前的文章设置为VIP了,怪不得有时候搜东西看着看着要收费,现在找东西都不好找,我已经反馈不同意了,看看能不能给我取消吧 今天用Avue的时候发现操作栏的按钮没了,按照文…

网络专有名词

网络专有名词 一、子网掩码 IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;远程网络中的主机要相互通信必须通过…

从零开始学起!全方位解析App压力测试的关键要点!

简介 Monkey 是 Google 提供的一个用于稳定性与压力测试的命令行工具 可以运行在模拟器或者实际设备中 它向系统发送伪随机的用户事件对软件进行稳定性与压力测试 为什么要用 Monkey Monkey 就是像猴子一样上蹿下跳地乱点 为了测试软件的稳定性,健壮性 随机点…

如何使用群晖WebDAV实现固定公网地址同步Zotero文献管理器

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务。它支持多种后端 (D…

Automatic Prompt Engineering

让大模型自己生成prompt,生成提示(prompt)存在两种不同的操作方式。第一种方式是在文本空间中进行,这种提示以离散的文本形式存在。第二种方式是将提示抽象成一个向量,在特征空间中进行操作,这种提示是抽象…

android安卓看点新闻课设

一、系统需求分析 1.1 引言 1.1.1 开发目的 看点新闻App的开发是为了实时查看最新消息以了解社会动态,增长知识,增广见闻,顺便娱乐一下内心世界来放松自己。 1.1.2 开发背景 随着新媒体的崛起,纸媒遭受到重大打击&#xff0c…

vscode安装vue3+elment-plus

1.用vscode打开打算创建项目的目录 2.命令行中运行以下命令 npm create vuelatest3.设置好项目名称 4.执行以下命令 cd <your-project-name>5.执行以下命令 cnpm install6.执行以下命令安装elment-plus cnpm install element-plus --save7.执行以下命令 npm run dev…

Vuepress 2从0-1保姆级进阶教程——美化与模板

Vuepress 2 专栏目录 1. 入门阶段 Vuepress 2从0-1保姆级入门教程——环境配置篇Vuepress 2从0-1保姆级入门教程——安装流程篇Vuepress 2从0-1保姆级入门教程——文档配置篇Vuepress 2从0-1保姆级入门教程——范例与部署 2.进阶阶段 Vuepress 2从0-1保姆级进阶教程——全文搜索…

使用unplugin-auto-import页面不引入api飘红

解决方案&#xff1a;. tsconfig.json文件夹加上 {"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"module": "ESNext","lib": ["ES2020", "DOM", &q…

Python程序设计 循环结构(二)

1.斐波那契数列 编写一个能计算斐波那契数列中第x个数的小程序。斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、 因数学家莱昂纳多斐波那契&#xff08;Leonardoda Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为…

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

Collection与数据结构 数据结构预备知识(一) :集合框架与时间空间复杂度

1.集合框架 1.1 什么是集合框架 Java集合框架,又被称为容器,是定义在java.util包下的一组接口和接口实现的一些类.其主要的表现就是把一些数据放入这些容器中,对数据进行便捷的存储,检索,管理.集合框架底层实现原理其实就是各种数据结构的实现方法,所以在以后的学习中,我们会…

2024年2月吸尘器行业线上电商(京东天猫淘宝)综合排行榜

鲸参谋监测的线上电商平台&#xff08;淘宝天猫京东&#xff09;2月吸尘器行业销售数据公开。 根据鲸参谋电商数据平台显示&#xff0c;吸尘器行业2月销量累计约53万件&#xff0c;环比上个月下滑29%&#xff0c;同比去年下滑19%&#xff1b;销售额累计约4亿&#xff0c;环比上…

​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结

接上次博客&#xff1a;Redis&#xff08;四&#xff09;&#xff1a;持久化和事务&#xff1a;RDB&#xff08;定期备份&#xff09;【触发机制、流程说明、文件的处理、优缺点】、AOF&#xff08;实时备份&#xff09;【使用AOF、命令写入、文件同步、重写机制、启动时数据恢…

Karmada 管理有状态应用 Xline 的早期探索与实践

背景与动机 目前随着云原生技术和云市场的不断成熟&#xff0c;越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告&#xff08;http://info.flexera.com&#xff09; 从 flexera 的报告中可…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)、logisim工具

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费&#xff0c;70元。据说可以导出 Verilog &#xff01; logisim及其衍生版本 都需要安装java环境。 http://www.cburch.com/logisim/ 是原版&#xff0c; 下载页面&#…

Python实现猜数字游戏:一次编程旅程

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Nexus3 Docker 私有仓库

Nexus3 Docker 私有仓库 安装并部署 Nexus3 $ docker search nexus3$ docker pull sonatype/nexus3$ mkdir /home/tester/data/docker/nexus3/sonatype-work $ sudo chown -R 200 /home/tester/data/docker/nexus3/sonatype-work$ docker run -d --namenexus3 \ --restartalw…

【CSS浮动属性】别再纠结布局了!一文带你玩转CSS Float属性

在网页设计的世界里&#xff0c;CSS浮动属性&#xff08;float&#xff09;就像一把双刃剑。它能够让元素脱离文档流&#xff0c;实现灵活的布局&#xff0c;但如果处理不当&#xff0c;也可能引发一系列布局问题。 今天&#xff0c;我们就来深入探讨这把“剑”的正确使用方法…

T1 神奇苹果桶 (25分) - 小米前端笔试编程题解

考试平台&#xff1a; 赛码 题目类型&#xff1a; 20道选择 2道编程题 考试时间&#xff1a; 2024-03-23 &#xff08;两小时&#xff09; 题目描述 小希在森林冒险的时候发现一个神奇的木桶&#xff0c;某些时会凭空出现一些苹果&#xff0c;小希很解地大家分享了这一个神奇…