- 【必須】ハッシュコードと等しい、次のルールで処理。
1)に等しく書き換え限り、ハッシュコードを書き換える必要があります。
セット重複オブジェクトは、それらのハッシュコードとequalsによって決定されるため、2)オブジェクトが設定は、これら2つのメソッドをオーバーライドする必要が格納されているので、記憶されていません。
カスタムマップのキーとしてオブジェクト場合は3)、あなたはのhashCodeとequalsを書き換える必要があります。
说明:String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用。
- [必須]サブリストの結果は、それ以外の場合はjava.util.RandomAccessSubListはjava.util.ArrayListのにキャストすることができないことにClassCastExceptionをスローします、強力に変えることができないのArrayListから成るArrayList。
说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。
-
[必須]サブリストのシーン、追加または削除する要素の元のコレクションの高さに注意を払うで、サブリストを横断するために導く追加、削除農産物にConcurrentModificationException例外ます。
-
[力]、アレイサイズの正確に同じタイプで渡され、メソッドセットスイッチアレイ用いて、設定されなければならないのtoArray(T []アレイ)はlist.size()です。
说明:使用 toArray 带参方法,入参分配的数组空间不够大时,toArray 方法内部将重新分配内存空间,并返回新数组地址;如果数组元素个数大于实际所需,下标为[ list.size() ] 的数组元素将被置为 null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
正例:
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它 类型数组将出现 ClassCastException 错误。
- [力]は、関連するメソッドのセットを変更するために使用することができない時間のセットにツールは、Arrays.asList()アレイを使用して、それは追加/削除する/クリアする方法は、UnsupportedOperationExceptionをスロー。
说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "you", "wu" };
List list = Arrays.asList(str);
// 第一种情况:list.add("yangguanbao"); 运行时异常。
// 第二种情况:str[0] = "gujin"; 那么 list.get(0)也会随之修改。
- [必須] <スーパーT?>返され、このジェネリックコレクションの文言がaddメソッドを使用することはできませんデータを受信する<?Tは拡張>一般的なワイルドカード、および方法は、インタフェースの呼び出しの割り当てエラーが発生しやすいとして使用することはできません取得します。
说明:扩展说一下 PECS(Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>。
- [必須]要素の削除は、/のforeachループ内で操作を追加しないでください。、イテレータの方法を使用して、要素を削除する同時操作の場合、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); } }
说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的 结果吗?
- 【必須】 JDK7バージョン及び上記比較器の実装クラスは、以下の3つの条件を満たすために、またはは、Arrays.sortは、Collections.sortにはIllegalArgumentException報告されます。
説明:次の3つの条件
1)X、Y、及び比較結果の比較結果y、xは反対です。
2)X> Y、Y> Z、 次いで、X> Z。
3)X = Y、次にX、Z比較結果とy、zの同じ比較結果。
抗例:次の例は、同じ処理されない、例外が実際の使用で発生することがあります。
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() > o2.getId() ? 1 : -1;
}
};
- [推奨]とき、一般的な定義のセット、JDK7以上、使用ダイヤモンド構文または省略いっぱい。
说明:菱形泛型,即 diamond,直接使用<>来指代前边已经指定的类型。
正例:
// <> diamond 方式
HashMap<String, String> userCache = new HashMap<>(16);
// 全省略方式
ArrayList<User> users = new ArrayList(10);
- [推奨]コレクションが初期化されるとき、指定されたセットのサイズの初期値。
说明:HashMap 使用 HashMap(int initialCapacity) 初始化。
正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loader factor)默认为 0.75,如果暂时无法确定初始值大小,请设置为 16(即默认值)。
反例:HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容 量 7 次被迫扩大,resize 需要重建 hash 表,严重影响性能。
- [推奨]を使用するのentrySetはトラバースにクラスKVの地図コレクションではなく、キーセットの道を横断します。
说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效 率更高。如果是 JDK8,使用 Map.foreach 方法。
正例:values()返回的是 V 值集合,是一个 list 集合对象;keySet()返回的是 K 值集合,是一个 Set 集合对象;entrySet()返回的是 K-V 值组合集合。
- [推奨] K / Vがnull値を格納できる高さマップアテンションクラスのセットは、次の形式:
コレクション | キー | 値 | 素晴らしい | 説明 |
---|---|---|---|---|
ハッシュ表 | ヌルを許可しません | ヌルを許可しません | 辞書 | スレッドセーフ |
ConcurrentHashMapの | ヌルを許可しません | ヌルを許可しません | クラスAbstractMap | ロックセグメント化技術(JDK8:CAS) |
TreeMapの | ヌルを許可しません | nullの場合も | クラスAbstractMap | スレッドセーフ |
HashMapの | nullの場合も | nullの場合も | クラスAbstractMap | スレッドセーフ |
反例: 由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上, 存储 null 值时会抛出 NPE 异常。
- 【参考】障害コレクションの悪影響を回避するために、秩序(ソート)とセット(オーダー)の良好な安定性の使用の合理化、(ソート解除)と不安定性(unorder)がもたらします。
说明:有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次序是一定的。如:ArrayList 是 order/unsort;HashMap 是 unorder/unsort;TreeSet 是order/sort。
- [参考]ユニークな特性を設定要素と、すぐに再試行に比べて、メソッドを横断含むリストの使用を避けるために、再手術のセットに行くことができます。