ホームページ  >  記事  >  Java  >  Java で不必要なオブジェクトの作成を回避するにはどうすればよいですか?

Java で不必要なオブジェクトの作成を回避するにはどうすればよいですか?

PHPz
PHPz転載
2023-04-24 22:31:051499ブラウズ

はじめに

Java 開発では、プログラマは同じ機能を持つオブジェクトを作成しないように最善を尽くす必要があります。これはメモリを消費するだけでなく、プログラムの実行速度にも影響するためです。この場合、オブジェクトの再利用を検討してください。

次に、オブジェクトが再利用されるシナリオの例を挙げて、騙されていないか確認します。騙されている場合は、バレる前にこっそり変更する必要があります。バレたらディスられます。 !

1, String と Boolean

以下の 2 つの書き方に違いはないようですが、根底にある jvm を深く理解すると、その特性を利用することができます。 jvm ランタイム定数プールを使用して、同じ機能を持つ String オブジェクトの作成 (特にループ内で作成) を回避すると、大幅なパフォーマンスの最適化とメモリの節約がもたらされます。

間違った書き方

// 每次都会创建一个新的String对象,且不会加入常量池
String name2 = new String("李子捌");

正しい書き方

// 正确写法
String name1 = "李子捌";

さらに、Java コードを書いたばかりのプログラマは、String、StringBuilder、および StringBuffer クラスも正しく選択する必要があります。使用。 String は不変のオブジェクトであり、通常は不変の文字列を定義するために使用されます。StringBuilder と StringBuffer は、文字列の結合などの可変文字列操作のシナリオで使用されます。StringBuffer はスレッド セーフであり、Synchronized キーワードを使用してスレッドの同期を実現します。

// StringBuffer中的append()方法
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

// StringBuilder中的append()方法
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

Boolean は一般的に使用される型です。開発では、new Boolean() の代わりに Boolean.valueof() も使用する必要があります。Boolean のソース コードからわかるように、Boolean クラスは 2 つの最後の静的プロパティ。Boolean.valueof() は 2 つの定義されたプロパティを直接返しますが、new Boolean() は新しいオブジェクトを作成します。

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

2. 自動アンボックス化およびボックス化

Java は、基本的なデータ型に対して自動アンボックス化およびボックス化関数を提供します。つまり、コード内でやりたいことは何でもできるということですか?この2種類を使い分ける?実際、理論上、コード レベルでは問題はありませんが、具体的なパフォーマンスの点では最適化の余地がまだあります。 ! !

パフォーマンスをテストしましょう

long start = System.currentTimeMillis();
Integer sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);

Integer を使用すると 3 ミリ秒かかります

Java で不必要なオブジェクトの作成を回避するにはどうすればよいですか?##

long start = System.currentTimeMillis();
// 修改Integer 为 int 
int sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);

int を使用すると 0 ミリ秒かかります

Java で不必要なオブジェクトの作成を回避するにはどうすればよいですか?

したがって、自動アンボックス化とボックス化の使用に関しては、実際には適切な考慮を行うことができますが、結局のところ、コードのパフォーマンスが少しずつ絞り出されることもあります。 ! !

3. 正規表現


正規表現は、文字列が正当であるかどうかを検証するためによく使用されます。まず簡単なコードを見てみましょう (一目でわかりますか? 何が問題ですか) ? もうわかったはずです!!!):

public static void main(String[] args) {

    String email = "1057301174@qq.com";
    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        email.matches(regex);
    }

    System.out.println(System.currentTimeMillis() - start);

}

このコードの実行時間は合計 71 ミリ秒かかりました。これはかなり速いようです。

Java で不必要なオブジェクトの作成を回避するにはどうすればよいですか?

しかし、非常に簡単な最適化を実行しましょう。最適化されたコードは次のとおりです:

public static void main(String[] args) {

    String email = "1057301174@qq.com";
    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";
    Pattern pattern = Pattern.compile(regex);

    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        //email.matches(regex);
        pattern.matcher(email);
    }

    System.out.println(System.currentTimeMillis() - start);

}

コードを再度実行します。合計で 1 ミリ秒かかります。高速です。 70倍以上! ! !

Java で不必要なオブジェクトの作成を回避するにはどうすればよいですか?

これは、ループ内で String.matches() メソッドを作成すると、毎回 Pattern.compile(regex) を実行する必要があり、作成コストがかかるためです。正規表現を有限状態マシンにコンパイルする必要があるため、Patter インスタンスは high になります。この場合、Java API はより便利なメソッド呼び出しを提供しており、それを見つけるのは簡単ではないため、パフォーマンスに関する考慮事項を無視することがよくあります。

以上がJava で不必要なオブジェクトの作成を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。