如何在 Java (例子)

⚡ 智能摘要

将字符转换为字符串 Java 只需调用一次 `String.valueOf(myChar)` 或 `Character.toString(myChar)` 即可。反向移动则使用 `charAt(index)`,它会根据字符的位置从字符串中提取一个字符。

  • 🔘 String.valueOf: String.valueOf(myChar) 返回一个单字符字符串,最清楚地表明了转换的意图。
  • ☑️ Character.toString: Character.toString(myChar) 的作用相同,而且由于 Java 9,简单地委托给 String.valueOf。
  • ✅ 字符: charAt(index) 返回从零开始的位置的字符,如果超出有效范围,则抛出 StringIndexOutOfBoundsException 异常。
  • 🧪 字符数组: toCharArray() 将字符串拆分为字符数组,而 new String(chars) 根据该数组重建文本。
  • 🛠️ 无需选角: String 类型永远不能转换为 char 类型,因为 String 是一个对象,而不是相关的原始类型。
  • 📌 Unicode 限制: 一个字符包含一个 16 位 UTF-16 代码单元,因此表情符号需要两个字符或 Character.toString(codePoint)。

Java 将字符转换为字符串,以及将字符串转换回字符的代码

在本教程中,我们将学习两个简短的程序,它们分别在两种方式之间转移一个值。 Java 存储文本:

  1. 将字符转换为字符串
  2. 将字符串转换为字符

这两种类型不能互换。char 是一种基本类型,它只包含一个 16 位 UTF-16 代码单元,用单引号括起来,写成 'g'。String 是一个对象,它包含一系列这样的代码单元,用双引号括起来,写成 ""。Guru99”。因为一个是基本类型,另一个是对象,所以无法通过类型转换将它们连接起来——必须使用库方法来完成这项工作。 Java 每个方向各供应一个。

将字符转换为字符串

将字符转换为字符串有多种方法。 Java内部 a Java 字符串存储其文本 char 类型可以看作是一个代码单元数组,因此单个 char 值可以很容易地放入其中一个代码单元中。char 是一种 16 位无符号数据类型,宽度为两个字节,可以存储 0 到 65,535 之间的值。

我们可以使用两种方法将字符转换为字符串:Character 类的静态方法 toString() 和 String 类的静态方法 valueOf()。两者都返回一个长度为一个字符的新字符串,下面的两个程序会打印相同的结果。

方法 1:使用 toString() 方法

下面这个程序将字母 g 存储在一个数组中。 字符变量 然后将其传递给 Character.toString() 函数,该函数会将该单个字符作为字符串返回。代码是可编辑的,因此您可以更改字母并再次运行,以查看输出结果。

public class CharToString_toString {
  public static void main(String[] args) {
    //input character variable 
    char myChar = 'g';
    //Using toString() method
    //toString method take character parameter and convert string.
    String myStr = Character.toString(myChar);
    //print string value
    System.out.println("String is: " + myStr);
  }
} 

预期产出:

String is: g

方法 2:使用 valueOf() 方法

第二个程序替换了 `String.valueOf(myChar)`,其他任何内容都保持不变。 Java 9 这两个调用是相同的操作:Character.toString(char) 实现为对 String.valueOf(char) 的调用,因此两者速度没有明显快慢之分。

public class CharToString_valueOf {
  public static void main(String[] args) {
    char myChar = 'g';
    //valueOf method take character parameter and convert string.
    String myStr = String.valueOf(myChar);
    ////print string value
    System.out.println("String is: " + myStr);
  }
}

预期产出:

String is: g

将字符转换为字符串的其他方法

在旧代码和面试题中还出现了另外四种方法。它们都能实现,但没有一种像上面两种方法那样简洁易懂,而且其中两种方法分配的内存过多。

public class CharToStringMore {
  public static void main(String[] args) {
    char myChar = 'g';

    // 1. concatenation with an empty literal
    String byConcat = myChar + "";

    // 2. the Character wrapper instance method
    String byWrapper = Character.valueOf(myChar).toString();

    // 3. a one-element array of code units
    String byArray = new String(new char[]{myChar});

    // 4. the format() helper with the %c conversion
    String byFormat = String.format("%c", myChar);

    System.out.println(byConcat + byWrapper + byArray + byFormat);
  }
}

预期产量:

gggg

该表格列出了每条路线何时值得使用。

付款方式 例如: 笔记
String.valueOf(char) String.valueOf(myChar) 推荐。只需调用一次,除了返回的字符串之外,不会产生其他对象。
Character.toString(char) Character.toString(myChar) 同样好。自 Java 1.4 版本及之后版本委托给 String.valueOf Java 9.
级联 myChar + “” 作品,以及 Java 9 及更高版本中,它会被编译成 InvokeDynamic 调用而不是 StringBuilder,因此之前关于速度慢的警告不再成立。但它仍然隐藏了实际意图。
字符包装器 Character.valueOf(myChar).toString() Box首先获取字符。使用 `Character.valueOf`,而不是已被弃用的 `new Character(char)` 构造函数(该构造函数已被移除)。 Java 9.
字符数组 new String(new char[]{myChar}) 分配一个数组并复制它。建议在已经持有字符数组的情况下使用此方法。
字符串格式 String.format(“%c”, myChar) 速度最慢,因为格式字符串是在运行时解析的。仅当字符是较大模板的一部分时才有用。

单字符转换的正反两个方向都已完成,接下来是反向操作。

将字符串转换为字符

我们可以使用 String 类的 charAt() 方法将 String 转换为 char。该方法接受一个从零开始的索引,并返回位于该位置的 char,因此读取每个字符意味着 厕所ping 从 0 到 length() 减 1。请求小于 0 或大于 length() 的索引会抛出 StringIndexOutOfBoundsException 异常。

以下程序遍历字符串。 Guru99 一次处理一个位置,并打印每个字符及其索引。

//Convert String to Character using string method 
package com.guru99;
 
public class StringToChar {
 
	public static void main(String[] args) 
	{
		//input String 
	      String myStr = "Guru99";
	      
	      //find string length using length method.
	      int stringLength =myStr.length();
	      
	      //for loop start 0 to total length
	      for(int i=0; i < stringLength;i++)
	      {
	    	  //chatAt method find Position and convert to character.  
	        char myChar = myStr.charAt(i);
	        
	        //print string to character
	        System.out.println("Character at "+i+" Position: "+myChar);
	      }
 
	}
 
}

预期产量:

Character at 0 Position: G
Character at 1 Position: u
Character at 2 Position: r
Character at 3 Position: u
Character at 4 Position: 9
Character at 5 Position: 9

注意,字符串不能直接进行类型转换:`char c = (char) myStr;` 这段代码无法编译,因为字符串是对象,而字符是基本类型。对于已知只包含一个字符的字符串,`charAt(0)` 是最佳解决方案。

将字符串转换为字符数组,反之亦然。

当需要一次性处理所有字符而不是一次处理一个索引时,toCharArray() 会返回结果。 一个新的字符数组将该数组转换回文本是 String(char[]) 构造函数或 String.valueOf(char[]) 的工作,两者都会以防御性的方式复制数组,因此以后对数组的编辑不会改变字符串。

public class StringCharArray {
  public static void main(String[] args) {
    String myStr = "Guru99";

    // the text split into its array of code units
    char[] chars = myStr.toCharArray();
    System.out.println(chars.length);
    System.out.println(chars[0]);

    // the array turned back into text
    System.out.println(new String(chars));
    System.out.println(String.valueOf(chars));

    // one range copied into an array you already own
    char[] part = new char[4];
    myStr.getChars(0, 4, part, 0);
    System.out.println(new String(part));
  }
}

预期产量:

6
G
Guru99
Guru99
Guru

第四种方法 `getChars(srcBegin, srcEnd, dst, dstBegin)` 会将一个范围复制到你已有的数组中,而不是分配一个新的数组。结束索引是不包含的,这就是为什么 `getChars(0, 4, part, 0)` 的结果为 0。 Guru 而非 Guru9. 超出范围边界抛出 IndexOutOfBoundsException 异常。

这三种方法的主要区别在于资源分配,如下所述。

任务 电话联系 它分配了什么
字符串转字符数组 myStr.toCharArray() 一个新的数组;对于空字符串是安全的,它会返回一个长度为零的数组。
将字符数组转换为字符串 new String(chars) 或 String.valueOf(chars) 一个新的字符串加上数组的内部副本。
将范围扩展到现有数组 myStr.getChars(0, 4, part, 0) 没什么特别的;它会将数据写入你提供的数组。

转换字符和字符串时常见的错误 Java

这些转换中的大部分问题并非源于方法本身,而是源于六个反复出现的错误。下表列出了每个错误及其解决方法。

市场问题 原因 固定
类型不兼容:String 无法转换为 char。 尝试进行类型转换,例如 char c = (char) myStr; 请改用 myStr.charAt(0)。对象和基本类型之间不存在类型转换。
StringIndexOutOfBoundsException 调用 charAt() 时使用负索引,或者对空字符串调用 length() 都会出错。 读取之前,请使用 isEmpty() 进行检查,或将索引与 length() 进行比较。
String.valueOf(null) 抛出 NullPointerException 裸空值与 char[] 重载匹配,这是最具体的一种匹配方式。 当您想要的文本为 null 时,请写成 String.valueOf((Object) null)。
Character.toString(65) 返回 A,而不是 65。 Java 版本 11 新增了 Character.toString(int) 重载,该重载将其参数读取为 Unicode 代码点。 对于数字 65,请使用 String.valueOf(65) 或 Integer.toString(65)。
表情符号打印出来是两个乱码。 高于 U+FFFF 的字符占用两个字符,一个高级替代字符和一个低级替代字符。 使用 codePointAt(0) 读取值,然后使用 Character.toString(codePoint) 重建它。 Java 11年及以后。
已弃用警告:新建角色(myChar) Character(char) 构造函数已被弃用,自此版本起 Java 9,并标记为移除 使用 Character.valueOf(myChar),或者让自动装箱提供包装器。

同一个 String 类支持许多相邻的练习: 用递归反转字符串, 比较两个字符串和 打印格式化输出.

常见问题

char 是一种基本类型,它存储一个 16 位 UTF-16 代码单元,用单引号括起来。String 是一个对象,它存储一系列这样的代码单元,用双引号括起来,并且它拥有诸如 length() 和 charAt() 之类的基本类型所不具备的方法。

不。因为 Java 9. `Character.toString(char)` 实际上是对 `String.valueOf(char)` 的调用,所以两者执行的代码相同。选择在你当前工作环境中更易读的写法即可;只有 `String.format(“%c”, c)` 才是真正慢的写法。

字符存储一个 16 位代码单元,表情符号位于 U+FFFF 之上。 Java 将它们拆分成代理对,这样它们就占用两个字符。使用 codePointAt() 读取代码点,并使用 Character.toChars() 或 Character.toString(codePoint) 重建文本。

弦A。 Java 11 版本新增了一个 int 重载,它将参数读取为 Unicode 代码点,而 65 是 A 的代码点。String.valueOf(65) 返回数字 65,这使得这两个调用很容易混淆。

使用加号运算符连接字符串,或者在循环内部进行加法运算时,调用 StringBuilder 的 append() 方法。 Java 字符串是不可变的,因此每次字符串连接都会分配一个新对象,而不是扩展旧对象。

从此以后 Java 9. 紧凑字符串将内部字符数组替换为字节数组加上编码标志,因此纯 Latin-1 文本每个字符使用一个字节。公共 API 没有变化,charAt() 仍然返回一个字符。

机器学习静态分析器会标记编译器接受的可疑转换,例如未加保护的 `charAt()` 调用或解析为字符数组重载的 `String.valueOf(null)`。它们会根据可能性对发现的转换进行排序,从而减少基于规则的简单扫描所带来的干扰。

GitHub 副驾驶 它能可靠地生成 String.valueOf() 和 charAt() 的单行代码,但也会重现训练数据中过时的建议,例如已弃用的 new Character(c) 构造函数。请编译每个建议并阅读弃用警告。

总结一下这篇文章: