如何在Java中不使用内置函数获取字符串的长度?
在Java中不使用内置方法获取字符串长度的实现方式
场景1:处理以'\0'为终止符的C风格字符序列
如果是模拟C/C++风格的、以空字符'\0'结尾的字符数组,可以通过手动遍历统计长度:
public class StringLengthDemo { public static void main(String[] args) { char[] cStyleStr = {'J', 'a', 'v', 'a', '\0', 't', 'e', 's', 't'}; int length = 0; // 遍历字符数组,直到遇到'\0'终止 while (cStyleStr[length] != '\0') { length++; } System.out.println("长度:" + length); // 输出4 } }
这里直接通过数组下标访问字符,不属于调用内置方法,只要字符序列确实以'\0'结尾,就不会出现越界问题。
场景2:处理普通Java String对象
Java的String对象本身通过内部维护的长度字段标记终止,若要完全不使用length()、charAt()等内置方法,可以通过反射访问其内部存储结构来获取长度:
JDK 8及更早版本(基于char数组实现)
import java.lang.reflect.Field; public class StringLengthReflect { public static void main(String[] args) { String str = "Hello StackExchange"; try { // 反射获取String内部的char数组字段 Field valueField = String.class.getDeclaredField("value"); valueField.setAccessible(true); char[] valueArr = (char[]) valueField.get(str); // 数组的length是属性而非方法,符合要求 int length = valueArr.length; System.out.println("字符串长度:" + length); // 输出18 } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } }
JDK 9及以上版本(基于byte数组+编码标识实现)
JDK9+的String改用byte数组存储,需要结合编码标识计算长度:
import java.lang.reflect.Field; public class StringLengthReflectJdk9 { public static void main(String[] args) { String str = "你好Java"; try { Field valueField = String.class.getDeclaredField("value"); Field coderField = String.class.getDeclaredField("coder"); valueField.setAccessible(true); coderField.setAccessible(true); byte[] valueArr = (byte[]) valueField.get(str); byte coder = (byte) coderField.get(str); // LATIN1编码时,byte数组长度等于字符串长度;UTF16编码时,长度为数组长度的一半 int length = coder == 0 ? valueArr.length : valueArr.length / 2; System.out.println("字符串长度:" + length); // 输出6 } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } }
需要注意的是,反射依赖于String类的内部实现,不同JDK版本可能存在差异,实际使用中需要根据环境调整。
内容的提问来源于stack exchange,提问作者Shubham Dey
相关产品推荐
相关产品推荐

