【问题标题】:Does java define string as null terminated?java是否将字符串定义为空终止?
【发布时间】:2013-08-24 04:17:56
【问题描述】:

正如我的标题所暗示的,这是一个理论问题。我想知道如果java将字符串定义为空终止。

【问题讨论】:

  • @Reimeus,那么他们如何跟踪字符串结尾?使用长度?
  • 虽然之前搜索过谷歌,但没有看到这个问题。可能是重复的!
  • Dewsworld,说这是一个理论上的问题,几乎是关闭的绝对理由。 SO 应该是针对您面临的实际问题。
  • @MatteoD - 这个问题实际上是关于不同的东西。它有一个误导性的标题。

标签: java string null


【解决方案1】:

我想知道java是否将字符串定义为空终止。

没有。字符串被定义为char 值的固定长度序列。所有可能的 char 值(从 0 到 65535)都可以在字符串中使用。没有“可区分”值表示字符串结束1

那么他们如何跟踪字符串结尾?使用长度?

是的。 String 对象有一个私有的 length 字段(在我检查过的所有实现中......)。

如果您想了解更多关于 Java 字符串是如何实现的,可以在线获取各种版本的源代码。谷歌搜索“java.lang.String source”。


1 - 如前所述,String 的 JLS 或 javadocs 都特别指出 String 实现不能使用 NUL 终止。但是,包括 NUL 在内的所有字符在 String 中都很重要这一事实意味着 NUL 终止是不实际的。

【讨论】:

    【解决方案2】:

    Java 字符串不会像在 C 或 C++ 中那样以空字符结尾。尽管 java 字符串在内部使用 char 数组,但其中没有终止 null 。 String类提供了一个叫length的方法来知道字符串中的字符个数。

    这是简单的代码及其调试器内容:

    public static void main(String[] args) {
        String s = "Juned";
        System.out.println(s);
    }
    

    调试器截图:

    【讨论】:

    • 你有什么理由支持你的回答吗?
    • @Juned Ahsan,你能解释一下吗:)
    • java规范中没有提到,但是如果你在debug模式下运行你的代码,你总是可以看到String内部数组的内容,并且不会有终止的空字符。
    • Java 是 JLS,它不要求空终止,但也不禁止它。 Java 的一个实现 没有做到这一点的事实没有您想象的那么重要。我不会投票给你,但你可能想要区分 Java 规范和实现。
    • 你能解释一下截图的意义吗?
    【解决方案3】:

    重要吗?

    如果您将 Java 字符串转换为某种序列化格式(到磁盘、网络等),那么重要的是序列化格式,而不是 JVM 的内部格式。

    如果您通过 JNI 读取 C 代码中的字符串数据,那么您永远不会直接读取数据,您总是使用 JNI 函数,例如 GetStringChars()GetStringUTFChars()GetStringChars() 未记录为返回以空值结尾的数据,因此您不应假定它是空值终止的——您必须使用 GetStringLength() 来确定其长度。与GetStringUTFChars() 类似,您必须使用GetStringUTF8Length() 来确定其在modified UTF-8 format 中的长度。

    【讨论】:

    • “重要吗?”嗯...很高兴知道计算机是如何工作的。
    • 如果您担心将NUL 字符放入String 会发生什么,这很重要。但是,如果您这样做,则可以说您错误地使用了String ...因为NUL 字符不应出现在真实文本中。 (但我接受在某些用例中,无论如何您都希望在 String 中允许 NUL。)
    • 这很重要:今天我假设它们是 NUL 终止的,并在字符串中间转义一个 \0 只是为了测试一个 reverse() 函数,然后反转;令我惊讶的是,即使在 \0 之后它也反转了,所以我来这里看看为什么:)
    • 亚当,虽然你的观点很清楚,但你没有回答这个问题。投赞成票是因为您以一种挑衅的方式让我们关注了一个有趣的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多