java-规约-集合
/** * 1 * @hashCode&equals的处理: * 1-只要覆写了equals,必须复写hashCode. * 2-因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须覆写这两个方法 * 3-如果自定义对象作为Map的键,那么必须覆写hashCode和equals * @注意:String因为覆写了hashCode和equals方法,所以可以直接作为key使用 */ public class day1019 { public static void main(String[] args) { Map<Item1,String> hashmap = new HashMap<Item1, String>(); hashmap.put(new Item1("f1","f2"),"it1"); hashmap.put(new Item1("f1","f2"),"it1"); /** * hashMap使用put方法之前会调用hash方法取获取key的hashCode值, * 然后根据hash方法返回的boolean值来决定put操作 */ System.out.println(hashmap.size());//没有继承equals和hashcode的时候是2 //继承之后是1 } } class Item1{ private String field1; private String field2; public Item1(String field1, String field2) { this.field1 = field1; this.field2 = field2; } public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } /** * 按照默认的重载equals和hashcode * @param o * @return */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Item1 item1 = (Item1) o; /** * 还比较了里面属性的值是否一致 */ if (field1 != null ? !field1.equals(item1.field1) : item1.field1 != null) return false; return field2 != null ? field2.equals(item1.field2) : item1.field2 == null; } @Override public int hashCode() { int result = field1 != null ? field1.hashCode() : 0; result = 31 * result + (field2 != null ? field2.hashCode() : 0); return result; } }
public class SetLearning { public static void main(String[] args) { /**2 * 判断所有集合内部的元素是否为空,使用isEmpty()方法,而不使用size() = 0; * 原因:某些集合,前者的复杂度为O(1) */ Map<String ,String> stringMap = new HashMap<>(); if (stringMap.isEmpty()){ System.out.println("no element"); } /**3 * 使用java.util.stream.Collectors类的toMap()方法转为Map集合时 * 一定要使用含参数类型为BinaryOperator,参数名为mergeFunction的方法, * 否则当出现相同key值时会抛出IllegalStateException异常 */ /**4 * 使用java.util.stream.Collectors类的toMap()方法转为Map集合时 * 当value为null时会抛NPE异常 */ } }
/**5 * ArrayList的subList结果不可强转为ArrayList,否则抛异常ClassCastException; * @注意:sublist()返回的是ArrayList内部类Sublist,并不是ArrayList本身,而是一个视图 */ public class day10191 { public static void main(String[] args) { List<String> arrayList = new ArrayList<String>(); arrayList.add("1"); arrayList.add("2"); arrayList.add("3"); arrayList.add("4"); System.out.println(arrayList); try{ ArrayList<String> a = (ArrayList<String>) arrayList.subList(0,2); }catch (Exception e){ System.out.println(e.getMessage()); } List<String> list = arrayList.subList(0,2); System.out.println(arrayList); System.out.println(list); } /** * re: * [1, 2, 3, 4] * java.util.ArrayList$SubList cannot be cast to java.util.ArrayList * [1, 2, 3, 4] * [1, 2] */ }
/** *14 * 不要再foreach循环进行元素的remove和add操作, * @remove元素使用Iterator方式 * 如果并发操作,需要对Iterator对象加锁 */ public class day10193 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("x"); list.add("x"); list.add("y"); list.add("y"); list.add("z"); list.add("z"); // for (int i = 0; i < list.size(); i++) { // String s = list.get(i); // if (s.equals("z")){ // list.remove(s);//执行这个的时候,其实list的长度会变化,元素会前移 // } // } System.out.println(list);//[x, x, y, y, z] // 正确的方法: Iterator<String> iterator = list.iterator(); while (iterator.hasNext()){ String next = iterator.next(); if (next.equals("z")){ iterator.remove(); } } System.out.println(list); } }