この35点のJavaコードの最適化の詳細は、あなたがそれを使用します

リンクします。https://www.jianshu.com/p/6e472304b5ac

序文

コードの最適化、非常に重要な問題。一部の人々は、変更することは何も、変化とそのためのコードの効率に影響を与えるものを変更していないが存在しない、いくつかの小さな場所を無駄に感じるかもしれませんか?問題は、それがエビが有用食べる、内部のクジラのように、海のように、私が考える何ですか?うんざりしたクジラ役に立たない、しかし、後に複数のエビを食べます。

ないBUGプロジェクトはできるだけ早くラインに焦点を当てた場合は、コードの最適化は、同じである、そして時間はコードの詳細は審議ではないとすることができ、発生する可能性がある。しかし、コードを開発し、維持するのに十分な時間がある場合は、この時点では、各を考慮する必要がありますあなたは詳細を最適化し、そして絶対的にアップグレードされたコードの効率化のために蓄積された一つの小さな最適化のポイントずつすることができます。

コードの最適化の目的は、以下のとおりです。

コードサイズ縮小

コード実行の効率を向上させます

コードの最適化の詳細

図1に示すように、可能な限り指定されたクラス、最終の改質方法

final修飾子クラスと派生されていません。JavaコアAPIでは、java.lang.Stringなど、最終的なアプリケーションの多くの例があり、クラス全体は、最終あります。クラスのための最終的な修飾子を指定したクラスは、最終的な修飾方法はオーバーライドできないようにする方法として指定し、継承することはできませんことができます。最終としてクラスならば、すべてのメソッドのクラスは最終的なものです。Javaコンパイラは、すべてのメソッドはJavaの運用効率を向上させるためのインライン重要な役割を持つ最終以内の機会を探します、特定のJavaランタイムの最適化を参照してください。これは50%の平均によって性能を向上させることができます。

2、オブジェクトを再利用しよう

これは、Stringオブジェクトは、文字列が接続されている場合は特にStringBuilderの/ StringBufferの場所を使用する必要があります。Java仮想マシンがオブジェクトを生成するのには時間がかかるだけでなくので、将来的には、プログラムのパフォーマンスに大きな影響をもたらすでしょう、したがって、ガベージコレクションおよび処分のため、これらのオブジェクトに時間を費やすあまりにも多くのオブジェクトを生成する必要があるかもしれません。

3、ローカル変数を使用するようにしてください

配信メソッド呼び出しのパラメータとコールで作成した一時変数が速く、など静的変数、インスタンス変数、などの他の変数は、ヒープ、低速で作成されたスタックに格納されています。また、操作の方法で作成したスタック変数は、コンテンツがなくなって、追加のガベージコレクションを完了していません。

図4に示すように、流れを閉じます

私は/ Oストリームの操作は、使用後に、速やかに解放リソースにシャットダウンしたときに、Javaプログラミング、データベース接続は、注意してください。これらの大きなオブジェクトの操作の大規模なオーバーヘッドシステムの原因となりますので、わずかなミスが重大な結果につながります。

変数のダブルカウントを最小限にするために5、

明確なコンセプト、メソッド呼び出しは、方法は一つだけの文章であっても、また方法、復旧サイト完成し、呼び出し元のメソッドを呼び出すときに、サイトを保護するために、スタックフレームの作成など、そこに消費されています。したがって、たとえば、次の操作:

推奨代替品:

多くの消費を減らすことはlist.size時間のこのように、多くの、

6、必要なときにのみ作成され、可能な限り遅延ロード戦略、*

例えば:

推奨代替品:

図7に示すように、異常な注意

パフォーマンスへの異常な有害。例外は、新しいオブジェクトを作成、収集情報のコールトラッキングにスタックをチェックするために地元の同期方法にfillInStackTraceと呼ばれたThrowableインタフェースのコンストラクタ、にfillInStackTraceメソッドを呼び出すために最初にスローされます。新しいオブジェクトがプロセスで作成されているため、限りスローされる例外があるとして、Java仮想マシンは、コールスタックを調整する必要があります。例外は唯一のエラー処理のために使用することができ、プログラムの流れを制御するために使用すべきではありません。

[ピクチャーに失敗しました...(画像b49a00-1567085107360)をアップロード]

8.キャッチ...ループ内で使用しないでください...、あなたは最も外側の上に置く必要があります

最後の場合を除きます。理由もなくそう書かれた場合は、限り、あなたはほとんどのシニアリーダーシップ、少し強迫性障害があるとして、おそらくあなたは、なぜ、ごみにこのコードを書く呪います。

コンテンツの長さはアレイ状のボトムセットに追加されると推定される場合に、図9に示すように、ツールは、初期の長さを指定します

そのようなStringBuilderの例に、等のArrayList、LinkedLlist、のStringBuilder、StringBufferの、HashMapの、HashSetの、など。

16文字の(1)のStringBuilder //デフォルトのスペース割り当て

(2)のStringBuilder(int型のサイズ)//デフォルトスペースの割り当てサイズの文字

16文字の(3)のStringBuilder(String str)文字//デフォルトの割り当て+ str.length文字スペース

これは、パフォーマンスを大幅に向上させることができ、初期容量のクラス(だけのStringBuilder以上のように本明細書で言及)によって設定することができます。例えばStringBuilderのバーの長さを保持することができ、現在のStringBuilder内の文字の数を示します。StringBuilderのが最大容量に達した時は、それ自体が2プラス2倍の電流容量を増加しますのでStringBuilderのが最大容量に達したときに、それは新しい文字配列し、古いキャラクターを作成する必要があります文字の新しい配列に配列の内容をコピーする - これは非常にコスト業績です。あなたは5000に最も近い2のべき乗の長さを指定せずに5000文字程度ストアへの文字配列にかかわらず、拡張プラス2の時、4096で見積もることができれば、その後、想像:

4096、8194に基づき、(1)は、その後、文字配列のサイズを適用し、開始が2倍以上に節約、文字配列5000のサイズを指定することができれば、12290文字配列のサイズを提出したのと同等にまで追加スペース;

(2)配列への新しい文字にコピー元の文字4096。

このように、メモリ空間の浪費とコードの効率を低下させます。合理的な初期容量を設定するためのツールのセットを達成するために、基になる配列が間違っていないとそう、それはすぐに結果をもたらすでしょう。しかし、HashMapのように、この配列は、セットリストを達成することをノートは+である、あなたがテーブルの上に接続オブジェクトの可能性はほぼゼロであるという理由だけで、のように、初期サイズとセットの大きさを推定します。2,000の要素が新しいHashMapの(128)、新しいハッシュマップ(256)を使用してもよい提供があると推定される場合、2の初期サイズN番目のパワーを設定することを推奨。

10、コマンドを使用して、大量のデータをコピーするSystem.arraycopyの

乗算および除算を使用して11、シフト演算

例えば:

コンピュータの底面には、動作位置が最も便利であるので、シフト操作が大幅にパフォーマンスを向上させることができ、最速は、それは次のように改正提案されています。

シフト動作が速いかもしれないが、コードを作るあまりよく理解かもしれないが、それは適切なコメントを追加することをお勧めします。

12、内側ループは、オブジェクト参照を作成し続けません

例えば:

このような行為は、コピーObjectオブジェクトの参照カウントを持っているメモリにつながる多くを数えることができ、それはメモリのコストがあり、読むことをお勧めします。

この場合には、一つだけのメモリオブジェクトのオブジェクト参照、ときそれぞれの新しいオブジェクト、オブジェクトオブジェクトオブジェクトの基準点何も異なるが、唯一つのメモリ、大幅なセーブメモリ空間アップ。

唯一の13は、効率性と型チェックの考慮事項に基づいて、配列は、可能な限り使用されなければならない、我々はArrayListのを使って配列のサイズを決定することはできません

14、スレッドのセキュリティニーズがない限りはHashMap、ArrayListを、StringBuilderを、を利用する、またはパフォーマンス上のオーバーヘッドの使用につながった3つの同期メカニズムの後にハッシュテーブル、ベクトル、StringBufferのを、使用することはお勧めしません。

15、公共の静的な決勝として配列を宣言しません

これは無意味であるため、それだけで静的な決勝のための基準を定義し、またはアレイの内容を自由に変更することができ、配列は公共のセキュリティ上の脆弱性として宣言され、その配列は、クラス外で変更することができることを意味します。

16、可能な限り適切な実施形態の場合には単一と

シングルトンは、負荷の負担を軽減負荷までの時間を短縮し、負荷の効率を改善するが、すべての場所が単一の場合に適していないことができ、簡単な言葉で、一つのケースは、主に以下の三つの側面に適用されます。

(1)リソースの使用を制御するには、スレッドによって制御されるリソースへの同時アクセスを同期させます

(2)リソースを節約するために、制御インスタンスを生成します

(3)制御は、複数のプロセスまたはスレッド無関係通信の間達成するように、直接的な関連で、データを共有しました

17、スタティック・ランダム変数を使用して回避しよう

オブジェクトへの参照を静的変数として定義されているときには、知っている、そしてGC通常、ヒープメモリのようなオブジェクトによって占有され再利用されていません。

アンインストールされていない場合、プログラムが終了するまで、同じクラスAのライフサイクルのこの静的変数bでは、クラスAは、次いで、B物体基準点Bは、永久的なメモリであろう

18は、タイムリーな除去セッションはもはや必要ではありません

セッションがあるが、もはやアクティブクリアするには、多くのアプリケーションサーバは、デフォルトのセッションタイムアウト時間、通常は30分を持っていません。より多くの会話を維持する場合は、アプリケーションサーバーの必要性、メモリ不足、オペレーティングシステムは、ディスクへのデータの一部を譲渡する場合、アプリケーションサーバは、MRUに基づくことができる(最近最も頻繁に使用される)アルゴリズムは、非アクティブなセッションの一部がディスクにダンプですさらにはメモリ例外を投げすることができます。セッションをディスクにダンプする場合、それは最初に直列化されなければならない、大規模なクラスタ、オブジェクトをシリアル化され、コストは非常に高価です。セッションが不要になったときにそのため、あなたは明確なセッションへのHttpSession無効タイムリーな方法を呼び出すべきではありません。

19、インターフェイスのセットを使用すると、反復する代わりに、foreachループのループのための最も一般的に使用する必要があり、そのようなArrayListのようランダム・を達成するために

これは、JDKは、ユーザーにお勧めです。解釈RandomAccessインタフェース用JDKのAPIです:彼らは高速なランダムアクセスをサポートすることを示すために使用されるRandomAccessインタフェースを実現するために、このインタフェースの主な目的は、一般的なアルゴリズムはランダムまたはシーケンシャルアクセスリストに適用するために、自分の行動を変えることができるようにすることです良いを提供することができますパフォーマンス。実際の経験が示すランダム・インターフェース・クラス・インスタンス、foreachループを使用するためのより高いであろう通常のサイクル効率を使用してランダムアクセスする場合は、逆に、シーケンシャルアクセスの場合、より高い効率の使用はイテレータであろう。次のようなコードを決定することができます。

foreachのループ変数の長さのパラメータと原則:foreachループのイテレータにイテレータの基礎となる原理は、Javaのシンタックスシュガー1を参照してください。だから、言葉の後に反復するためのforeachループを使用して、クラスのインスタンスを順次アクセスすることを意味「逆に、それがシーケンシャルアクセスの場合、イテレータは高効率になります使用します」。

20、同期コードブロックを使用して別の同期方法

それは、そうでない場合は、同期ブロックを利用して、全体の方法を同期させるために必要な決定同期コードを必要としないものを避けることができない限り、テキストブロック方式では、マルチスレッドのモジュールでこの同期ロックは、非常に明確にされていますまた、コード実行の効率に影響を与え、同期。

21、定数は、静的最終として宣言され、大文字で指定されています

したがって、コンパイル時に、あなたは運転中に一定の計算値の生成を回避するために、一定のプールにコンテンツを置くことができます。また、大文字の名前の定数名も容易変数と定数とを区別することができます。

22は、使用していないいくつかのオブジェクトを作成していない、いくつかのクラスをインポートしていない使用しないでください

、「輸入java.utilのは、使用されることはありません」「私が使用されていないローカル変数の値」のコードが表示されますが、これらの不要なコンテンツを削除してください場合、これは、無意味です

23、プログラムは、リフレクションを使用しないように実行されています

反射を参照してください。Javaのリフレクションは非常に強力な強力を持つユーザーは、多くの場合、非効率的な手段を提供することです。メソッドInvoke特に方法、特にプログラムにおける反射の頻繁な使用が実行され、推奨されません、実際に必要な暗示的なアプローチがある場合は、これらのクラスは、インスタンスを反映して、プロジェクトの開始時にロードする必要が反映されていますオブジェクトの、メモリに置かれ - それは、プロジェクトの終了に時間を過ごすために始めたどのくらいのユーザーが唯一気にしない、ケアとの対話を終了する最速の応答時間を取得します。

データベース接続プーリングとスレッドプールを使用して24、

両方のプールは、前者が作成したスレッドを破壊し、頻繁に回避することができ、頻繁な開閉の接続を、避けることができ、再利用のためのオブジェクトであります

25、バッファ入力と出力を使用してIO操作ストリーム

緩衝入出力ストリーム、大幅IOの効率を向上させることができる、すなわちBufferedReaderの、BufferedWriterの、BufferedInputStreamを、なBufferedOutputStream、

26、挿入およびよりランダムアクセスのArrayListを使用してシナリオ、および原則のこのLinkedListの、ArrayListのとLinkedListの理解を知って使用してより多くのシーンを介在削除要素の順序

27は、パブリックプロセスがあまりにも多くのパラメータを持っていることはできません。

メソッドこれらのメソッドにあまりにも多くのパラメータは、2つの主な欠点がある場合は、外部から提供されるパブリックメソッド:

1、オブジェクト指向プログラミングの考え方に違反し、Javaやストレス、すべてがあまりにも多くの仮パラメータ、およびオブジェクト指向プログラミングのアイデアは適合しません、オブジェクトであります

2、あまりにも多くのパラメータは、必然的に誤り確率メソッド呼び出しの増加につながります

「あまり」については番号、3,4バーを指します。たとえば、私たちはJDBCメソッドを使用してinsertStudentInfoを書き、学生情報学生テーブルとして挿入される10個のフィールドがあり、これら10個のパラメータは、insertメソッドは、パラメータとして、エンティティクラスにカプセル化することができます。

28、文字列変数と文字列定数は、時定数文字列EDITORIALに等しいです

これは、比較的一般的なヒントで、次のコードが存在する場合:

変更案は以下のとおりです。

主にnullポインタ例外を避けるために、そう

29、Javaでそれを知っていれば(I == 1)としてください(1 == i)がそこには違いはありませんが、あれば前者がと話すの読書習慣、

通常誰かが尋ねた "もし(I == 1)" と "(1 == I)場合は、" 何の違いから、C / C ++の話はありません。

「(私は== 1)であれば、」決意条件が成立しているC / C ++で、で、0は、そのようなコードがある場合、非ゼロベース、0は、偽表すゼロ以外の場合はtrueです。

"私は== 1" で満たされていないC / C ++の分析は、それが0、すなわち偽を表します。しかし、もし:

場合、プログラマは注意しないで、「もし(I == 1)」書かれた「(I = 1の)場合」、そう問題があるでしょう。私が割り当てられた1以内であれば非ゼロ内部内容を決定した場合、真が返されますが、明らかに私は2で、比較値が1である、それはfalseを返す必要があります。この場合、可能性が発生することがあり、いくつかの不可解なエラーがそう、発生につながることでC / C ++の開発、if文、誤った割り当てで回避開発するために、声明は次のように書かれている場合ことが示唆されました。

このように、開発者が誤って書いていない場合でも、「1 = I」、C / C ++コンパイラは、私たちは、私が1である変数に割り当てることができるためにも、最初の時間をチェックアウトすることができますが、定数iに1を割り当てることはできません。

しかし、Javaで、C / C ++この構文「の場合(I = 1の)」一度この構文を書いたので、Javaがエラー「型の不一致をコンパイルします、不可能です:int型からbooleanに変換することはできません。 " しかし、Javaのと、「もし(1 == I)」「(I == 1)であれば」にもかかわらず、意味論に違いはありませんが、前者で、話すの読書習慣が良いだろう。

30、配列toStringメソッドを使用していません

toStringを使用してアレイを印刷する何を見ています:

結果は次のとおりです。

意図は、配列参照をヌル・ポインタ例外によって引き起こされるので、空があるかもしれない、配列の内容を印刷することです。しかしながら、そこ配列のtoStringには意味はありませんが、コレクションは親AbstractCollectionsコレクションは、オブジェクトのtoStringメソッドを書き換えるためのtoStringは、コレクションの内部の内容をプリントアウトすることができます。

31は、基本的なデータが範囲外タイプキャストを下にしないでください

これは、望ましい結果を得ることはありません。

私たちはそれらのいくつかを期待するかもしれないが、結果は次のとおりです。

1942892530

説明してください。されるべきであることをコンピュータに12345678901234のでJavaは、64ビットで8バイトの長さです。

1111 1111 0010 0011 1100 1110 0010 1011 0011 1010 0111 0000 0000 0000 0000 0000

int型は、4バイトの32ビットであり、32ビットは、バイナリデータの下位列の上方正面から除去されます。

1111 1111 0010 0111 0011 1100 1110 0010

バイナリ文字列は小数点1942892530として表されるので、コンテンツは、米国以上のコンソールに出力されます。この例では、二つの結論への道:

図1に示すように、デフォルトのデータ・タイプは、整数int型、長いL = 12345678901234Lあり、この数は整数の範囲を超えて、最終的なLが存在し、これは長いタイプ番号であることを示しています。「」= 3.5f Fフロート」ところで、浮動小数点デフォルトのタイプは、二重なので、書き込みにフロート時間の定義

2は、「I + II INT = L;」書き込み長い+ int型が長く、INTがに割り当てることができないように説明します

32、一般的なデータ収集クラスは、オフタイムリー削除する必要があります使用されていません

コレクションは(つまり、プロパティの内側の方法ではありません)公開されている場合、基準点は、それらに常にあるので、その内の要素のセットが自動的に、解放されません。データの一部がそれらを削除するのではなく公共の収集の内側を使用していないのであれば、それは、システムがメモリリークの問題があるので、こと、公共の収集が増加している原因となります。

33、基本データ型.toStringが最速の方法での文字列への基本データ型は、最も遅い「」String.valueOf、データ+に続きます

一般的に3つの方法への基本データ型は、私はあなたがi.toString、String.valueOf(i)を使用することができ、私は整数データ型を持って、私のテストを参照するには、次の3つの方法がどのように効率的な+「」三つの方法、 :

次のような結果を操作します:

我々はtoStringメソッドの使用を優先して、時間の文字列への基本的なデータ型の後に遭遇したので。なぜとしては、それは簡単です:

1は、String.valueOfメソッドは、下の持つInteger.toStringメソッドを呼び出しますが、呼び出しの前に短い分析になります

2、言っていないメソッドを持つInteger.toString、ダイレクトコール

3、I +「」底のStringBuilderは、縫合することにより、第1追記方法を使用して実装、toStringメソッドは、文字列を受け取り、

比較ダウン3、最も遅い明らか2,1続いて、最速3

地図を横断する最も効率的な方法を使用して34、

地図を通過する多くの方法がありますが、通常我々が必要とするシーンが地図キーと値を通過することです、それは使用することをお勧めし、最も効率的な方法は次のとおりです。

あなたはこのキーの値地図についてトラバースしたい場合は、「設定のkeySet = hm.keySet;」を使用し、より適切な数になります

35、リソースに近い別の運用勧告

平均値は、例えば、私はコードの、このような作品を持っています:

変更案は以下のとおりです。

いくつかのトラブルが、彼は、リソースリークを避けることができました。例外をスローXXX.close場合には、コードを変更しない場合、私は、考えて、その後、カテーテル検査でブロックを入力し、YYY.closeが実行されない、このリソースが回復されることはありませんYYYは、そう、で占められてきましたより1つのコードよりも、リソースハンドルリークが発生することが可能です。しかし、文言の後にどのような場合にはXXXとYYY近いうちになることが、上記、性を保証に変更されました。

おすすめ

転載: www.cnblogs.com/toufajiantuzhongbuhui/p/12588742.html