4

如何为字符串分配内存,比如在 Java 或 C++ 中?这可能是愚蠢的,所以请原谅我。我想知道,因为字符串的大小未知。

4

6 回答 6

7

在 Java 中,是一个不可变对象,因此必须在分配时知道String其“大小” 。如果它是“静态的”(例如litteral,like ),它将最终分配在共享对象池中,如果使用.String String"Hey, I'm a String litteral!"new String(...)

于 2012-07-10T15:22:18.220 回答
4

Java 字符串是不可变的对象。在某种程度上,每次您创建一个字符串时,都会分配一个 char[] 内存,其中分配有字符串中的字符数。如果您对该字符串进行任何操作,它将是全新的对象,并且随着字符的长度,将完成内存分配。

于 2012-07-10T15:20:47.847 回答
2

在内部,javaString只不过是一个已知长度的 char 数组。以下是String的类成员:

  110   public final class String
  111       implements java.io.Serializable, Comparable<String>, CharSequence
  112   {
  113       /** The value is used for character storage. */
  114       private final char value[];
  115   
  116       /** The offset is the first index of the storage that is used. */
  117       private final int offset;
  118   
  119       /** The count is the number of characters in the String. */
  120       private final int count;
  121   
  122       /** Cache the hash code for the string */
  123       private int hash; // Default to 0
  124   
  125       /** use serialVersionUID from JDK 1.0.2 for interoperability */
  126       private static final long serialVersionUID = -6849794470754667710L;
            ...
于 2012-07-10T15:25:43.507 回答
0

它像向量一样动态分配。当它变得太大时,它会通过内部方法(C++)自动调整大小。在 Java 中,正如 thinksteep 已经提到的,字符串是不可变的。

于 2012-07-10T15:21:37.703 回答
0

只是为了添加到以前的答案。
在 Java 中,字符串可以通过两种方式分配,具体取决于字符串的创建方式。例如,如果使用String s = "some string";JVM 创建字符串,则会将此字符串放入所谓的文字池中(内存出现问题时留下的东西),如果您使用String s = new String("some string");JVM 创建字符串,则会将其放入堆中......
唯一显着的区别是您可以如果字符串都在文字池中,则使用 operator == 比较字符串,但不推荐这样做。

问候

于 2012-07-13T11:03:47.637 回答
0

您将variable sizeunknown size混淆了。任何语言中的具体字符串始终具有已知大小,只是字符串的每个实例可能具有不同的大小。语言处理可变长度的方式可能非常不同,并且是特定于实现的。

于 2012-07-10T15:48:48.220 回答