2012-07-10 89 views
2

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

+0

http://www.javamex.com/tutorials/memory/string_memory_usage.shtml – hovanessyan 2012-07-10 15:20:38

+0

“的字符串是未知大小的”:没有在Java中。 – assylias 2012-07-10 15:21:16

+1

字符串实际上永远不会是未知大小,无论它是否是不可变的。 – 2012-07-10 15:23:22

回答

2

在Java中,String是一个不可变的对象,所以在分配的时候知道 的“大小”为。如果它是“静态的”,它将最终分配到一个共享的对象池中(例如 litteralteral,如"Hey, I'm a String litteral!"),或者如果它使用new String(...)构建,则会在堆上分配。

3

Java字符串是不可变的对象。在每次创建一个字符串时,都会有一个字符串中分配了多少个字符的char []内存。如果你对该字符串进行任何操作,它将成为全新的对象,并且字符的长度将完成内存分配。

0

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

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; 
      ... 
0

你混淆可变大小未知大小。任何语言的具体字符串总是已知的大小,只是每个字符串的实例可能具有不同的大小。语言如何处理可变长度可能会非常不同,并且是特定于实现的。

+0

是的,我混淆了变量尺寸未知的尺寸。请原谅我的无知。这种无知导致了一些混乱。我的确意味着可变尺寸,而不是未知尺寸。 – user1210233 2012-07-10 16:15:59

0

只是添加到以前的答案。
在Java中,根据字符串的创建方式,可以通过两种方式分配Java字符串。例如,如果字符串是用String s = "some string";创建的,JVM会把这个字符串放在所谓的文字池(当内存出现问题时留下的东西),如果你创建字符串与String s = new String("some string"); JVM将把它放在堆上...
只有显着差异是你可以使用operator ==来比较字符串,如果它们都在文字池中,但这是从不建议的。

问候