java-基礎知識-系列1
1.Java物件為什麼重寫equals和hashcode方法?有什麼作用?
答:預設equals在比較兩個物件時,是看他們是否指向同一個地址的。但有些時候,我們希望兩個物件只要是某些屬性相同就認為他們的equals為true
比如:學生物件,在某種情況下,我們認為學號一樣的物件是同一學生,那麼重寫之後,兩個同學號的物件比較就是相同
2.java集合進行排序的兩種方式
答:java集合的工具類Collections中提供了兩種排序的方法,分別是:
- Collections.sort(List list)
- Collections.sort(List list,Comparator c)
第一種稱為自然排序,參與排序的物件需實現comparable介面,重寫其compareTo()方法,方法體中實現物件的比較大小規則
public class Emp implements Comparable { @Override public int compareTo(Object o) { if(o instanceof Emp){ Emp emp = (Emp) o; // return this.age-emp.getAge();//按照年齡升序排序 } throw new ClassCastException("不能轉換為Emp型別的物件..."); } }
第二種叫定製排序,或自定義排序,需編寫匿名內部類,先new一個Comparator介面的比較器物件c,同時實現compare()其方法;然後將比較器物件c傳給Collections.sort()方法的引數列表中,實現排序功能;
/**使用Comparator比較器按age升序排序*/ @Test public void testComparatorSortAge(){ Collections.sort(list,new Comparator () { @Override public int compare(Object o1, Object o2) { if(o1 instanceof Emp && o2 instanceof Emp){ Emp e1= (Emp) o1; Emp e2 = (Emp) o2; return e1.getAge() - e2.getAge(); } throw new ClassCastException("不能轉換為Emp型別"); } }); }
說明:第一種方法不夠靈活,實體類實現了comparable介面後,會增加耦合,如果在專案中不同的位置需要根據不同的屬性呼叫排序方法時,需要反覆修改比較規則,二者只能選擇其一,會起衝突.
第二種就很好地解決了這個問題.在需要的地方,建立個內部類的例項,重寫其比較方法即可.
3.禁止在 foreach 迴圈裡進行元素的 remove/add 操作?
答:是因為觸發了一個 Java 集合的錯誤檢測機制——fail-fastfail-fast,即快速失敗,它是 Java 集合的一種錯誤檢測機制。當多個執行緒對集合(非 fail-safe 的集合類)進行結構上的改變的操作時,有可能會產生 fail-fast 機制,這個時候就會丟擲 ConcurrentModificationException(當方法檢測到物件的併發修改,但不允許這種修改時就丟擲該異常)。同時需要注意的是,即使不是多執行緒環境,如果單執行緒違反了規則,同樣也有可能會丟擲改異常。
因此,使用遍歷刪除或者新增時,使用一般的for迴圈
4.java中List集合去重的方法
1.雙重for迴圈,然後remove
2.利用HashSet踢除重複元素
public static List removeDuplicate(List list) { HashSet h = new HashSet(list); list.clear(); list.addAll(h); return list; }
3.把list裡的物件遍歷一遍,用list.contains(),如果不存在就放入到另外一個list集合中
public static List removeDuplicate(List list){ List listTemp = new ArrayList(); for(int i=0;i<list.size();i++){ if(!listTemp.contains(list.get(i))){ listTemp.add(list.get(i)); } } return listTemp; }
4.Stream中對List進行去重:list.stream().distinct();
List list=(List) a.stream().distinct().collect(Collectors.toList());