アプリ版:「スタンプのみでお礼する」機能のリリースについて

StringBuilder sbJSON = new StringBuilder();

StringBuilderクラスについて教えて頂きたいのですが
StringBuilderクラスは可変長の文字列を扱うクラスだと思うのですが
この可変長の文字列と通常の文字列の違いについて調べてみたところ

可変長文字列:とりあえず、自由に文字列を入れられる。
固定長文字列:決めた上限文字数までしか入れられない。

とあったのですが
StringBuilderクラスは
Stringクラスの拡張版みたいなものと捉えて良いのでしょうか?

A 回答 (1件)

> StringBuilderクラスは可変長の文字列を扱うクラスだと思う


確かに StringBuilder は可変長の文字列を扱いますがそれは String も同じです。StringBuilder と String の違いは別のところにあります。

https://docs.oracle.com/javase/jp/8/docs/api/jav …
多分 Java ライブラリリファレンスの上記 URL 内の「文字の可変シーケンスです」という文から StringBuilder の特徴が可変長なことだと思われたのかもしれませんが、ここでいう「可変」は保持している内容を編集できるという意味です。
上記 URL のメソッド一覧を見れば delete・insert・replace といった内容編集に関するメソッドがあることに気付くと思われます。一方、String クラスでは変更を行っていそうなメソッドもその説明をよく読むと「……を返します」と書かれていて、そのクラスの保持している内容についてはクラスの説明の冒頭に「この値を作成したあとに変更はできません」と明記しています。

……え、でも String も以下のコードで内容を書き換えられるじゃないかって?

String s = "abc";
s += "def";
// ↑これで s の「内容」が "abc" から "abcdef" に書き換わった……?

残念ながらそれは違います。上記の代入演算子は以下の略記だという事を思い出してください。
s = s + "def";
このとき、まず s の内容と "def" を連結させたらどうなるかという結果を内容として持つ新たな String インスタンスが生成され、次にその新しいインスタンスへの参照を s に代入するという事が行われています。
つまり、参照型の参照先を見る方法があったならば、s の参照先は代入前と代入後とでは違ってきます。
一方、StringBuilder の append では参照先が変わることなく保持している内容が書き換わります。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!