/**
* 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);
}
}