You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:35:30