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

目录

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.mfbz.cn/a/496222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github加速神器!解决github巨慢的问题,并且能够加速下载!另外推荐GitKraken -- 超好用的 Git 可视化工具

FastGithub github加速神器,解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问题。 下载地址: 清华云盘 2 部署方式 2.1 windows-x64桌面 双击运行FastGithub.UI.exe 2.2 windows-x64服务 fastgi…

WorkPlus最佳的内网通讯软件解决方案,助力企业构建高效沟通环境

高效的内部通讯对于团队协作和工作效率至关重要,而选择适合的内网通讯软件,能够提升企业的通讯效能。WorkPlus以其卓越的性能和全面的功能,成为企业内网通讯软件的最佳选择。 为何选择WorkPlus作为企业的内网通讯软件呢?首先&…

西藏实景三维技术研讨交流会成功举办

2024年3月21-22日,西藏自治区“实景三维技术研讨交流会”在拉萨成功举办。 本次会议由西藏自治区自然资源厅、自然资源部重庆测绘院指导,西藏自治区测绘学会、西藏自治区地理信息产业协会主办,武汉大势智慧科技有限公司(后简称“…

Java多线程实战-从零手搓一个简易线程池(二)线程池与拒绝策略实现

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️本系列源码仓库:多线程并发编程学习的多个代码片段(github) 🏷️个人学习笔记,若有缺误,欢迎评论区指正…

【每日一题 | 动态规划】访问完所有房间的第一天

文章目录 Tag题目来源解题思路方法一:动态规划 写在最后 Tag 【动态规划】【数组】【2024-03-28】 题目来源 1997. 访问完所有房间的第一天 解题思路 方法一:动态规划 定义状态 定义 f[i] 表示第一次到达房间 i 的日期编号。 根据题意,…

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储

简介 博客:https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则,这组规则定义了数据对象在 vSAN 存储上是如何保存的,存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…

upload-labs-master靶场训练笔记

2004.2.17 level-1 &#xff08;前端验证&#xff09; 新建一个写有下面一句话木马的php文件&#xff0c;然后把后缀改为png <?php eval($_POST["abc"]); ?> 用bp抓包后更改文件后缀为php 再用蚁剑等工具链接即可拿下shell level-2 &#xff08;后端…

js改变图片曝光度(高亮度)

方法一&#xff1a; 原理&#xff1a; 使用canvas进行滤镜操作&#xff0c;通过改变图片数据每个像素点的RGB值来提高图片亮度。 缺点 当前项目使用的是svg&#xff0c;而不是canvas 调整出来的效果不是很好&#xff0c;图片不是高亮&#xff0c;而是有些发白 效果 代码 …

量子通信达新高度!两大诺奖技术联手,铸就前所未有的高效纠缠光子源

滑铁卢大学量子计算研究所&#xff08;IQC&#xff09;的科学家们成功地融合了两项诺贝尔奖级别的研究成果&#xff0c;从而在量子通信领域取得了重大进展。他们现在能够通过量子点技术高效生成几乎完美的纠缠光子对&#xff0c;这一突破性成果已在《通信物理学》&#xff08;C…

实例:NX二次开发求取封闭曲线的面积(多个封闭曲线)

一、概述 最近在NX二次开发群里有人推了一篇关于写求取封闭曲线面积的文章。针对小白的我决定试着做一做&#xff0c;期间遇到了很多问题&#xff0c;全部用NXOpenC通过录制代码进行修改&#xff0c;最后发现老是有问题&#xff0c;后来通过ufun转化解决了问题&#xff0c;个人…

如何使用在项目中使用echarts

一、使用echarts的好处和作用 ECharts 是一个强大的数据可视化库&#xff0c;主要用于在网页上创建丰富多彩的交互式图表和地图。一些 ECharts 的好处和作用包括&#xff1a; 好处&#xff1a; 丰富的图表类型&#xff1a;ECharts 提供了各种常见的图表类型&#xff0c;如折线…

python的一些知识点

在C C Java中&#xff0c;基本数据类型变量&#xff08;将常量数据存储在变量空间当中&#xff09; int a 3; int b 4; 在C C中&#xff0c;指针变量&#xff08;存储的是变量的物理内存地址&#xff09; int a 3; int* b; b &a; int** c; c &b; printf("%d&…

jira安装与配置

1. 环境准备 环境要求 1) JDK1.8以上环境配置 2) Mysql数据库5.7.13 3) Jira版本7及破解包 1.1 JDK1.8安装配置 1) 首先下载 JDK1.8&#xff0c; - 网址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html - windows64 版&am…

Vue3气泡卡片(Popover)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传title卡片标题string | slot‘’falsecontent卡片内容string | slot‘’falsemaxWidth卡片内容最大宽度string | number‘auto’falsetrigger卡片触发方式‘hover’ | ‘click’‘hover’falseoverlayStyle卡片样式…

开源AI引擎:利用影像处理与目标检测技术对违章建筑排查

一、项目案例介绍 随着城市化进程的加快&#xff0c;城市规划和管理工作面临着前所未有的挑战&#xff0c;违章建筑的排查与处理成为了城市管理中的一项重要任务。传统的违章建筑排查方法依赖于人力巡查&#xff0c;效率低下且难以全面覆盖。为了解决这一问题&#xff0c;现代…

C++资产设备管理系统

一、引言 1.1 项目设计背景及意义 1.1.1理论研究基础 &#xff08;1&#xff09;C在C的基础上增加了面向对象的机制。 &#xff08;2&#xff09;充分利用面向对象机制中的多态性实现函数的设计。 1.1.2 技术层面的支持 运用系统为C面向对象程序设计提供的各种设计方法和V…

DAZ Studio中常用的快捷键组合

CtrlAlt左键: 旋转视图CtrlAlt右键: 平移视图CtrlF: 在Mac上对应AppleF,聚焦选中的物体Alt方向键: 平移视图CtrlP: 返回透视视图W/A/S/D: 上/下/左/右视图ShiftF11: 在Mac上可能需要添加Option键,全屏模式F3: 启用X射线视见效果Ctrl1到0: 切换各种渲染式样CtrlL: 切换场景灯光 …

Midjourney辞典AIGC中英双语图文辞典+Midjourney提示关键词

完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077

基于Java在线考试系统系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

element表格 加滚动,监听底部实现分页加载

表格要实现滚动很简单&#xff0c;给他加一个高度即可 height"300" 然后是监听事件 mounted() {this.lazyLoading();}, methods:{lazyLoading(){let dom document.querySelector(".el-table__body-wrapper");dom.addEventListener("scroll", (…
最新文章