2012-07-10 130 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 ==來比較字符串,如果它們都在文字池中,但這是從不建議的。

問候