如何为字符串分配内存,比如Java或C ++?这可能很傻,所以请原谅。我想知道因为字符串的大小未知。
答案 0 :(得分:4)
Java字符串是不可变对象。在每次创建String时,都会在char []内存中分配字符串中的字符数。如果你对该String进行任何操作,它将是全新的对象,并且字符长度将完成内存分配。
答案 1 :(得分:4)
在Java中,String
是一个不可变的对象,因此String
的“大小”在分配时是已知的。如果它是“静态”(例如String
litteral,如"Hey, I'm a String litteral!"
),它将最终分配到共享对象池中,如果它是使用new String(...)
构造的,则最终分配在堆上。
答案 2 :(得分:1)
在内部,java String
只不过是一个已知长度的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;
...
答案 3 :(得分:0)
它像向量一样动态分配。当它变得太大时,它会通过内部方法(C ++)自动调整大小。在Java中,正如thinksteep已经提到的,字符串是不可变的。
答案 4 :(得分:0)
您将可变大小与未知大小混淆。任何语言的具体字符串总是具有已知大小,只是字符串的每个实例可能具有不同的大小。语言如何处理变量长度可能非常不同,并且是特定于实现的。
答案 5 :(得分:0)
只是添加到以前的答案
在Java中,字符串可以通过两种方式分配,具体取决于字符串的创建方式。例如,如果使用String s = "some string";
创建字符串,JVM会将此字符串放在所谓的文字池中(从内存出现问题时留下的内容)如果使用String s = new String("some string");
创建字符串,JVM会将其放在堆上......
唯一不同的是你可以使用operator ==来比较字符串,如果它们都在文字池中,但是从不推荐这个。
问候