例:プライベート メソッドの場合、削除したい場合は削除します
If a public
の service
メソッド、または public メンバー変数は、深く考えずに削除する必要があります。
コンピュータはバイナリ表現を使用するため、変位演算によりパフォーマンスが大幅に向上します。
> 右シフトは 2 で割ることと同等;
>>> 符号なし右シフトは次と同等2 で除算しますが、符号ビットは無視され、空のビットは 0 で埋められます。
a = val << 3; b = val >> 1;
スタック フレームの作成、メソッド呼び出し時のシーンの保護、シーンの復元など、メソッドの呼び出しにはコストがかかることがわかっています。
//反例 for (int i = 0; i < list.size(); i++) { System.out.println("result"); } //正例 for (int i = 0, length = list.size(); i < length; i++) { System.out.println("result"); }
list.size()
が非常に大きい場合、消費量が大幅に削減されます。
RuntimeException は catch ステートメントによってキャッチされるべきではなく、コーディング手段によって回避される必要があります。
次のコードに示すように、リストで配列範囲外の例外が発生する可能性があります。
例外が発生したときに例外をキャッチするのを待つのではなく、範囲外かどうかをコードを通じて事前に判断できます。
この方法を事前に判断すると、コードがより洗練され、効率的になります。
public String test1(List<String> list, int index) { try { return list.get(index); } catch (IndexOutOfBoundsException ex) { return null; } } //正例 public String test2(List<String> list, int index) { if (index >= list.size() || index < 0) { return null; } return list.get(index); }
ヒープ リソースは複数のスレッドで共有され、ガベージ コレクターが動作する主な領域であるため、オブジェクトが多すぎると GC プレッシャーが発生します。 . 、ローカル変数を介して変数をスタック上に割り当てることができます。このようにして、メソッドの実行が完了すると変数が破棄されるため、GC への負担が軽減されます。
変数のスコープに注意し、オブジェクトの作成を最小限に抑えます。
次のコードに示すように、変数 s はメソッドが入力されるたびに作成され、if ステートメント内に移動できます。
public void test(String str) { final int s = 100; if (!StringUtils.isEmpty(str)) { int result = s * s; } }
遅延読み込み戦略を採用し、必要な場合にのみ作成するようにしてください
String str = "月伴飞鱼"; if (name == "公众号") { list.add(str); } if (name == "公众号") { String str = "月伴飞鱼"; list.add(str); }
オブジェクトを使用して静的変数にアクセスします。このメソッドでは、アドレス指定操作が 1 つ追加されます。最初に変数に対応するクラスを見つけてから、そのクラスに対応する変数を見つける必要があります。
// 反例 int i = objectA.staticMethod(); // 正例 int i = ClassA.staticMethod();
文字列の結合には StringBuilder または StringBuffer を使用し、数字は使用しないでください。
//反例 public class StringTest { @Test public void testStringPlus() { String str = "111"; str += "222"; str += "333"; System.out.println(str); } } //正例 public class TestMain { public static void main(String[] args) { StringBuilder sb = new StringBuilder("111"); sb.append("222"); sb.append(333); System.out.println(sb.toString()); } }
単純に固定値を返すのではなく、オブジェクトの HashCode を書き換えます
一部の学生は、HashCode メソッドと Equals メソッドのオーバーライドを開発しています。 、HashCode の値を固定の 0 に返しますが、これは不適切です。
これらのオブジェクトが HashMap に格納されると、パフォーマンスが非常に低下します。これは、HashMap が HashCode を通じてハッシュ スロットを見つけ、この場合に限り、リンクリストや赤黒ツリーを用いてノードを整理し、固定的に0を返すことになり、ハッシュアドレッシング機能を無効にすることと同じになります。
HashMapなどのコレクションを初期化する場合は、初期値のサイズを指定します
このようなオブジェクトはArrayList、StringBuilder、初期値を指定することで、拡張によるパフォーマンスの低下を軽減できます。
初期値サイズの計算:
ループ内 オブジェクト参照を連続的に作成しないでください
//反例 for (int i = 1; i <= size; i++) { Object obj = new Object(); } //正例 Object obj = null; for (int i = 0; i <= size; i++) { obj = new Object(); }
最初のメソッドでは、size Object のオブジェクト参照がメモリ上に存在します。サイズが大きいとメモリを消費します。
EntrySet メソッドを使用すると、セット オブジェクトを直接返すことができ、これを直接使用できます。また、KeySet メソッドを使用するとキーのコレクションを取得できます。別の取得操作を実行すると、操作ステップが 1 つ追加されるため、マップを走査するには EntrySet メソッドを使用することをお勧めします。
Set<Map.Entry<String, String>> entryseSet = nmap.entrySet(); for (Map.Entry<String, String> entry : entryseSet) { System.out.println(entry.getKey()+","+entry.getValue()); }
Random クラスのシードは同時アクセス中に競合するため、パフォーマンスが低下します。 -スレッド環境の種類。
public static void main(String[] args) { ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current(); Thread thread1 = new Thread(()->{ for (int i=0;i<10;i++){ System.out.println("Thread1:"+threadLocalRandom.nextInt(10)); } }); Thread thread2 = new Thread(()->{ for (int i=0;i<10;i++){ System.out.println("Thread2:"+threadLocalRandom.nextInt(10)); } }); thread1.start(); thread2.start(); }
自動インクリメント操作では、synchronized
と volatile # の組み合わせによってスレッド セーフを制御できます。 ## または、アトミック クラス (AtomicLong など) を使用できます。
AtomicLong 比較と置換に CAS を使用すると、スレッドが多い場合に無効なスピンが多すぎます。LongAdder を使用して AtomicLong を置き換えることができます。さらなる進化とパフォーマンス向上を目指します。
public class Test { public int longAdderTest(Blackhole blackhole) throws InterruptedException { LongAdder longAdder = new LongAdder(); for (int i = 0; i < 1024; i++) { longAdder.add(1); } return longAdder.intValue(); } }
java.lang.invoke が追加され、JVM レベルからの文字列の直接受け渡しをサポートするための新しい JVM バイトコード命令 invokedynamic が追加されました。ターゲットメソッド。
以上がJava コードを最適化する方法と、仕事で利用できる実践的なヒントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。