2017-09-29 6 views
1

以前のバージョンのコンパイラでコンパイルされた古いコードがいくつかあるとします。 Stringクラスのメモリ消費量が少ないか、最新のjdkで再コンパイルする必要がありますか?コンパイル済みの古いコードは、最新のjreでコンパクトな文字列の利点がありますか?

+0

クラスの内部動作を変更すると、それらを使用する他のすべてのクラスがこれらの変更の恩恵を受けることができます。それは、OOPにおけるカプセル化の全体的なポイントであり、ライブラリを使用しています。 – Holger

答えて

1

はいの場合、古いバイトコードは再コンパイルなしでコンパクトストリング最適化の恩恵を受けます。これは、Stringクラス自体の実装に変更が加えられたためです。バイトコード形式はまだかなり高いレベルであり、文字列、オブジェクトなどの実際の実装を抽象化しています。

しかし、別の変更(JEP280)は、恩恵を受けるために再コンパイルが必要です。以前のバージョンのJavaでは、非定型の文字列連結が、フードの下で一連のStringBuilder(またはStringBuffer)呼び出しにコンパイルされました。従って"I have " + i + " cats"のようなコードはnew StringBuilder().append("I have ").append(i).append(" cats").toString()に相当します。 JEP280では、これを変更してinvokedynamic命令への連結をコンパイルする代わりに、実行時に選択されたライブラリに文字列連結の実装を本質的に移します。これは最適化そのものではありませんが、将来再コンパイルすることなく、より効率的な文字列連結を追加することができます。

関連する問題