1. 程式人生 > >Java泛型和Set集合

Java泛型和Set集合

泛型
  • 泛型:標識著集合中儲存元素的資料型別
  • 寫法:<資料型別>
  • 泛型類宣告位置:類名<泛型>
  • 泛型類中建立物件時,會給泛型賦值型別
  • 一個類中有多個泛型,需要在方法上進行泛型宣告,這個泛型將會在該方法被呼叫時被賦值

  • 好處:
    1.保證資料的安全性(提示方法中傳入引數型別)
    2.避免進行向下轉型(型別強轉)
    3.將執行時的錯誤 轉化編譯時報錯

  • 建立一個集合帶有泛型

ArrayList<String> list = new ArrayList<String>();

注意:前後泛型的型別要一致或者不填後面的,不填後面的話預設前後一致.

  • 泛型 ? extends E 相當於?是E的子類或者本類,可以限定引數的型別(向下限定)
        ArrayList<Person> list1 = new ArrayList<>();
        list1.add(new Person("東東", 11));
        ArrayList<Student> list2 = new ArrayList<>();
        list2.add(new Student("西西", 22));
        //  addAll(Collection ? extends E)
        //  E list1的泛型
        //  ? list2的泛型
list1.addAll(list2); System.out.println(list1);
  • 泛型介面,泛型型別在介面的實現類上確定
    interface InterA<G>{
    public abstract void fun (G g);
}
//  泛型型別可以在介面的實現類上確定
class InterAImpl implements InterA<String>{
    @Override
    public void fun(String g) {
    }
  • 建立泛型類的物件
Worker<String
> worker = new Worker<>();
  • 多引數方法 int …num
    1.傳入多個值用逗號隔開
    2.直接傳入陣列也行
    public static void print(int ... num) {
        for (int i = 0; i < num.length; i++) {
            System.out.println(num[i]);
        }
    }

注意::多引數要放在方法引數列表的最後一個

  • Arrays.asList可以將陣列轉成集合
    String[] strings = {"東東","南南","西西"};
        List<String> list = Arrays.asList(strings);
        System.out.println(list);

注意:該方法轉完集合後,不能對集合進行長度修改.

  • 迭代器刪除

        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("b");
        list.add("b");
        //  迭代器刪除
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String str = iterator.next();
            if (str.equals("b")) {
                //  刪除(使用迭代器的刪除方法)
                iterator.remove();
            }
        }
        System.out.println(list);

輸出: a

  • For迴圈刪除
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("b");
        list.add("b");
        //  迴圈刪除 "b"
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals("b")) {
                list.remove(i--);
            }
        }
        System.out.println(list);

輸出: a

  • Collections.swap集合工具類提供的交換方法
ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("東東", 20));
        list.add(new Student("西西", 19));
        list.add(new Student("北北", 21));
        list.add(new Student("南南", 18));
        list.add(new Student("中中", 22));
        //  氣泡排序法
        for (int i = 0; i < list.size()-1; i++) {
            for (int j = 0; j < list.size()-1-i; j++) {
                //  取出要比較的兩個學生
                Student s1 = list.get(j);
                Student s2 = list.get(j +1 );
                if (s1.getAge() < s2.getAge()) {
                //  集合工具類 提供的 交換方法
                Collections.swap(list, j, j+1);             
            }
        }   
    }
                System.out.println(list);
Set集合
  • 特點:
  • 無序
  • 無下標
  • 不重複(系統每建立一個物件,都會為這個物件分配一個 hashCode值.當向HashSet集合中儲存物件時,系統會先比較HashCode值是否相同.
    相同:
    會呼叫物件的equals方法進行比較,如果equals方法比較也相同,那麼就不存.
    不相同:
    如果HashCode不相同,相對於不是一個物件,直接把該物件存入集合中(也不會呼叫equals方法)