在 Java 中,获取字符串 String 的最后一个字符有几种常用方法,下面我将详细介绍这些方法,并提供代码示例和注意事项。

(图片来源网络,侵删)
使用 charAt() 方法(最常用)
这是最直接、最常用的方法。charAt(int index) 方法可以返回字符串中指定索引位置的字符。
核心思路:
- 获取字符串的长度
length()。 - 字符串的索引从
0开始,所以最后一个字符的索引是length() - 1。 - 使用
charAt(length() - 1)来获取该字符。
代码示例:
public class LastCharacterExample {
public static void main(String[] args) {
String str = "Hello, World!";
// 1. 检查字符串是否为空或长度为0,避免 StringIndexOutOfBoundsException
if (str != null && !str.isEmpty()) {
// 2. 获取最后一个字符
char lastChar = str.charAt(str.length() - 1);
System.out.println("原始字符串: " + str);
System.out.println("最后一个字符是: " + lastChar); // 输出 !
} else {
System.out.println("字符串为空或null,无法获取最后一个字符。");
}
}
}
优点:

(图片来源网络,侵删)
- 简单、直观。
- 性能高,直接通过索引访问。
⚠️ 重要注意事项:
如果字符串为空()或 null,直接调用 str.charAt(str.length() - 1) 会抛出异常:
- 对于空字符串 :
str.length()是 0,str.charAt(-1)会抛出StringIndexOutOfBoundsException。 - 对于
null字符串:str.length()和str.charAt()都会抛出NullPointerException。
在使用 charAt() 之前,必须检查字符串是否为 null 或 isEmpty()。
使用 substring() 方法
你也可以使用 substring() 方法来截取只包含最后一个字符的子字符串。
核心思路:

(图片来源网络,侵删)
- 使用
substring(int beginIndex)方法,beginIndex设置为length() - 1。 - 这会返回一个从倒数第二个字符(不包含)开始到末尾的子字符串,也就是最后一个字符。
- 由于返回的是一个
String,你可能需要调用.charAt(0)来获取char类型。
代码示例:
public class LastCharacterSubstringExample {
public static void main(String[] args) {
String str = "Java Programming";
if (str != null && !str.isEmpty()) {
// 获取只包含最后一个字符的子字符串
String lastCharAsString = str.substring(str.length() - 1);
System.out.println("原始字符串: " + str);
System.out.println("最后一个字符的子字符串: " + lastCharAsString); // 输出 g
// 如果需要 char 类型
char lastChar = lastCharAsString.charAt(0);
System.out.println("最后一个字符是: " + lastChar);
} else {
System.out.println("字符串为空或null,无法获取最后一个字符。");
}
}
}
优点:
- 逻辑清晰,明确表达了“获取最后一个字符”的意图。
缺点:
- 创建了一个新的
String对象,比charAt()方法有轻微的性能开销。 - 同样需要处理
null和空字符串的情况。
转换为字符数组(不推荐)
你可以先将字符串转换为字符数组,然后取数组的最后一个元素。
核心思路:
- 调用
toCharArray()将字符串转为char[]数组。 - 获取数组的长度
array.length。 - 取最后一个元素
array[array.length - 1]。
代码示例:
public class LastCharacterArrayExample {
public static void main(String[] args) {
String str = "test";
if (str != null && !str.isEmpty()) {
char[] charArray = str.toCharArray();
char lastChar = charArray[charArray.length - 1];
System.out.println("原始字符串: " + str);
System.out.println("最后一个字符是: " + lastChar); // 输出 t
} else {
System.out.println("字符串为空或null,无法获取最后一个字符。");
}
}
}
缺点:
- 性能最差:
toCharArray()方法会创建一个新的字符数组,会消耗额外的内存和时间。 - 代码相对冗长。
- 同样需要处理
null和空字符串的情况。
除非你有特殊需求(例如需要频繁操作字符串中的字符),否则不推荐使用此方法。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
charAt() |
性能最高,代码简洁 | 需要手动处理 null 和空字符串异常 |
⭐⭐⭐⭐⭐ (首选) |
substring() |
可读性好,意图明确 | 有轻微性能开销(创建新String) | ⭐⭐⭐⭐ |
toCharArray() |
逻辑直接 | 性能差,内存消耗大 | ⭐☆☆☆☆ (不推荐) |
最佳实践代码
在实际开发中,一个健壮的函数应该封装好这个逻辑,处理所有边界情况。
public class StringUtils {
/**
* 安全地获取字符串的最后一个字符。
* @param str 输入字符串
* @return 如果字符串为null或空,则返回'\0'(空字符);否则返回最后一个字符。
*/
public static char getLastCharSafely(String str) {
if (str == null || str.isEmpty()) {
return '\0'; // 返回一个默认值,表示没有字符
}
return str.charAt(str.length() - 1);
}
public static void main(String[] args) {
String test1 = "Hello";
String test2 = "";
String test3 = null;
String test4 = "A";
System.out.println("getLastCharSafely(\"" + test1 + "\"): " + getLastCharSafely(test1)); // o
System.out.println("getLastCharSafely(\"" + test2 + "\"): " + getLastCharSafely(test2)); // (空字符)
System.out.println("getLastCharSafely(" + test3 + "): " + getLastCharSafely(test3)); // (空字符)
System.out.println("getLastCharSafely(\"" + test4 + "\"): " + getLastCharSafely(test4)); // A
}
}
进阶:Java 8+ 的 Optional (更现代的方式)
如果你使用的是 Java 8 或更高版本,可以利用 Optional 来更优雅地处理可能为 null 的情况,避免使用像 '\0' 这样的魔法值。
import java.util.Optional;
public class LastCharOptionalExample {
public static void main(String[] args) {
String str = "Hello, Java 8!";
// 使用 Optional 避免空指针和空字符串
Optional<Character> lastCharOpt = Optional.ofNullable(str)
.filter(s -> !s.isEmpty()) // 过滤掉空字符串
.map(s -> s.charAt(s.length() - 1));
// 如果存在字符,则执行操作
lastCharOpt.ifPresent(c -> {
System.out.println("原始字符串: " + str);
System.out.println("最后一个字符是: " + c);
});
// 如果不存在(字符串为null或空),则执行此操作
if (lastCharOpt.isEmpty()) {
System.out.println("字符串为空或null,没有最后一个字符。");
}
}
}
这种方式在函数式编程风格中非常流行,它将“可能存在也可能不存在”的值显式地表达出来,使代码更安全、更易于理解。
