角を曲がって愛に出会う1、知らないJava
5648 ワード
おしゃべり
一時は退屈で、文集を開いて、専門的にいくつかの技術上の偏門知識を記録して、少ないが役に立つ知識です.どんな名前をつけるべきか分からないので、角を曲がって爱に出会うようにしましょう.
豊富な开発経験を持っている人はきっとすべて体得して、本当にプロジェクトの开発の中で、机能を実现する时间は実は长くなくて、大量の时间はいくつかの珍しい问题を解决する上で浪费して、多くの冷たい扉、珍しい技术は私达は知らないで、知ってからやっとこのような不思议さを発见して、Androidの开発を持って言って、あなたは300行のコードで1つの効果を実现して、不思議な属性で済むかもしれません.これらの冷たい知識は私たちはよく使いません.一度使った後、すぐに忘れてしまいました.次は同じ問題に遭遇してもGoogleは長い間かかります.これが私がこのシリーズを書くことにした理由で、いくつかの冷たい知識を集めて、自分でみんなと検索するのに便利です.
1、悪魔の死の循環
多くの人の最初の反応は、flagが最初はfalseであり、実行奇数回がtrueであり、偶数回がfalseであるため、問題はforループが奇数回を実行するか偶数回を実行するかである.
もしあなたがそう思っているなら、あなたはだまされて、このコードの実行結果はデッドサイクルです.なぜならMAX_VALUE + 1 = Integer.MIN_VALUE.JavaではIntegerタイプの値域の範囲が超えると振り返り、最小値になるのではないかと悟った.
2、Java7.0のtry-with-resources
Java 7の前にfinallyブロックを使用して、try文が正常に完了したり、予期せぬことが発生したりしても、リソースが閉じられることを確認できます.
Java 7の後、try-with-resources文を使用すると、tryが終了するとres.close()メソッドが自動的に呼び出されます.コードブロックがどのように終了しても、以前に作成されている限り、それらは閉じられます.どのようなリソースが閉鎖されますか?javaが実装されています.lang.AutoCloseableを実装javaを含むすべてのオブジェクト.io.Closeableのオブジェクトは、いずれもリソースとして使用できます.
1つのtry-with-resources文で1つ以上のリソースを宣言できます.リソースのcloseメソッド呼び出し順序は、それらの作成順序とは逆です.
3、数字下線分割
私たちは大きな金額を表示するとき、通常はカンマで区切り、数値をはっきり読み出すのに便利です.Java 7以降は、アンダースコア分割も数字に対してサポートされています.
4、Math.abs()絶対値
次のコードの印刷結果は何だと思いますか?
結局IntegerですMIN_VALUE、驚いたでしょう!
Math.abs()は必ずしも正数を返すわけではありません.理由は簡単です.Integerの値域の問題です.Integerの最大値は2147483647で、最小値は-2114748648で、絶対値は2147483648です.前の悪魔の死の循環を覚えていますか.Integer.MAX_VALUE + 1 = Integer.MIN_VALUE;こんなに無言です.
5、ArrayList拡張
通常ArrayListを作成するとこう書きます.
ArrayListに対応する無パラメトリック構造関数:
ここでは、ArrayListの下位層はObjectタイプの配列で実現されており、無パラメトリック構造手法を用いる場合、ArrayListの下位層は長さ10のObjectタイプの配列を生成し、ArrayListにオブジェクトを追加する場合、カウントに1を加え、容量が適切か否かを計算し、格納された要素の個数が容量を超えると、新しい配列が作成され、新しい配列の長さは元の1.5倍で、元の配列の内容を大きな新しい配列にコピーします.
なお、このレプリケーション操作は非常に性能的であり、ArrayListが大きく、数百回の拡張を実行すると、より多くの新しい配列割り当て操作と、より多くの回数の古い配列回収操作が行われる.そこで性能がますます悪くなっていることに気づきますが、なぜか分かりません.
だからこそ、2番目のコンストラクション関数があり、初期配列のサイズとして指定された値が入力されます.
たとえば、ArrayListが少なくとも100個のオブジェクトを保存すると予想される場合は、2番目のコンストラクション関数を使用して100に転送します.これにより、最初の100回の追加で配列のコピー操作は行われません.
まとめ:ArrayListに大量のデータが保存されると予想される場合は、2番目のコンストラクション関数を使用して、初期容量として適切な値を入力し、パフォーマンスの消費を最小限に抑えます.
6、単例モード
単例モードといえば、多くの人が手書きで書くことができると信じていますが、やはり最も簡単な設計モードなので、主に4つの単例の書き方の進歩関係を話します.
1、基礎形式これは最も簡単な形式で、静的インスタンスを明らかにするときに直接オブジェクトを作成します.
この書き方の欠点は明らかで、クラスを初期化するときにオブジェクトを作成しました.この例を使用しなければ、それは無駄です.改善が必要です
2、怠惰な形式は基礎形式よりも、必要に応じてインスタンスを初期化できるというメリットがあります.
遅延初期化の問題は解決されたが,スレッドが安全ではないことが明らかであり,最適化を継続する必要がある.
3、メソッドロック形式synchronizedキーワードを使用することで、複数のスレッドが同時にアクセスする問題を処理できます.各クラスインスタンスはスレッドロックに対応し、synchronized修飾メソッドは、メソッドを呼び出すクラスインスタンスのロックを取得して実行する必要があります.そうしないと、属するスレッドがブロックされます.メソッドが実行されると、ロックはメソッドから返されるまで排他されます.その後、ブロックされたスレッドがロックを取得し、実行可能な状態に戻ることができます.
4、Classロック形式上の書き方はスレッドが安全であるが、getInstance()メソッドを呼び出すたびにスレッドロック判定が必要となり、マルチスレッド高同時アクセス環境ではシステム性能の低下を招く.実際,効率が低いだけでなく,99%の場合,スレッドロック判定は不要である.このとき,二重チェックロックにより処理することができる.すなわち、二重チェックロックを使用して、インスタンスが作成されたかどうかを最初にチェックし、まだ作成されていない場合は、同期して単一のオブジェクトを作成します.
一時は退屈で、文集を開いて、専門的にいくつかの技術上の偏門知識を記録して、少ないが役に立つ知識です.どんな名前をつけるべきか分からないので、角を曲がって爱に出会うようにしましょう.
豊富な开発経験を持っている人はきっとすべて体得して、本当にプロジェクトの开発の中で、机能を実现する时间は実は长くなくて、大量の时间はいくつかの珍しい问题を解决する上で浪费して、多くの冷たい扉、珍しい技术は私达は知らないで、知ってからやっとこのような不思议さを発见して、Androidの开発を持って言って、あなたは300行のコードで1つの効果を実现して、不思議な属性で済むかもしれません.これらの冷たい知識は私たちはよく使いません.一度使った後、すぐに忘れてしまいました.次は同じ問題に遭遇してもGoogleは長い間かかります.これが私がこのシリーズを書くことにした理由で、いくつかの冷たい知識を集めて、自分でみんなと検索するのに便利です.
1、悪魔の死の循環
boolean flag = false;
for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) {
flag = !flag;
}
System.out.println(flag);
多くの人の最初の反応は、flagが最初はfalseであり、実行奇数回がtrueであり、偶数回がfalseであるため、問題はforループが奇数回を実行するか偶数回を実行するかである.
もしあなたがそう思っているなら、あなたはだまされて、このコードの実行結果はデッドサイクルです.なぜならMAX_VALUE + 1 = Integer.MIN_VALUE.JavaではIntegerタイプの値域の範囲が超えると振り返り、最小値になるのではないかと悟った.
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE + 1);
//
-2147483648
-2147483648
2、Java7.0のtry-with-resources
Java 7の前にfinallyブロックを使用して、try文が正常に完了したり、予期せぬことが発生したりしても、リソースが閉じられることを確認できます.
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
Java 7の後、try-with-resources文を使用すると、tryが終了するとres.close()メソッドが自動的に呼び出されます.コードブロックがどのように終了しても、以前に作成されている限り、それらは閉じられます.どのようなリソースが閉鎖されますか?javaが実装されています.lang.AutoCloseableを実装javaを含むすべてのオブジェクト.io.Closeableのオブジェクトは、いずれもリソースとして使用できます.
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
1つのtry-with-resources文で1つ以上のリソースを宣言できます.リソースのcloseメソッド呼び出し順序は、それらの作成順序とは逆です.
try (
File file = new File("");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
) {
// do someting
}
3、数字下線分割
私たちは大きな金額を表示するとき、通常はカンマで区切り、数値をはっきり読み出すのに便利です.Java 7以降は、アンダースコア分割も数字に対してサポートされています.
long one_million = 1_000_000_000;
System.out.println(one_million);
//
1000000000
4、Math.abs()絶対値
次のコードの印刷結果は何だと思いますか?
int i = Math.abs(Integer.MIN_VALUE);
System.out.println(i)
結局IntegerですMIN_VALUE、驚いたでしょう!
Math.abs()は必ずしも正数を返すわけではありません.理由は簡単です.Integerの値域の問題です.Integerの最大値は2147483647で、最小値は-2114748648で、絶対値は2147483648です.前の悪魔の死の循環を覚えていますか.Integer.MAX_VALUE + 1 = Integer.MIN_VALUE;こんなに無言です.
5、ArrayList拡張
通常ArrayListを作成するとこう書きます.
ArrayList a = new ArrayList();
ArrayListに対応する無パラメトリック構造関数:
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
ここでは、ArrayListの下位層はObjectタイプの配列で実現されており、無パラメトリック構造手法を用いる場合、ArrayListの下位層は長さ10のObjectタイプの配列を生成し、ArrayListにオブジェクトを追加する場合、カウントに1を加え、容量が適切か否かを計算し、格納された要素の個数が容量を超えると、新しい配列が作成され、新しい配列の長さは元の1.5倍で、元の配列の内容を大きな新しい配列にコピーします.
なお、このレプリケーション操作は非常に性能的であり、ArrayListが大きく、数百回の拡張を実行すると、より多くの新しい配列割り当て操作と、より多くの回数の古い配列回収操作が行われる.そこで性能がますます悪くなっていることに気づきますが、なぜか分かりません.
だからこそ、2番目のコンストラクション関数があり、初期配列のサイズとして指定された値が入力されます.
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = new Object[initialCapacity];
}
たとえば、ArrayListが少なくとも100個のオブジェクトを保存すると予想される場合は、2番目のコンストラクション関数を使用して100に転送します.これにより、最初の100回の追加で配列のコピー操作は行われません.
ArrayList a = new ArrayList(100);
まとめ:ArrayListに大量のデータが保存されると予想される場合は、2番目のコンストラクション関数を使用して、初期容量として適切な値を入力し、パフォーマンスの消費を最小限に抑えます.
6、単例モード
単例モードといえば、多くの人が手書きで書くことができると信じていますが、やはり最も簡単な設計モードなので、主に4つの単例の書き方の進歩関係を話します.
1、基礎形式これは最も簡単な形式で、静的インスタンスを明らかにするときに直接オブジェクトを作成します.
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
この書き方の欠点は明らかで、クラスを初期化するときにオブジェクトを作成しました.この例を使用しなければ、それは無駄です.改善が必要です
2、怠惰な形式は基礎形式よりも、必要に応じてインスタンスを初期化できるというメリットがあります.
public class Singleton {
private Singleton(){}
private static Singleton instance = null;
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
遅延初期化の問題は解決されたが,スレッドが安全ではないことが明らかであり,最適化を継続する必要がある.
3、メソッドロック形式synchronizedキーワードを使用することで、複数のスレッドが同時にアクセスする問題を処理できます.各クラスインスタンスはスレッドロックに対応し、synchronized修飾メソッドは、メソッドを呼び出すクラスインスタンスのロックを取得して実行する必要があります.そうしないと、属するスレッドがブロックされます.メソッドが実行されると、ロックはメソッドから返されるまで排他されます.その後、ブロックされたスレッドがロックを取得し、実行可能な状態に戻ることができます.
public class Singleton {
private Singleton(){}
private static Singleton instance = null;
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
4、Classロック形式上の書き方はスレッドが安全であるが、getInstance()メソッドを呼び出すたびにスレッドロック判定が必要となり、マルチスレッド高同時アクセス環境ではシステム性能の低下を招く.実際,効率が低いだけでなく,99%の場合,スレッドロック判定は不要である.このとき,二重チェックロックにより処理することができる.すなわち、二重チェックロックを使用して、インスタンスが作成されたかどうかを最初にチェックし、まだ作成されていない場合は、同期して単一のオブジェクトを作成します.
public class Singleton {
private Singleton(){}
private static Singleton instance = null;
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}