如何在 Java (例子)
⚡ 智能摘要
将字符转换为字符串 Java 只需调用一次 `String.valueOf(myChar)` 或 `Character.toString(myChar)` 即可。反向移动则使用 `charAt(index)`,它会根据字符的位置从字符串中提取一个字符。
在本教程中,我们将学习两个简短的程序,它们分别在两种方式之间转移一个值。 Java 存储文本:
- 将字符转换为字符串
- 将字符串转换为字符
这两种类型不能互换。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 类支持许多相邻的练习: 用递归反转字符串, 比较两个字符串和 打印格式化输出.
