コード最適化の詳細
1.クラスとメソッドの最終的な修飾子を指定してみてください。最終的な修飾子を持つ最終的な修飾子を備えたクラスを導出することはできません。 Java Core APIでは、Java.lang.Stringなど、ファイナルを適用する例がたくさんあり、クラス全体が最終的です。クラスの最終的な修飾子を指定すると、クラスが継承されるのを防ぎ、メソッドの最終的な修飾子を指定すると、メソッドがオーバーライドされないようにすることができます。クラスが最終として指定されている場合、そのクラスのすべての方法が最終的です。 Javaコンパイラは、すべての最終的な方法をインライン化する機会を探します。インラインは、Javaの動作効率を改善するために非常に重要です。
2。オブジェクトの使用、特に文字列オブジェクトの使用を再利用してみてください。文字列連結が発生する場合、代わりにStringBuilder/StringBufferを使用する必要があります。 Java仮想マシンは、オブジェクトの生成に時間を費やす必要があるだけでなく、これらのオブジェクトの収集と処理に時間を費やす必要がある場合もあります。
3.ローカル変数を使用して、可能な限りメソッドを呼び出します。呼び出しメソッドと、呼び出しで作成された一時変数がスタックに格納されるときに渡されます。静的変数、インスタンス変数などの他の変数は、ヒープで作成され、速度は遅くなります。さらに、スタックで作成された変数が終了すると、これらの内容がなくなり、追加のごみ収集は必要ありません。
4.時間内に流れを閉じます
Javaプログラミング中は、データベース接続とI/Oストリーミング操作を実行するときは注意してください。使用後、リソースをリリースするために時間内に閉じます。これらの大きなオブジェクトを動作させると、大規模なシステムオーバーヘッドが発生し、注意が必要ない場合は深刻な結果につながります。
5.変数の繰り返し計算を最小限に抑え、概念を明確にしてください。メソッドに1つの文がある場合でも、スタックフレームの作成、メソッドの呼び出し時にサイトを保護し、メソッドを呼び出すときにサイトを復元するなど、消費されています。たとえば、次の操作:
for(inti = 0; i <list.size(); i ++)
{...}は、次のことを置き換えることをお勧めします。
for(inti = 0、length = list.size(); i <length; i ++)
{...}
このように、list.size()が非常に大きい場合、それは多くの消費を減らします
6.怠zyなロード戦略を採用してみてください。つまり、必要に応じて作成してください
7.慎重に異常を使用することは、パフォーマンスに有害です。例外をスローするには、最初に新しいオブジェクトを作成する必要があります。 Throwableインターフェイスのコンストラクターは、FillinStackTrace()という名前のローカル同期メソッドを呼び出します。 FillinStackTrace()メソッドはスタックをチェックし、コールトレース情報を収集します。例外がスローされている限り、Java仮想マシンは、処理中に新しいオブジェクトが作成されるため、コールスタックを調整する必要があります。例外はエラー処理にのみ使用でき、プログラムの流れを制御するために使用しないでください。
8。試してみないでください...キャッチ...ループで、それは最も外側の層に配置する必要があります
ネチズンが提唱した意見によると、これは議論する価値があると思います
9.追加するコンテンツの長さを推定できる場合は、アレイリスト、LinkedLlist、StringBuilder、StringBuffer、Hashmap、Hashsetなど、アレイリストに実装されたコレクションおよびツールクラスの初期長さを指定します。例としてStringBuilderを取得します。
(1)StringBuilder()//デフォルトで16文字を割り当てる(2)StringBuilder(int size)// 16文字(3)stringbuilder(string str)//デフォルトは16文字 + str.length()文字スペースを割り当てるためにデフォルトを割り当てることができます。たとえば、StringBuilderの長さは、現在のStringBuilderが維持できる文字の数を表します。 StringBuilderが最大容量に達すると、容量を2回増やして2を追加するため、StringBuilderが最大容量に達すると、新しい文字配列を作成し、古い文字配列コンテンツを新しい文字配列にコピーする必要があります。 5000文字が長さを指定せずに文字配列に保存されていると推定できる場合、5000に最も近い2のパワーは4096であり、各拡張に追加された2は2に関係なく、次のとおりです。
(1)4096に基づいて、8194サイズの文字アレイを適用します。これは、最大12290サイズの文字アレイを一度に追加します。最初に5000サイズの文字配列を指定できる場合、この方法で元の4096文字を新しい文字配列にコピーするスペースの2倍以上を節約できます。したがって、基礎となるアレイに実装されたコレクションおよびツールクラスの合理的な初期化容量を設定することは間違っていません。これにより、即時の結果がもたらされます。ただし、アレイ +リンクリストに実装されているハッシュマップのようなコレクションは、テーブルに接続された1つのオブジェクトのみがほぼ0になる可能性があるため、推定サイズと同じように初期サイズを設定する必要はありません。2,000個の要素があると推定できる場合は、新しいハスマップ(128)と新しいハスマップ(256)に設定できます。
10。大量のデータをコピーするときは、System.ArrayCopy()コマンドを使用します
11.乗算と分割シフト操作を使用します
12。ループでオブジェクト参照を継続的に作成しないでください
例えば:
for(inti = 1; i <= count; i ++){object obj = newObject(); }このアプローチにより、カウントオブジェクトの参照がメモリに存在します。カウントが大きい場合、メモリを消費します。次のように変更することをお勧めします。
オブジェクトobj = null; for(inti = 0; i <= count; i ++){obj = newObject();}このようにして、メモリにオブジェクトオブジェクト参照は1つだけです。新しいオブジェクト()が使用されるたびに、オブジェクトオブジェクトの参照は別のオブジェクトを指しますが、メモリには1つのオブジェクトのみがあり、メモリスペースを大幅に保存します。
13。効率とタイプチェックの考慮に基づいて、アレイは可能な限り使用する必要があります。アレイリストは、アレイサイズを決定できない場合にのみ使用する必要があります。
14. HashMap、ArrayList、およびStringBuilderを使用してみてください。 Thread-Safeがそれを必要としない限り、Hashtable、Vector、およびStringBufferを使用することはお勧めしません。後者の3つは、同期メカニズムの使用により、パフォーマンスオーバーヘッドを持っています。
15.アレイをpublic static finalとして宣言しないでください
これは無意味であるため、参照を静的な最終としてのみ定義し、配列のコンテンツを自由に変更できます。配列を一般に宣言することはセキュリティの脆弱性です。つまり、アレイは外部クラスによって変更される可能性があります
16.適切な機会にシングルトンを使用してみてください。シングルトンを使用すると、負荷の負担を減らし、荷重時間を短縮し、負荷効率を向上させることができます。ただし、すべての場所がシングルトンに適しているわけではありません。簡単に言えば、シングルトンは主に次の3つの側面に適用できます。
(1)リソースの使用を制御し、スレッドの同期を介したリソースの同時アクセスを制御する(2)インスタンスの生成を制御して、リソースを節約する目的を達成する(3)データの共有を制御し、直接的な関連性を確立することなく直接的な関連性を確立することなく、複数の無関係なプロセスまたはスレッド間の通信を可能にします。
17.静的変数を自由に使用しないようにしてください
パブリッククラスA {private static b b = newb(); }この時点で、静的変数BのライフサイクルはクラスAのライフサイクルと同じです。クラスAがアンインストールされていない場合、参照Bで指摘されたBオブジェクトは、プログラムが終了するまでメモリに存在します。
18.クリアは、時間内にセッションを必要としなくなりました。アクティブなセッションをクリアするために、多くのアプリケーションサーバーにはデフォルトのセッションタイムアウトがあり、通常は30分です。アプリケーションサーバーがより多くのセッションを保存する必要がある場合、メモリが不十分な場合、オペレーティングシステムはデータの一部をディスクに転送します。また、アプリケーションサーバーは、MRU(最近使用されている)アルゴリズムに従って、いくつかの不活性セッションをディスクにダンプすることもあり、メモリの例外が不十分である場合もあります。セッションをディスクにダンプする場合は、最初にシリアル化する必要があります。大規模なクラスターでは、シリアル化オブジェクトは高価です。したがって、セッションが不要になった場合、セッションをクリアするために、HTTPSESSIONの無効な()メソッドを時間内に呼び出す必要があります。
19。ArrayListなどのランダムアクセスインターフェイスを実装するコレクションの場合、foreachループをトラバースする代わりにループに最も一般的なものを使用する必要があります。これはJDKによってユーザーに推奨されます。ランダムアクセスインターフェイスに関するJDK APIの説明は、ランダムアクセスインターフェイスの実装を使用して、高速ランダムアクセスをサポートすることを示します。このインターフェイスの主な目的は、一般的なアルゴリズムが動作を変更できるようにすることです。そうすれば、ランダムまたは継続的なアクセスリストに適用されると良好なパフォーマンスを提供できます。実際の経験により、ランダムアクセスインターフェイスを実装するクラスインスタンスがランダムにアクセスされる場合、通常のループを使用する効率は、foreachループを使用するものよりも高くなることが示されています。逆に、連続的にアクセスすると、イテレータを使用する方が効率的になります。次のコードを使用して、判断を下すことができます。
if(list instanceofrandomaccess){for(inti = 0; i <list.size(); i ++){}} else {iterator <?> iterator = list.iterable(); while(iterator.hasnext()){iterator.next()}} foreachループの基礎となる実装の原則はイテレーターであるため、文の後半は「順番に、順番にアクセスされた場合、イテレータを使用することがより効率的になります」とは、順番にアクセスされるクラスインスタンスがforeachループを使用してトラバースを使用します。
20。同期メソッドの代わりに同期コードブロックを使用すると、マルチスレッドモジュールの同期ロックメソッドブロック記事で非常に明確に説明されています。メソッド全体を同期する必要があると判断できない限り、同期コードブロックを使用して、同期する必要のないコードの同期を避けて、コード実行効率に影響します。
21.定数を静的な最終的なものとして宣言し、資本に名前を付けて、コンパイル中にこれらのコンテンツを一定のプールに入れて、実行時に生成された定数値の計算を回避できます。さらに、資本の定数の名前を命名すると、定数と変数の区別を容易にすることもできます
22.未使用のオブジェクトを作成しないで、未使用のクラスをインポートしないでください
これは意味がありません。 「ローカル変数Iが使用されていない」と「インポートJava.utilが使用されない」というコードに表示される場合は、これらの役に立たないコンテンツを削除してください
23.プログラム操作中に反射を使用しないでください。詳細については、リフレクションを参照してください。リフレクションは、Javaがユーザーに提供する非常に強力な機能です。強力な機能は、多くの場合、効率が低いことを意味します。プログラムの実行プロセスで反射メカニズムを使用すること、特にメソッドのInvokeメソッドを使用することはお勧めしません。実際に必要な場合、示唆的なアプローチは、反射を通じてオブジェクトをインスタンス化し、プロジェクトの開始時にメモリに入れることです。ユーザーは、ピアと対話するときに最速の応答速度を気にし、ピアプロジェクトが開始するのにどれくらいの時間がかかるかを気にしません。
24。データベース接続プールとスレッドプール、両方のプールを使用して、オブジェクトを再利用するために使用されます。前者は、頻繁に接続の開閉を避けることができ、後者は頻繁な作成と糸の破壊を避けることができます。
25。IO操作にバッファーされた入力および出力ストリームを使用します
バッファリド入力および出力ストリーム、すなわちバッファレッドリーダー、bufferedwriter、bufferedinputStream、bufferedOutputStream。
26.よりシーケンシャルな挿入とランダムアクセスを備えたシーンにArrayListを使用し、より多くの要素削除と中間挿入を備えたシーンにLinkedListを使用します。
これは、ArrayListとLinkedListの原則を理解することで知られています
27.公開方法であまりにも多くの正式なパラメーターを置かないでください
パブリック方法は、外の世界に提供される方法です。これらの方法をあまりにも多くの正式なパラメーターに与えた場合、2つの主な欠点があります。
1)オブジェクト指向のプログラミングアイデアに違反する。 Javaは、すべてがオブジェクトであることを強調しています。あまりにも多くの正式なパラメーターは、オブジェクト指向のプログラミングアイデアに沿っていません。
2)パラメーターが多すぎると、メソッド呼び出しのエラーの可能性が増加することは必然的になります。 3または4を指す「多すぎる」について。たとえば、JDBCを使用してInsertStudentinfoメソッドを記述します。学生テーブルに挿入する10の学生情報フィールドがあります。これらの10のパラメーターは、挿入方法の正式なパラメーターとしてエンティティクラスにカプセル化できます。
28.文字列変数と文字列定数を書き込むとき、前に文字列定数を記述するのは比較的一般的なトリックです。次のコードがある場合:
string str = "123"; if(str.equals( "123")){...}それを変更することをお勧めします:
string str = "123"; if( "123" .equals(str)){...}これは、主にヌルポインターの例外を回避できます
32。範囲を超えて基本的なデータ型の下向きの変換を強制しないでください
33。基本的なデータ型を文字列に変換します。基本的なデータ型.toString()は最速の方法であり、その後にstring.valueof(data)、および "基本的なデータ型を3つの方法に変換する最も遅い方法が続きます。I.toString()、string.valueof(i)、i +" "を使用できます。
publicStatic void main(string [] args){intlooptime = 50000;整数i = 0; longstarttime = system.currenttimemillis(); for(intj = 0; j <looptime; j ++){string str = string.valueof(i); } system.out.println( "string.valueof():" +(system.currenttimemillis() - starttime) + "ms"); starttime = system.currenttimemillis(); for(intj = 0; j <looptime; j ++){string str = i.tostring(); } system.out.println( "integer.tostring():" +(system.currenttimemillis() - starttime) + "ms"); starttime = system.currenttimemillis(); for(intj = 0; j <looptime; j ++){string str = i+""; } system.out.println( "i + /" /":" +(system.currenttimemillis() - starttime) + "ms");}実行中の結果は次のとおりです。
string.valueof():11msinteger.toString():5ms + "":25ms
したがって、将来、基本的なデータ型を文字列に変換する場合、toString()メソッドを使用することを優先する必要があります。その理由については、それは非常に簡単です:
1。string.valueof()メソッドは、下部のinteger.toString()メソッドと呼ばれますが、呼び出す前に短い判断を下します。
2。integer.toString()メソッドについては説明しません。直接呼び出します。
3。I + ""の最下層は、StringBuilderを使用して実装します。最初に追加方法を使用してスプライスし、次にtoString()メソッドを使用して文字列を取得します。それは明らかに最速2、最速1、そして最も遅い3です。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。