1. 程式人生 > 實用技巧 >List集合&Set集合

List集合&Set集合

基礎題

練習一:List介面的特點

一、請簡述List介面的特點。

v它是一個元素存取有序的集合。例如,存元素的順序是112233。那麼集合中,元素的儲存就是按照112233的順序完成的)。

v它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與陣列的索引是一個道理)。

v集合中可以有重複的元素,通過元素的equals方法,來比較是否為重複的元素。

練習二:hashCodeequals方法

二、請簡述HashSet去除重複元素的原理

v呼叫被新增元素的hashCode(),HashSet中已有元素的hashCode比較是否相同

v如果不相同直接儲存

v如果相同呼叫

equals方法比較是否相同

v不相同直接儲存元素

v相同認為是同一元素.不儲存

練習三:資料結構

三、簡述常見的資料結構中元素的存取特點

v棧:stack,又稱堆疊,對元素的存取特點是:先進後出。即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素。

v佇列:queue,簡稱隊,對元素的存取特點是:先進先出。即,存進去的元素,要在後它前面的元素依次取出後,才能取出該元素。

v陣列:Array,是有序的元素序列,對元素的存取特點是:

1、查詢元素快:通過索引,可以快速訪問指定位置的元素

2、增刪元素慢

1)指定索引位置增加元素:需要建立一個新陣列,將指定新元素儲存在指定索 引位置,再把原陣列元素根據索引,複製到新陣列對應索引的位置。

2)指定索引位置刪除元素:需要建立一個新陣列,把原陣列元素根據索引,復 制到新陣列對應索引的位置,原陣列中指定索引位置元素不復制到新陣列中。

v連結串列:linked list,對元素的存取有如下的特點:

1多個結點之間,通過地址進行連線。例如,多個人手拉手,每個人使用自己的 右手拉住下個人的左手,依次類推,這樣多個人就連在一起了。

2查詢元素慢:想查詢某個元素,需要通過連線的節點,依次向後查詢指定元素

3增刪元素快:

增加元素:只需要修改連線下個元素的地址即可。

刪除元素:只需要修改連線下個元素的地址即可。

練習四:ComparableComparator比較器

四、簡述Comparable

Comparator兩個介面的區別。

vComparable:強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現compareTo()一次,不能經常修改類的程式碼實現自己想要的排序。實現此介面的物件列表(和陣列)可以通過Collections.sort(和Arrays.sort)進行自動排序,物件可以用作有序對映中的鍵或有序集合中的元素,無需指定比較器。

vComparator強行對某個物件進行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sortArrays.sort),從而允許在排序順序上實現精確控制。還可以使用Comparator來控制某些資料結構(如有序set或有序對映)的順序,或者為那些沒有自然順序的物件collection提供排序。

練習五:LinkedList方法的使用

五、根據要求練習LinkedList方法

1)基本方法:add, set, get, remove, clear, size等方法

2特有方法:addFirst, addLast, getFirst, getLast, removeFirst, removeLast, push, pop, clear等方法。

1基本方法:

public class LinkedListTest01 {
    public static void main(String[] args) {
        // 1.建立LinkedList
        LinkedList<String> arr = new LinkedList<String>();

        // 2.使用add方法新增元素
        arr.add("西門吹雪");
        arr.add("西門吹雪");
        arr.add("西門吹雪");
        arr.add("西門吹風");
        arr.add("西門吹水");

        // 3.使用add方法在指定索引新增元素
        arr.add(2, "西門吹雨");

        // 4.使用set方法修改指定位置索引
        arr.set(0, "東門");

        for (String str : arr) {
            System.out.println(str);
        }
        System.out.println("--------------");
        // 5.使用get方法獲取指定索引的元素
        System.out.println(arr.get(1));

        // 6.使用size方法獲取集合大小
        System.out.println(arr.size());

        // 7.使用remove方法刪除指定索引的元素
        arr.remove(3);

        // 8.使用clear清空集合中的元素
        arr.clear();
        System.out.println(arr);
    }
}

  

2特有方法

public class LinkedListTest02 {
    public static void main(String[] args) {
        // 1.建立LinkedList
        LinkedList<String> linked = new LinkedList<String>();

        // 2.使用add方法新增元素
        linked.add("周杰倫");
        linked.add("周星馳");
        linked.add("周華健");
        linked.add("周潤發");

        // 3.使用addFirst新增元素到集合最前面
        linked.addFirst("周傳雄");

        // 4.使用addLast新增元素到集合最後面
        linked.addLast("周渝民");

        System.out.println(linked);

        // 5.使用getFirst獲取集合第一個元素
        System.out.println(linked.getFirst());

        // 6.使用getLast獲取集合最後一個元素
        System.out.println(linked.getLast());

        // 7.使用removeLast刪除集合第一個元素
        String first = linked.removeFirst();
        System.out.println(first);

        // 8.使用removeLast刪除集合最後一個元素
        String last = linked.removeLast();
        System.out.println(last);
        System.out.println(linked);


        // 9.使用pop彈出第一個元素
        String p = linked.pop();
        System.out.println(p);

        // 10.使用push在集合開頭插入元素
        linked.push("周立波");
        System.out.println(linked);

        // 11.使用clear清空集合
        linked.clear();
        System.out.println(linked);
    }
}

  

練習六:HashSet儲存自定義型別

六、定義人類包含姓名和年齡屬性。建立4個人儲存到HashSet中,姓名和年齡相同的人看做同一人不儲存。

Person類:

// 1.定義Person類.包好姓名年齡屬性,重寫hashCode()和equals()方法
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  

測試類

public class HashSetTest01 {
    public static void main(String[] args) {
        // 2.建立HashSet用於儲存Person型別
        HashSet<Person> hashSet = new HashSet<Person>();

        // 3.新增多個Person到HashSet中
        hashSet.add(new Person("王昭君", 21));
        hashSet.add(new Person("西施", 21));
        hashSet.add(new Person("楊玉環", 20));
        hashSet.add(new Person("貂蟬", 19));
        hashSet.add(new Person("楊玉環", 20));
        hashSet.add(new Person("貂蟬", 19));

        // 4.遍歷獲取HashSet中的內容
        for (Person p : hashSet) {
            System.out.println(p);
        }
    }
}

  

練習七:List集合元素替換

七、list集合新增姓名{張三,李四,王五,二丫,錢六,孫七},將二丫替換為王小丫。

public class ListTest01 {
    public static void main(String[] args) {
        //1.建立List集合物件
        List<String> list = new ArrayList<>();
        //2.存入資料
        list.add("張三");
        list.add("李四");
        list.add("王五");
        list.add("二丫");
        list.add("錢六");
        list.add("孫七");
        //3.遍歷集合,找到"二丫",便將其替換為"王小丫"
        //利用普通for迴圈遍歷List集合
        for(int i = 0;i<list.size();i++) {
            //獲取當前元素
            String thisName = list.get(i);
            //如果當前元素是"二丫"
            if("二丫".equals(thisName)) {
                //將其改為"王小丫"
                list.set(i, "王小丫");
            }
        }
        System.out.println(list);
    }
}

  

練習八:LinkedHashSet基本使用

八、使用LinkedHashSet儲存以下元素:"王昭君","王昭君","西施","楊玉環","貂蟬"。使用迭代器和增強for迴圈遍歷LinkedHashSet

public class LinkedHashSetTest01 {
    public static void main(String[] args) {
        // 1.建立LinkedHashSet
        LinkedHashSet<String> lhSet = new LinkedHashSet<String>();

        // 2.使用add方法新增元素到LinkedHashSet
        lhSet.add("王昭君");
        lhSet.add("王昭君");
        lhSet.add("王昭君");
        lhSet.add("西施");
        lhSet.add("楊玉環");
        lhSet.add("貂蟬");

        // 3.使用迭代器獲取LinkedHashSet中的元素
        Iterator<String> iterator = lhSet.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        // 4.使用增強for獲取LinkedHashSet中的元素
        System.out.println("---------------------");
        for (String string : lhSet) {
            System.out.println(string);
        }
    }
}

  

練習九:Collections工具類使用

九、ArrayList集合中有如下內容:{33,11,77,55},使用Collections.sort()ArrayList集合中的資料進行排序並打印出排序後的結果。

public class CollectionsTest01 {
    public static void main(String[] args) {
        // 1.建立ArrayList
        ArrayList<Integer> arr = new ArrayList<Integer>();

        // 2.使用add方法新增{33,11,77,55}四個元素
        arr.add(33);
        arr.add(11);
        arr.add(77);
        arr.add(55);

        // 3.呼叫Collections的sort方法,對集合排序
        Collections.sort(arr);

        // 4.使用增強for遍歷ArrayList集合
        for (Integer integer : arr) {
            System.out.println(integer);
        }
    }
}