- [Obligatorio] tratamiento en hashCode y equals, las siguientes reglas:
1) Mientras la reescritura iguales, es necesario volver a escribir código hash.
2) no se almacena porque el conjunto de objetos duplicados, se determina por su hashCode y equals, por lo que el objeto se almacena Set debe anular estos dos métodos.
3) Si la costumbre objetos como llaves Mapa, debe reescribir el hashCode y equals.
说明:String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用。
- [Obligatorio] resultados sublista arrayList de ArrayList no puede convertirse en un fuerte, de lo contrario será lanzar una ClassCastException que java.util.RandomAccessSubList no se puede convertir a java.util.ArrayList.
说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。
-
[Obligatorio] en escena subLista, prestar atención a la altura de la colección original de elementos para agregar o quitar, dará lugar a atravesar el sub-listas, añadir, borrar productos excepción ConcurrentModificationException.
-
[Fuerza] utilizando el conjunto método del conjunto de conmutadores, se debe establecer toArray (T [] array), se pasa en exactamente el mismo tipo de tamaño de la matriz es list.size ().
说明:使用 toArray 带参方法,入参分配的数组空间不够大时,toArray 方法内部将重新分配内存空间,并返回新数组地址;如果数组元素个数大于实际所需,下标为[ list.size() ] 的数组元素将被置为 null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
Ejemplos positivos:
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 错误。
- [Fuerza] utilizando herramientas Arrays.asList () array en un conjunto de tiempo, que no puede ser utilizado para modificar un conjunto de métodos relacionados, que añadir / quitar método / clear lanza una 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)也会随之修改。
- [Obligatorio] comodín genérica <? Extiende T> para recibir los datos devueltos, la redacción de este colecciones genéricas no puede utilizar el método add, y <? Super T> get método no puede ser utilizado como una asignación de llamada interfaz cuando propenso a errores.
说明:扩展说一下 PECS(Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>。
- [Obligatorio] No haga que el elemento de eliminar / añadir operaciones en el bucle foreach. eliminar los elementos, utilice Iterator manera, si las operaciones concurrentes, la necesidad de Iterator objeto de bloqueo.
Ejemplos positivos:
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();
}
}
contraejemplo:
for (String item : list) { if ("1".equals(item)) { list.remove(item); } }
说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的 结果吗?
- [Obligatorio] en la versión JDK7 y superior, clase de implementación Comparador para satisfacer las tres condiciones siguientes, o Arrays.sort, Collections.sort se informó IllegalArgumentException.
Descripción: las tres condiciones siguientes
1) X, Y, y un resultado de comparación resultado de la comparación y, x es el contrario.
2) x> y, y> z, entonces x> z.
3) x = y, a continuación, x, z resultado de comparación y y, z el mismo resultado de la comparación.
Anti Ejemplo: El siguiente ejemplo no maneja igual, puede producirse una excepción en el uso real:
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() > o2.getId() ? 1 : -1;
}
};
- [Recomendado] cuando un conjunto genérico de definiciones, JDK7 y por encima de, la sintaxis uso de diamante o completo omitirse.
说明:菱形泛型,即 diamond,直接使用<>来指代前边已经指定的类型。
Ejemplos positivos:
// <> diamond 方式
HashMap<String, String> userCache = new HashMap<>(16);
// 全省略方式
ArrayList<User> users = new ArrayList(10);
- [Recomendado] cuando se inicializa una colección, el valor inicial de un tamaño de conjunto especificado.
说明:HashMap 使用 HashMap(int initialCapacity) 初始化。
正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loader factor)默认为 0.75,如果暂时无法确定初始值大小,请设置为 16(即默认值)。
反例:HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容 量 7 次被迫扩大,resize 需要重建 hash 表,严重影响性能。
- [Recomendado] Uso entrySet atravesar colección Mapa de clases KV, en lugar de modo de conjunto de claves para atravesar.
说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效 率更高。如果是 JDK8,使用 Map.foreach 方法。
正例:values()返回的是 V 值集合,是一个 list 集合对象;keySet()返回的是 K 值集合,是一个 Set 集合对象;entrySet()返回的是 K-V 值组合集合。
- [Recomendado] conjunto de Mapa de altura clase de atención K / V puede almacenar valor nulo, el siguiente formulario:
Colecciones | Llave | Valor | súper | explicación |
---|---|---|---|---|
Tabla de picadillo | No permite la nula | No permite la nula | Diccionario | Seguridad para subprocesos |
ConcurrentHashMap | No permite la nula | No permite la nula | AbstractMap | técnica de segmentación de bloqueo (JDK8: CAS) |
TreeMap | No permite la nula | será nula | AbstractMap | seguro para hilos |
HashMap | será nula | será nula | AbstractMap | seguro para hilos |
反例: 由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上, 存储 null 值时会抛出 NPE 异常。
- [Referencia] uso racional de orden (clasificar) y una buena estabilidad del conjunto (orden), para evitar los efectos negativos de las colecciones de trastorno (Desordenar) y la inestabilidad (unorder) trae.
说明:有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次序是一定的。如:ArrayList 是 order/unsort;HashMap 是 unorder/unsort;TreeSet 是order/sort。
- [Referencia] con un elemento único conjunto característico, puede ir rápidamente a un conjunto de reoperación, para evitar el uso de la lista contiene método de atravesar, en comparación con reintento.