標準化の書き込みのJavaコード
A、イテレーションのentrySet()は、キーと値のマップを取得します
ループのみ地図プライマリキーのキーを取得する必要がある場合、反復のkeySet()は正しいですが、あなたは主キーのキーと値の値を必要とするとき、反復のentrySet()は、より効率的なアプローチで、その最初の反復よりのkeySet()その後でより良いパフォーマンスの値を取りに行きます。
//Map 获取key & value 正例:
HashMap<String, String> map = new HashMap<>();
for (Map.Entry<String,String> entry : map.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
}
//Map 获取value 反例:
HashMap<String, String> map = new HashMap<>();
for (String key : map.keySet()){
String value = map.get(key);
}
第二に、使用Collection.isEmptyは()に空を検出し、
加えて、任意のCollection.isEmpty()が実装され、より良い性能を得ることができ、論理的な問題には検出されない空ですが、Collection.isEmptyは()のコードが読みやすくなり使用)(、コレクションの使用時間計算量はO(1)であり、複数回トラバースする必要はないが、特定の時間だけコレクション、()メソッドの実装の複雑さはO(N)であってもよいです
//正例:
LinkedList<Object> collection = new LinkedList<>();
if (collection.isEmpty()){
System.out.println("collection is empty.");
}
//检测是否为null 可以使用CollectionUtils.isEmpty()
if (CollectionUtils.isEmpty(collection)){
System.out.println("collection is null.");
}
//反例
LinkedList<Object> collection = new LinkedList<>();
if (collection.size() == 0){
System.out.println("collection is empty.");
}
第三には、Collection.containsメソッドを呼び出すには、頻繁に設定を使用します
コードは、メソッド呼び出しが頻繁にデータの最初のセットはHashSetのは、O(n)の時間計算量を達成し、リストに変換されて見つける含まれている場合、Javaコレクションクラスライブラリでは、リストは、O(n)との時間計算の一般的な方法が含まれていますO(1)であろう。
//频繁调用Collection.contains() 正例
List<Object> list = new ArrayList<>();
Set<Object> set = new HashSet<>();
for (int i = 0; i <= Integer.MAX_VALUE; i++){
//时间复杂度为O(1)
if (set.contains(i)){
System.out.println("list contains "+ i);
}
}
//频繁调用Collection.contains() 反例
List<Object> list = new ArrayList<>();
for (int i = 0; i <= Integer.MAX_VALUE; i++){
//时间复杂度为O(n)
if (list.contains(i))
System.out.println("list contains "+ i);
}
静的コードブロック実装静的メンバ変数割り当ての使用
静的メンバ変数のコレクション型の場合は、あなたの代わりに割り当てに実装のセットを使用しての、静的コードブロックの割り当てを使用する必要があります
//赋值静态成员变量正例
private static Map<String, Integer> map = new HashMap<String, Integer>();
static {
map.put("Leo",1);
map.put("Family-loving",2);
map.put("Cold on the out side passionate on the inside",3);
}
private static List<String> list = new ArrayList<>();
static {
list.add("Sagittarius");
list.add("Charming");
list.add("Perfectionist");
}
//赋值静态成员变量反例
private static Map<String, Integer> map = new HashMap<String, Integer>(){
{
map.put("Leo",1);
map.put("Family-loving",2);
map.put("Cold on the out side passionate on the inside",3);
}
};
private static List<String> list = new ArrayList<>(){
{
list.add("Sagittarius");
list.add("Charming");
list.add("Perfectionist");
}
};
V.ツールシールドコンストラクタ
ツールインスタンス化すべきではない静的なフィールドと機能の束の集まりですが、Javaは各クラスの暗黙のpublicコンストラクタを明示的に定義されていないコンストラクタを追加し、不要なインスタンス化を避けるために、SHOULDプライベートコンストラクタの明示的な定義は、暗黙のpublicコンストラクタを遮蔽します。
public class PasswordUtils {
//工具类构造函数正例
private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class);
//定义私有构造函数来屏蔽这个隐式公有构造函数
private PasswordUtils(){}
public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";
public static String encryptPassword(String aPassword) throws IOException {
return new PasswordUtils(aPassword).encrypt();
}
public class PasswordUtils {
//工具类构造函数反例
private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class);
public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";
public static String encryptPassword(String aPassword) throws IOException {
代わりに「」+値の第六、String.valueOf(値)を使用して文字列変換
場合String.valueOf(値)を使用して文字列にタイプまたは他のオブジェクト、「」+は、効率値よりも高くなります。
//把其它对象或类型转化为字符串正例:
int num = 520;
// String.valueOf() 效率更高
String strLove = String.valueOf(num);
//把其它对象或类型转化为字符串反例:
int num = 520;
// "" + value
String strLove = "" + num;
七、BigDecimalの使用は避けてください(ダブル)
BigDecimalを(ダブル)精度の損失の危険の存在は、比較値の正確な計算やシーンは、ビジネス・ロジックの例外が発生することがあります。
// BigDecimal 正例
BigDecimal bigDecimal1 = bigDecimal.valueOf(0.11D);
// BigDecimal 反例
BigDecimal bigDecimal = new BigDecimal(0.11D);
八、むしろヌルおよびコレクションより空の配列を返します
呼び出されるプログラムの実行を返すヌル、ヌル平方必須の試験ニーズ場合は、それ以外の場合はnullポインタ例外がスローされます。空の配列や空のセットを返し、呼び出し元がヌルヌルポインタ例外がスローされ、あなたがすることもできます検出されないため、効果的な状況を避けます呼び出し側がnullの文がコードより簡潔になり検出し削除します。
//返回空数组和空集正例
public static Result[] getResults() {
return new Result[0];
}
public static List<Result> getResultList() {
return Collections.emptyList();
}
public static Map<String, Result> getResultMap() {
return Collections.emptyMap();
}
//返回null 反例
public static Result[] getResults() {
return null;
}
public static List<Result> getResultList() {
return null;
}
public static Map<String, Result> getResultMap() {
return null;
}
ナイン、優先順位の値は、一定の又は決定を使用して、メソッド呼び出しに等しいです
簡単ポインタ例外を短絡した方法に等しく、equalsメソッドを呼び出すために、一定の値または決定オブジェクトと共に使用されるべきです。
//调用 equals 方法正例
private static boolean fileReader(String fileName)throws IOException{
// 使用常量或确定有值的对象来调用 equals 方法
return "Charming".equals(fileName);
//或使用:java.util.Objects.equals() 方法
return Objects.equals("Charming",fileName);
}
//调用 equals 方法反例
private static boolean fileReader(String fileName)throws IOException{
// 可能抛空指针异常
return fileName.equals("Charming");
}
テンは、属性フィールドの列挙は、プライベートと不変でなければなりません
列挙は、一般に、定数として使用されている、または共通の属性フィールドの設定フィールド列挙メソッドが存在する場合、列挙定数の特性を容易に変更することができ、理想的には、列挙型プロパティフィールドは、プライベート独自のものとコンストラクタは、割り当ては、最終的な改質剤と一緒に、好ましくは、該当する方法設定がありません。
正例:
public enum SwitchStatus {
// 枚举的属性字段正例
DISABLED(0, "禁用"),
ENABLED(1, "启用");
// final 修饰
private final int value;
private final String description;
private SwitchStatus(int value, String description) {
this.value = value;
this.description = description;
}
// 没有Setter 方法
public int getValue() {
return value;
}
public String getDescription() {
return description;
}
}
public enum SwitchStatus {
// 枚举的属性字段反例
DISABLED(0, "禁用"),
ENABLED(1, "启用");
public int value;
private String description;
private SwitchStatus(int value, String description) {
this.value = value;
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
削除/ foreachループ内の要素で行われていない操作を追加
あなたが操作を削除したい場合は、イテレータ・クラスのremoveメソッドではなく、コレクションのremoveメソッドを呼び出すことができます。イテレータはいつでも構造から作成された後に、反復子自体のremove以外の方法で/メソッドを追加するので、あなたがリストを変更した場合、反復子は、シングルスレッドの状態によって生成フェイルファストメカニズムですConcurrentModificationExceptionをスローします。
fail-fast 机制 :多个线程对 fail-fast 集合进行修改的时,可能会抛出ConcurrentModificationException,单线程下也会出现这种情况,上面已经提到过。
すべてのクラスのjava.utilパッケージに以下のセットは、フェイルファストであり、すべてのクラス以下のjava.util.concurrentパッケージには、フェイルセーフです。
//强制,不要在foreach循环里进行元素的remove/add操作。remove元素需要使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
//正例
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String item = iterator.next();
if(删除元素的条件){
iterator.remove();
}
}
//反例
for(String item : list){
if("1".equals(item)){
list.remove(item);
}
}