Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个Java字符串可以有多少个字符?_Java_String - Fatal编程技术网

一个Java字符串可以有多少个字符?

一个Java字符串可以有多少个字符?,java,string,Java,String,我正在尝试Sphere Online Judge(SPOJ)的问题,在这里我需要为一个高达一百万位数的整数找到一个回文。我曾想过使用Java函数来反转字符串,但它们会允许字符串这么长吗 我相信它们最多可以是2^31-1个字符,因为它们由一个内部数组保存,数组在Java中由整数索引。您应该能够获得一个长度为 始终2147483647(231-1) (由Java规范定义,数组的最大大小,String类用于内部存储) 或 最大堆大小的一半(因为每个字符有两个字节)以较小者为准 Integer.MAX_

我正在尝试Sphere Online Judge(SPOJ)的问题,在这里我需要为一个高达一百万位数的整数找到一个回文。我曾想过使用Java函数来反转字符串,但它们会允许字符串这么长吗

我相信它们最多可以是2^31-1个字符,因为它们由一个内部数组保存,数组在Java中由整数索引。

您应该能够获得一个长度为

  • 始终2147483647(231-1)
    (由Java规范定义,数组的最大大小,String类用于内部存储)

  • 最大堆大小的一半
    (因为每个字符有两个字节)以较小者为准


  • Integer.MAX_VALUE是字符串的最大大小+取决于内存大小,但sphere在线判断的问题是您不必使用这些函数。您是否考虑过使用
    BigDecimal
    而不是
    string
    来保存数字?

    堆部分变得更糟,我的朋友们。UTF-16不能保证被限制为16位,可以扩展到32位。虽然理论上可以使用Integer.MAX_值字符,但JVM在它可以使用的数组大小上是有限的

    public static void main(String... args) {
        for (int i = 0; i < 4; i++) {
            int len = Integer.MAX_VALUE - i;
            try {
                char[] ch = new char[len];
                System.out.println("len: " + len + " OK");
            } catch (Error e) {
                System.out.println("len: " + len + " " + e);
            }
        }
    }
    

    注意:在Java9中,字符串将使用byte[],这意味着多字节字符将使用多个字节,并进一步减少最大值。如果您拥有所有的四字节代码点,例如emojis,您将只获得大约5亿个字符

    Java9使用byte[]存储String.value,因此在Java9中只能获得大约1GB的字符串。另一方面,Java8可以有2GB的字符串


    我所说的字符是指“char”,有些字符在BMP中是不可表示的(就像一些表情符号),因此它需要更多(目前为2个)字符。

    。。。或者最大堆大小除以2。。。因为角色是2bytes@ChssPly76:是的,没错。我编辑了我的答案,谢谢。Integer.MAX_值始终是2147483647(2^31-1),这是Java规范的一部分。假设是64位JVM,因为您需要8GB的虚拟内存来存储该长度的字符串。Java 9将对只有iso-latin-1内容的字符串使用每个字符一个字节,因此,此类字符串可以具有与堆相同数量的字符(以字节为单位)(或最大数组长度,以较小者为单位),但另一方面,由于非拉丁字符串在数组中使用两个字节,因此在Java 9中,它们的最大字符串长度将减半,仅支持1073741823个字符。您是说您需要编写一个生成回文的函数,回文的大小由用户指定,长度可达100万个字符?问题(来自SPOJ)可能包含一个100GB的文件,您希望立即将其加载到字符串中?认真地请用扫描仪!内部实现的可能重复与此无关——例如,没有理由不能将字符数据存储在long数组中。问题是接口使用整数表示长度
    getBytes
    和类似的代码,如果你尝试一个非常大的字符串,可能会有问题。这是真的-我是在暗示这个事实。我的错。这取决于应用程序将如何处理这些数字。如果它只是做一些文本方面的事情,比如查找回文、计算(十进制)数字,那么字符串就更好了。如果要进行算术运算,则使用BigDecimal(或BigInteger)更好。问题是“对于每K,输出大于K的最小回文”(其中K是给定的数字)。输出第一个小于K的回文非常简单。您需要使用算术来查找大于K的回文。例如:查找下一个大于99999999999的回文,或者下一个大于12922的回文。除了Java的
    char
    类型正好是16位,因此UTF-16使用的位数并不重要…@awksp:
    char
    是16位,但是
    字符串中的一个字符可以占用两个
    char
    (两个“代理”代码元素代表UTF16中的一个字符)。然而,Q仅用于十进制数字,这些数字不仅是BMP,而且是8859-1/block0和ASCII。在Java9中,使用拉丁-1或UTF-16编码。无可变长度编码,即无三字节字符。@apangin“使用UTF-8等替代编码不是目标”谢谢您的更正。能否附上Java-9将字符串大小从2 GB限制为1 GB的参考资料
    len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    len: 2147483645 OK
    len: 2147483644 OK