1. ホーム
  2. java

[解決済み] JavaにおけるCharSequenceとStringの正確な違い [duplicate]

2022-10-29 10:44:27

質問

私はこれを読みました 前の記事 . の正確な違いは何ですか? CharSequence と文字列の正確な違いは何でしょうか? String が実装している CharSequence で、その String は文字の並びですか?例えば

CharSequence obj = "hello";
String str = "hello";
System.out.println("output is : " + obj + "  " + str);

に "hello"を代入するとどうなりますか? obj に割り当てられ、さらに str ?

どのように解決するのですか?

一般的な違い

を実装したクラスがいくつかあります。 CharSequence インターフェースを実装しているクラスは String . これらのうち

を受け付けるすべてのメソッドは CharSequence を受け付けるメソッドは、これらすべてに対して等しく動作します。を受け取るだけのメソッドは String だけを受け付けるメソッドは変換が必要になります。ですから CharSequence を引数型として使うのは賢明なことです。しかし String を返すのであれば、戻り値の型として String を返すのであれば、返される値の変換を避けることができるからです。 String .

また、マップは String ではなく、キータイプとして CharSequence ではなく、マップのキーが変更されてはいけないからです。言い換えれば、時々、不変の性質を持つ String が不可欠なのです。

具体的なコード・スニペット

貼り付けたコードに関しては、単純にそれをコンパイルし、JVM バイトコードを見るには javap -v . そこであなたは、両方の objstr は同じ定数オブジェクトへの参照である。として String は不変であるため、このような共有はすべて正しいのです。

+ の演算子は String の呼び出しは、様々な StringBuilder.append の呼び出しとしてコンパイルされます。ですから、次のものと同等です。

System.out.println(
  (new StringBuilder())
  .append("output is : ")
  .append((Object)obj)
  .append(" ")
  .append(str)
  .toString()
)

正直なところ、私のコンパイラの javac 1.6.0_33 をコンパイルします。 + obj を使って StringBuilder.append(Object) の代わりに StringBuilder.append(CharSequence) . 前者はおそらく toString() メソッドを呼び出すことになるでしょうが、後者はより効率的な方法で可能なはずです。一方 String.toString() を単に返すだけでは String そのものを返すだけなので、ほとんどペナルティはありません。ですから StringBuilder.append(String) の方が1メソッド分くらい効率的かもしれません。