Javaプログラミングでは、言語仕様または標準のAPIドキュメントを使用してのみ知識を学ぶことはできません。この記事はあなたのためにそれをリストします。
1。実現
1。今等しい()
class person {string name; Int Birthndyyear; byte [] raw; public boolean equals(object obj){if(!obj instance of person)return false;人other =(person)obj; return name.equals(other.name)&& Birthndyear == other.birthyear && arrays.equals(raw、other.raw); } public int hashcode(){...}} 2。hashcode()
クラスパーソン{文字列A;オブジェクトB;バイトc; int [] d; public int hashcode(){return a.hashcode() + b.hashcode() + c + arrays.hashcode(d); } public boolean equals(object o){...}}3。比較()を実装します
クラスの人は、比較可能な<パーソン> {string firstName;文字列lastName; int Birthday; // firstNameで比較し、lastNameでネクタイを破り、最終的に生年月日パブリックint compareto(firstname.compareto(other.firstname)!= 0)return firstname.compareto(other.firstname); else if(lastname.compareto(other.lastname)!= 0)return lastname.compareto(other.lastname); else if(birthdate <other.birthdate)return -1; else if(birthdate> other.birthdate)return 1;それ以外の場合は0を返します。 }}プリミティブタイプの代わりに、常に同等の汎用バージョンを実装してください。これにより、コードボリュームを節約し、不必要な手間を減らすことができるためです。
結果を返すサイン(負/ゼロ/ポジティブ)を気にするだけで、そのサイズは重要ではありません。
Comparator.compare()実装はこれに似ています。
4。clone()を実装する
クラス値はクローン可能{文字列ABC; double foo; int [] bars;雇われた日付; public values clone(){try {values result =(values)super.clone(); result.bars = result.bars.clone(); result.hired = result.hired.clone();返品結果; } catch(clonenotsupportedexception e){//不可能なスローnew assertionerror(e); }}}2。予防試験
1。防御的なチェック値
int factorial(int n){if(n <0)新しいIllegalargumentException( "未定義"); else if(n> = 13)新しいarithmeticexception( "result overflow"); else if(n == 0)return 1;それ以外の場合はn *因子(n -1);}を返します 2。予防テストオブジェクト
int findIndex(list <string> list、string target){if(list == null ||ターゲット== null)新しいnullpointerexception(); ...}3。予防検出アレイインデックス
void frob(byte [] b、int index){if(b == null)throw new nullpointerexception(); if(index <0 || index> = b.length)new indexOutofBoundsexception(); ...}指定された配列インデックスが境界を越えないとは思わないでください。明示的に検出します。
4。予防検出アレイ間隔
void frob(byte [] b、int off、int len){if(b == null)throw new nullpointerexception(); if(off <0 || off> b.length || len <0 || b.length -off <len)新しいindexOutofboundsexception()をスローします。 ...}指定された配列間隔(たとえば、オフから、レン要素の読み取り)が境界を越えないとは思わないでください。明示的に検出します。
3。アレイ
1。配列要素を入力します
ループの使用:
//配列の各要素「a」を123byte [] a =(...); for(int i = 0; i <a.length; i ++)a [i] = 123; (優先)標準ライブラリを使用する方法:arrays.fill(a、(byte)123);
2。配列要素を範囲内にコピーします
ループの使用:
//アレイから8つの要素をコピーして、オフセット3 //アレイb 'からオフセット6から始まる' a 'から始まります。 (優先)標準ライブラリを使用する方法:System.ArrayCopy(A、3、B、6、8);
3.配列サイズを調整します
ループを使用(スケールアップ):
// array 'をnewlenbyte [] a =(...); byte [] b = new byte [newlen]; for(int i = 0; i <a.length; i ++)// a b [i] = a [i]; a = b;
ループを使用します(サイズを減らします):
// array 'a'をnewlenbyte [] a =(...); byte [] b = new byte [newlen]; for(int i = 0; i <b.length; i ++)// b [i] = a [i]; a = b;
(優先的)標準ライブラリを使用する方法:
1a = arrays.copyof(a、newlen);
4。Intに4バイトを詰めます
int packbigendian(byte [] b){return(b [0]&0xff)<< 24 | (b [1]&0xff)<< 16 | (b [2]&0xff)<< 8 | (b [3]&0xff)<< 0;} int packlittleendian(byte [] b){return(b [0]&0xff)<< 0 | (b [1]&0xff)<< 8 | (b [2]&0xff)<< 16 | (b [3]&0xff)<< 24;}5。INTを4バイトに分解します
byte [] unpackbigendian(int x){return new byte [] {(byte)(x >>> 24)、(byte)(x >>> 16)、(byte)(x >>> 8)、(byte)(x >>> 0)};} byte [] unpacklendian(int x){x>> >>> 8)、(byte)(x >>> 16)、(byte)(x >>> 24)};}常に署名のない右シフト演算子(>>>)を使用してビットをラップし、算術右シフト演算子(>>)を使用しないでください。
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。