まず、create object の具体的な意味を明確にしましょう。私の理解によれば、文字列が character constant である場合、文字列オブジェクトはコンパイル時に決定されます。定数プールに格納されるため、 String b = new String("abc") のような操作がある場合は、文字列オブジェクトの作成としてカウントされません。文字列オブジェクトを作成すると、文字列オブジェクトが取得され、変数 b に関連付けられます。创建对象 的具体含义. 按我的理解, 如果字符串是 字符常量, 那么这个字符串对象是在编译时候确定好的, 它是存放在常量池中的, 因此就不算是创建了一个字符串对象, 而如果有 String b = new String("abc") 之类的操作, 那么可以认为是创建了字符串对象, 并与变量 b 关联.
ご理解をお願いいたします。フィードバックは大歓迎です
a = "a"; コンパイル時に、文字列 "a" が定数プールに入れられ、ヒープ上にオブジェクトは作成されません
b = "b" 同じ理由です
a = a + b; new StringBuilder オブジェクト、append(a)、append(b)、最後に tostring() を a に返します。
先に私の答えを言わせてください:私はそれが 3 だと思います。
まず、
create object
の具体的な意味を明確にしましょう。私の理解によれば、文字列がcharacter constant
である場合、文字列オブジェクトはコンパイル時に決定されます。定数プールに格納されるため、String b = new String("abc")
のような操作がある場合は、文字列オブジェクトの作成としてカウントされません。文字列オブジェクトを作成すると、文字列オブジェクトが取得され、変数b
に関連付けられます。创建对象
的具体含义. 按我的理解, 如果字符串是字符常量
, 那么这个字符串对象是在编译时候确定好的, 它是存放在常量池中的, 因此就不算是创建了一个字符串对象, 而如果有String b = new String("abc")
之类的操作, 那么可以认为是创建了字符串对象, 并与变量b
关联.根据上面的定义, 那么有: "a", "b", "abc", "567" 都是常量, 放在常量池中的, 因此就不算是创建对象了.
那么来看一下代码:
源码:
为了方便起见, 我手动给每一行编号了.
再来看一下对应的字节码:
由字节码可以看出, 源码的第四行
a = a+b
翻译为如下代码:那么这里就新建了一个对象
new StringBuilder()
, 接着调用builder.toString()
方法, 它源码如下:于是
builder.toString()
方法创建了一个 String 对象, 因此目前我们已经创建了两个对象
了.接着第五行
StringBuffer d = new StringBuffer("abc")
毫无疑问是 创建了对象StringBuffer
, 于是我们就有三个对象
了. 有一点需要注意的是StringBuffer d
从始至终都没有调用toString
方法, 因此就不会有多余的 String 创建出来.总结:
"a": 字符串常量, 不算创建对象
"b": 字符串常量, 不算创建对象
builder 对象: 在执行
a = a+b
时创建."ab": 由
StringBuilder.toString()
创建."abc": 字符串常量, 不算创建对象
"567": 字符串常量, 不算创建对象
d: 通过
上記の定義によれば、「a」、「b」、「abc」、「567」はすべて定数であり、定数プールに配置されるため、オブジェクトとして作成されません。new StringBuffer("abc")
ソースコード:
リーリー
便宜上、各行に手動で番号を付けました。対応するバイトコードを見てみましょう:🎜 リーリー 🎜バイトコードからわかるように、ソース コード
a = a+b
の 4 行目は次のコードに変換されます。 リーリー 🎜次に、ここで新しいオブジェクトnew StringBuilder()
が作成され、builder.toString()
メソッドが呼び出されます。そのソース コードは次のとおりです。 リーリー 🎜そのため、builder.toString()
メソッドは String オブジェクトを作成するため、2 つのオブジェクト
が作成されました。🎜 🎜次に、5 行目StringBuffer d = new StringBuffer("abc")
は間違いなくオブジェクトStringBuffer
を作成するため、3 つのオブジェクト
が存在します。StringBuffer d
は最初から最後までtoString
メソッドを呼び出すわけではないので、冗長な String は作成されないことに注意してください。🎜 🎜 🎜概要:🎜a = a+b
の実行時に作成されます。🎜🎜StringBuilder.toString()
によって作成されました。🎜🎜new StringBuffer("abc")
によって作成されました。🎜🎜 🎜 🎜最終的に 3 つのオブジェクトが作成されます。🎜ご回答ありがとうございます。残念ながら、今は逆コンパイルされたコードを理解できません。