4

たとえばJavaやC++の場合、メモリは文字列にどのように割り当てられますか?これはばかげているかもしれませんので、すみません。文字列のサイズが不明なため、疑問に思います。

4

6 に答える 6

7

Javaでは、Stringは不変オブジェクトであるため、割り当て時にの「サイズ」を知る必要がありますString 「静的」な場合は共有オブジェクトプールに割り当てられ(たとえばString、のような文字列"Hey, I'm a String litteral!")、を使用して構築された場合はヒープに割り当てられますnew String(...)

于 2012-07-10T15:22:18.220 に答える
4

Java文字列は不変のオブジェクトです。ある意味で、文字列を作成するたびに、文字列内の文字数で割り当てられたchar[]メモリがあります。その文字列に対して何らかの操作を行うと、それはまったく新しいオブジェクトになり、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

可変サイズ不明なサイズを混同します。どの言語の具体的な文字列も常に既知のサイズであり、文字列の各インスタンスのサイズが異なる場合があります。言語が可変長を処理する方法は大きく異なる可能性があり、実装によって異なります。

于 2012-07-10T15:48:48.220 に答える
0

以前の回答に追加するだけです。
Javaでは、文字列の作成方法に応じて、2つの方法で文字列を割り当てることができます。たとえば、文字列がString s = "some string";JVMで作成された場合、この文字列はいわゆるリテラルプール(メモリに問題があったときに残されたもの)に配置され、 String s = new String("some string");JVMで文字列を作成した場合、これはヒープに配置されます...
唯一の重要な違いは、文字列が両方ともリテラルプールにある場合は、operator ==を使用して文字列を比較しますが、これは推奨されません。

よろしく

于 2012-07-13T11:03:47.637 に答える