1. 程式人生 > 其它 >java-基礎知識-系列1

java-基礎知識-系列1

1.Java物件為什麼重寫equals和hashcode方法?有什麼作用?

答:預設equals在比較兩個物件時,是看他們是否指向同一個地址的。但有些時候,我們希望兩個物件只要是某些屬性相同就認為他們的equals為true

比如:學生物件,在某種情況下,我們認為學號一樣的物件是同一學生,那麼重寫之後,兩個同學號的物件比較就是相同

2.java集合進行排序的兩種方式

答:java集合的工具類Collections中提供了兩種排序的方法,分別是:

  1. Collections.sort(List list)
  2. 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());