Java詳細ノート

2459 ワード

1.i++の内部実装先見コード
public class Operator {

	/**

	 * @param args

	 */

	public static void main(String[] args) {

		// TODO Auto-generated method stub

		int i=0;

		i = i++;

		System.out.println(i);

	}

}

      0
i = i++;            :
int temp = i; i = i+1; i = temp;
 
  

2. for循环的一些优化

【关于嵌套循环】

有以下两段循环体,如果需要使用嵌套循环,优先选择第二种。这是因为CPU在内外层循环切换中会有一定的开销。且在执行大次数循环时,CPU会对循环进行一定的优化。

int v1 = 100000;

int v2 = 1000;

int v3 = 10;

	

for(int i=0;i<v1;i++)

	for(int j=0;j<v2;j++)

		for(int k=0;k<v3;k++)

			doSomething();

		

for(int i=0;i<v3;i++)

	for(int j=0;j<v2;j++)

		for(int k=0;k<v1;k++)

			doSomething();

 
【循環変数の使用について】
ループ内で値が使用されている場合(ループ内では変化しない値)は、まずその値を求め、ループ内で使用する必要があります.第2の方法を推奨します.ただしupperはループ終了後も使用でき、ループ後に誤参照してエラーが発生する可能性がありますので、第3の方法にさらに最適化できます.
for(int i=0;i<upperLimit();i++)
	doSomething();

		

int upper = upperLimit();

for(int i=0;i<upper;i++)

	doSomething();
 
for(int i=0,upper=upperLimit();i<upper;i++)

	doSomething();
 

【ローカル変数とメンバー変数のアクセス調整について】
ローカル変数はスタックに割り当てられ、クラスのインスタンス変数はスタックに割り当てられます.プログラムのローカル変数へのアクセス速度は、スタック内の変数へのアクセスよりも速い.
したがって、ループ内でインスタンス変数に複数回アクセスする場合、インスタンス変数をローカル変数に割り当てることができます.そこで、以下の2つ目をお勧めします.
class AccessVar {

	private int times = 100;

	

	public void start1() {

		for(int i=0;i<times;i++)

			;	//    

	}

		

	public void start2() {

		int times = this.times;

			for(int i=0;i<times;i++)

			;	//    

	}

}
 

【Stringの継ぎ目について】
Stringオブジェクトを結合するには、+オペレータを使用します.
ただし、Stringオブジェクトは変更できないため、Stringオブジェクトを結合するたびに新しいオブジェクトが再作成されます.
以前のオブジェクトは破棄され、余分な時間がかかり、ゴミ回収にも不要な費用がかかります.
StringBuilderクラスを使用することをお勧めします.StringBuilderオブジェクトは変更できます.パッチは元のオブジェクトを直接変更します.
public String getString(String[] arr) {

	StringBuilder res = new StringBuilder("");

	for(int i=0;i<arr.length;i++) {

		res.append(arr[i]);

	}

	

	return res.toString();

}