目次
2. 自動アンボックス化およびボックス化
ホームページ Java &#&チュートリアル Java で不必要なオブジェクトの作成を回避するにはどうすればよいですか?

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

Apr 24, 2023 pm 10:31 PM
java

はじめに

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles