主頁 >  其他 > Java的集合框架---API檔案深入研究3.0

Java的集合框架---API檔案深入研究3.0

2021-12-21 07:41:12 其他

目錄

1、使用ArrayList存盤自定義物件并遍歷

LinkedList

LinkedList特有的功能

添加功能

void addFirst(Object obj)

void addLast(Object obj)

獲取功能

Object getFirst()

Object getLast()

洗掉功能

Object removeFirst()

Object removeLast()

Vector

Vector特有的方法

public void addElement(Object obj)

public Object elementAt(int index)

public Enumeration elements()

案例1

解決方法一:迭代器遍歷,迭代器修改

解決方法二:集合遍歷,集合修改

案例2

案例3

案例4


1、使用ArrayList存盤自定義物件并遍歷

參考代碼:

創建Student類:

public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

創建ArrayList測驗類:

package com.hjl.test.day23;



import java.util.ArrayList;
import java.util.Iterator;

/*
   使用ArrayList存盤自定義物件并遍歷
 */
public class ArrayListDemo01 {
    public static void main(String[] args) {
        //創建ArrayList集合物件
        ArrayList arrayList = new ArrayList();

        //創建學生物件
        Student s1 = new Student("劉德華", 23);
        Student s2 = new Student("張學友", 22);
        Student s3 = new Student("郭富城", 23);
        Student s4 = new Student("彭于晏", 24);
        Student s5 = new Student("周杰倫", 25);

        //將學生物件添加到集合中
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        arrayList.add(s4);
        arrayList.add(s5);

        //遍歷的第一種方式:迭代器遍歷
        //獲取迭代器物件
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()){
            Student s = (Student) iterator.next();
            System.out.println(s.getName() + "---" +s.getAge());
        }

        System.out.println("================================");

        //遍歷的第二種方式:get()和size()方法結合
        for (int i = 0;i < arrayList.size();i++){
            Student student = (Student) arrayList.get(i);
            System.out.println(student.getName() + "---" + student.getAge());
        }

    }
}

輸出結果:

劉德華---23
張學友---22
郭富城---23
彭于晏---24
周杰倫---25
================================
劉德華---23
張學友---22
郭富城---23
彭于晏---24
周杰倫---25


LinkedList

查看API檔案我們知道:

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable

雙鏈表實作了ListDeque介面, 實作所有可選串列操作,并允許所有元素(包括null ),

所有的操作都能像雙向串列一樣預期, 索引到串列中的操作將從開始或結束遍歷串列,以更接近指定的索引為準,

請注意,此實作不同步, 如果多個執行緒同時訪問鏈接串列,并且至少有一個執行緒在結構上修改串列,則必須在外部進行同步, (結構修改是添加或洗掉一個或多個元素的任何操作;僅設定元素的值不是結構修改,)這通常通過在自然封裝串列的物件上進行同步來實作, 如果沒有這樣的物件存在,串列應該使用Collections.synchronizedList方法“包裝”, 這最好在創建時完成,以防止意外的不同步訪問串列:

  List list = Collections.synchronizedList(new LinkedList(...)); 

這個類的iteratorlistIterator方法回傳的迭代器是故障快速的 :如果串列在迭代器創建之后的任何時間被結構化地修改,除了通過迭代器自己的removeadd方法之外,迭代器將會拋出一個ConcurrentModificationException , 因此,面對并發修改,迭代器將快速而干凈地失敗,而不是在未來未確定的時間冒著任意的非確定性行為,

請注意,迭代器的故障快速行為無法保證,因為一般來說,在不同步并發修改的情況下,無法做出任何硬性保證, 失敗快速迭代器盡力投入ConcurrentModificationException , 因此,撰寫依賴于此例外的程式的正確性將是錯誤的:迭代器的故障快速行為應僅用于檢測錯誤,

底層資料結構為鏈表所以具有查詢慢,增刪快,執行緒不安全,效率高的特點


LinkedList特有的功能

  • 添加功能

void addFirst(Object obj)

查看API檔案我們知道:

public void addFirst(E e)

在該串列開頭插入指定的元素,

Specified by:

addFirst在介面 Deque<E>

引數

e - 要添加的元素

參考代碼:

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        //創建LinkedList物件
        LinkedList linkedList = new LinkedList();

        //添加元素到集合中
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        linkedList.add("hadoop");
        linkedList.add("hive");
        linkedList.add("spark");

        System.out.println(linkedList);
        System.out.println("================================================");

        //void addFirst(Object obj) 在該串列開頭插入指定的元素,
        linkedList.addFirst("flink");
        System.out.println(linkedList);
    }
}

輸出結果:

[hello, world, java, hadoop, hive, spark]
================================================
[flink, hello, world, java, hadoop, hive, spark]

從輸出結果上可以看出void addFirst(Object obj)就是在該串列開頭插入指定的元素,


void addLast(Object obj)

查看API檔案我們知道:

public void addLast(E e)

將指定的元素追加到此串列的末尾,

這個方法相當于add(E) ,

Specified by:

addLast在介面 Deque<E>

引數

e - 要添加的元素

參考代碼:

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        //創建LinkedList物件
        LinkedList linkedList = new LinkedList();

        //添加元素到集合中
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        linkedList.add("hadoop");
        linkedList.add("hive");
        linkedList.add("spark");

        System.out.println(linkedList);
        System.out.println("================================================");

        //void addLast(Object obj) 將指定的元素追加到此串列的末尾,
        linkedList.addLast("hdfs");
        System.out.println(linkedList);

    }
}

輸出結果:

[hello, world, java, hadoop, hive, spark]
================================================
[hello, world, java, hadoop, hive, spark, hdfs]

從輸出結果來看void addList(Object obj)就是將指定的元素追加到此串列的末尾 ,


  • 獲取功能

Object getFirst()

查看API檔案我們知道:

public E getFirst()

回傳此串列中的第一個元素,

Specified by:

getFirst在介面 Deque<E>

結果

這個串列中的第一個元素

例外

NoSuchElementException - 如果此串列為空

參考代碼:

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        //創建LinkedList物件
        LinkedList linkedList = new LinkedList();

        //添加元素到集合中
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        linkedList.add("hadoop");
        linkedList.add("hive");
        linkedList.add("spark");

        System.out.println(linkedList);
        System.out.println("================================================");

        //Object getFirst() 回傳此串列中的第一個元素,
        Object first = linkedList.getFirst();
        System.out.println(first);
        System.out.println(linkedList);

    }
}

輸出結果:

[hello, world, java, hadoop, hive, spark]
================================================
hello
[hello, world, java, hadoop, hive, spark]

從輸出結果上可以看出Obje getFirst()就是回傳此串列中的第一個元素,


Object getLast()

查看API檔案我們知道:

public E getLast()

回傳此串列中的最后一個元素,

Specified by:

getLast在介面 Deque<E>

結果

這個串列中的最后一個元素

例外

NoSuchElementException - 如果此串列為空

參考代碼:

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        //創建LinkedList物件
        LinkedList linkedList = new LinkedList();

        //添加元素到集合中
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        linkedList.add("hadoop");
        linkedList.add("hive");
        linkedList.add("spark");

        System.out.println(linkedList);
        System.out.println("================================================");

        //Object getLast() 回傳此串列中的最后一個元素,
        Object last = linkedList.getLast();
        System.out.println(last);
        System.out.println(linkedList);

    }
}

輸出結果:

[hello, world, java, hadoop, hive, spark]
================================================
spark
[hello, world, java, hadoop, hive, spark]

從輸出結果來看Object getList()就是從此串列中回傳最后一個元素,


  • 洗掉功能

Object removeFirst()

查看API檔案我們知道:

public E removeFirst()

從此串列中洗掉并回傳第一個元素,

Specified by:

removeFirst在介面 Deque<E>

結果

這個串列中的第一個元素

例外

NoSuchElementException - 如果此串列為空

參考代碼:

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        //創建LinkedList物件
        LinkedList linkedList = new LinkedList();

        //添加元素到集合中
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        linkedList.add("hadoop");
        linkedList.add("hive");
        linkedList.add("spark");

        System.out.println(linkedList);
        System.out.println("================================================");

        //Object removeFirst() 從此串列中洗掉并回傳第一個元素,
        Object o = linkedList.removeFirst();
        System.out.println(o);
        System.out.println(linkedList);

    }
}

輸出結果:

[hello, world, java, hadoop, hive, spark]
================================================
hello
[world, java, hadoop, hive, spark]

從輸出結果可以看出Object removeFirst()就是從此串列中洗掉并回傳第一個元素,


Object removeLast()

查看api檔案我們知道:

public E removeLast()

從此串列中洗掉并回傳最后一個元素,

Specified by:

removeLast在界面 Deque<E>

結果

這個串列中的最后一個元素

例外

NoSuchElementException - 如果此串列為空

參考代碼:

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        //創建LinkedList物件
        LinkedList linkedList = new LinkedList();

        //添加元素到集合中
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        linkedList.add("hadoop");
        linkedList.add("hive");
        linkedList.add("spark");

        System.out.println(linkedList);
        System.out.println("================================================");

        //Object removeLast() 從此串列中洗掉并回傳最后一個元素,
        Object o = linkedList.removeLast();
        System.out.println(o);
        System.out.println(linkedList);

    }
}

輸出結果:

[hello, world, java, hadoop, hive, spark]
================================================
spark
[hello, world, java, hadoop, hive]

從輸出結果可以看出Object removeLast()就是從此串列中洗掉并回傳最后一個元素,


Vector

查看API檔案我們知道:

public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

Vector類實作了可擴展的物件陣列, 像陣列一樣,它包含可以使用整數索引訪問的組件, 但是, Vector的大小可以根據需要增長或縮小,以適應在創建Vector之后添加和洗掉專案,

每個向量嘗試通過維護capacitycapacityIncrement優化存盤capacityIncrementcapacity總是至少與矢量大小一樣大; 通常較大,因為當向量中添加組分時,向量的存盤空間大小capacityIncrement , 應用程式可以在插入大量組件之前增加向量的容量; 這減少了增量重新分配的數量,

The iterators returned by this class's個 iterator和listIterator方法是快速失敗的 :如果向量在任何時間從結構上修改創建迭代器之后,以任何方式除非通過迭代器自身remove種或add方法,迭代器都將拋出一個ConcurrentModificationException , 因此,面對并發修改,迭代器將快速而干凈地失敗,而不是在未來未確定的時間冒著任意的非確定性行為, 由elements回傳的Enumerations 不是故障快速的,

請注意,迭代器的故障快速行為無法保證,因為一般來說,在不同步并發修改的情況下,無法做出任何硬性保證, 失敗快速迭代器盡力投入ConcurrentModificationException , 因此,撰寫依賴于此例外的程式的正確性將是錯誤的:迭代器的故障快速行為應僅用于檢測錯誤,

從Java 2平臺v1.2,這個類被改造為實作List介面,使其成為成員Java Collections Framework , 與新集合實作不同, Vector是同步的, 如果不需要執行緒安全的實作,建議使用ArrayList代替Vector

vector:底層資料結構是陣列具有查詢快、增刪慢、執行緒安全、效率低的特點,(雖然是執行緒安全的,但是我們并不經常使用他,后面我們會講一個執行緒安全的類代替它)

  • Vector特有的方法

public void addElement(Object obj)

查看API檔案我們知道:

public void addElement(E obj)

將指定的組件添加到此向量的末尾,將其大小增加1, 如果該載體的大小大于其容量,則該載體的容量增加,

該方法的功能與add(E)方法相同(它是List介面的一部分),

引數

obj - 要添加的組件

參考代碼:

import java.util.Vector;

public class VectorDemo1 {
    public static void main(String[] args) {
        //創建Vector集合物件
        Vector vector = new Vector();

        //向集合中添加元素
        vector.addElement("hello");
        vector.add("hadoop");
        vector.addElement("java");

        System.out.println(vector);
    }
}

輸出結果:

[hello, hadoop, java]

從運行結果來看addElement()和add()的效果一樣,是將元素添加到集合的末尾,


public Object elementAt(int index)

查看API檔案我們知道:

public E elementAt(int index)

回傳指定索引處的組件,

該方法的功能與get(int)方法相同(它是List介面的一部分),

引數

index - 這個向量的索引

結果

指定索引處的組件

例外

ArrayIndexOutOfBoundsException - 如果索引超出范圍( index < 0 || index >= size()

回傳指定索引處的組件和get(int index)效果相同

參考代碼1:

import java.util.Vector;

public class VectorDemo1 {
    public static void main(String[] args) {
        //創建Vector集合物件
        Vector vector = new Vector();

        //向集合中添加元素
        vector.addElement("hello");
        vector.add("hadoop");
        vector.addElement("java");

        System.out.println(vector);

        System.out.println("===============================");

        //public Object elementAt(int index)
        Object o = vector.elementAt(0);
        System.out.println(o);
        System.out.println(vector.elementAt(1));
        System.out.println(vector.elementAt(2));

        System.out.println(vector.get(0));

    }
}

輸出結果:

[hello, hadoop, java]
===============================
hello
hadoop
java
hello

從輸出結果來看elementAt()效果和get()一樣,如果我們不知道集合中有多少元素不小心取多了會發生什么呢?

參考代碼2:

import java.util.Vector;

public class VectorDemo1 {
    public static void main(String[] args) {
        //創建Vector集合物件
        Vector vector = new Vector();

        //向集合中添加元素
        vector.addElement("hello");
        vector.add("hadoop");
        vector.addElement("java");

        System.out.println(vector);

        System.out.println("===============================");

        //public Object elementAt(int index)
        Object o = vector.elementAt(0);
        System.out.println(o);
        System.out.println(vector.elementAt(1));
        System.out.println(vector.elementAt(2));

        System.out.println(vector.get(0));

        System.out.println(vector.elementAt(3));

    }
}

運行結果:

ArrayIndexOutOfBoundsException 陣列越界例外


public Enumeration elements()

查看API檔案我們知道:

public Enumeration<E> elements()

回傳此向量的組件的列舉, 回傳的Enumeration物件將生成此向量中的所有項, 產生的第一項是在索引的項0 ,則在索引項1 ,依此類推,

結果

這個向量的組件的列舉

參考代碼:

import java.util.Enumeration;
import java.util.Vector;

public class VectorDemo1 {
    public static void main(String[] args) {
        //創建Vector集合物件
        Vector vector = new Vector();

        //向集合中添加元素
        vector.addElement("hello");
        vector.add("hadoop");
        vector.addElement("java");

        System.out.println(vector);
        System.out.println("===============================");

        //public Enumeration elements()
        Enumeration elements = vector.elements();

        while (elements.hasMoreElements()){
            Object o = elements.nextElement();
            System.out.println(o);
        }

        System.out.println("===========================");
        System.out.println(vector);

    }
}

輸出結果:

[hello, hadoop, java]
===============================
hello
hadoop
java
===========================
[hello, hadoop, java]

從運行結果上我們可以看出該方法就是回傳此向量的組件的列舉,


接下來我們寫幾個案例來練習一下

案例1

需求:

現在有一個集合,集合中有些字串的元素,我想判斷一下里面有沒有"bigdata"這個字串 如果有,我們就添加一個"yes"

解決方法一:迭代器遍歷,迭代器修改

參考代碼1:

import java.util.ArrayList;
import java.util.Iterator;

public class ListTestDemo1 {
    public static void main(String[] args) {
        //創建一個集合物件
        ArrayList list = new ArrayList();

        //添加元素到集合中
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("bigdata");
        list.add("hadoop");

        //獲取迭代器物件
        Iterator iterator = list.iterator();

        while (iterator.hasNext()){
            String s = (String) iterator.next();
            if("bigdata".equals(s)){
                list.add("yes");
            }
        }
        System.out.println(list);
    }
}

運行結果:

用我們之前學的獲取迭代器物件則出現了一個ConcurrentModificationException:并發修改例外,當不允許這樣的修改時,可以通過檢測到物件的并發修改的方法來拋出此例外,

原因:迭代器是依賴于集合存在的,在遍歷迭代器元素的時候,當我們判斷成功后,往集合中添加 了一個元素,但是呢,迭代器這個時候并不知道已經添加了元素,所以就報錯了,

簡單的來說就是在迭代器遍歷的時候不能通過集合去修改元素,

這個時候就要用到我們的迭代器遍歷,迭代器修改和集合遍歷,集合修改這兩種方法去解決,

參考代碼2:

import java.util.ArrayList;
import java.util.ListIterator;

public class ListTestDemo1 {
    public static void main(String[] args) {
        //創建一個集合物件
        ArrayList list = new ArrayList();

        //添加元素到集合中
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("bigdata");
        list.add("hadoop");

        //迭代器遍歷,迭代器修改
        ListIterator listIterator = list.listIterator();
        while (listIterator.hasNext()){
            String s = (String) listIterator.next();
            if ("bigdata".equals(s)){
                //在迭代器元素"bigdata"后面添加
                listIterator.add("yes");
            }
        }

        System.out.println(list);
    }
}

輸出結果:

[hello, world, java, bigdata, yes, hadoop]

在迭代器元素"bigdata"后面添加 ,

解決方法二:集合遍歷,集合修改

參考代碼3:

import java.util.ArrayList;

public class ListTestDemo1 {
    public static void main(String[] args) {
        //創建一個集合物件
        ArrayList list = new ArrayList();

        //添加元素到集合中
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("bigdata");
        list.add("hadoop");

        //集合遍歷,集合修改
        for (int i = 0;i<list.size();i++){
            String s = (String) list.get(i);
            if ("bigdata".equals(s)){
                //在集合尾部添加
                list.add("yes");
            }
        }

        System.out.println(list);
    }
}

輸出結果:

[hello, world, java, bigdata, hadoop, yes]

在集合尾部添加


案例2

需求:去除集合中字串的重復值(字串的內容相同)

參考代碼:

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTest1 {
    public static void main(String[] args) {
        //創建舊集合物件
        ArrayList list = new ArrayList();

        //向集合中添加字串元素
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("hadoop");
        list.add("hive");
        list.add("hello");
        list.add("spark");
        list.add("java");

        System.out.println("去重之前的集合為:" + list);
        //創建一個新的集合保存去重后的元素
        ArrayList list2 = new ArrayList();

        //遍歷舊集合
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            //向下轉型
            String s = (String) iterator.next();

            //獲取到元素后,拿到這個元素去新的集合里面去找,如果找到說明重復,如果沒有找到,就添加到新集合中
            if (!list2.contains(s)){
                list2.add(s);
            }
        }
        System.out.println("去重后的集合為:" + list2);
    }
}

輸出結果:

去重之前的集合為:[hello, world, java, hadoop, hive, hello, spark, java]
去重后的集合為:[hello, world, java, hadoop, hive, spark]


案例3

需求:去除集合中自定義物件的值(物件的成員變數值都相同,姓名和年齡相同)

參考代碼1:

創建Student類:

public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

測驗類:

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTest2 {
    public static void main(String[] args) {
        //創建集合物件
        ArrayList list = new ArrayList();

        //創建學生物件
        Student s1 = new Student("劉德華", 18);
        Student s2 = new Student("張學友", 19);
        Student s3 = new Student("郭富城", 20);
        Student s4 = new Student("劉德華", 18);
        Student s5 = new Student("劉德華", 19);

        //向集合中添加元素
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);

        System.out.println("去重之前的集合為:\n" + list);

        System.out.println("==================================================");

        //創建新的集合物件
        ArrayList list2 = new ArrayList();
        //遍歷舊的集合
        Iterator iterator = list.iterator();
        while (!iterator.hasNext()){
            //向下轉型
            Student s = (Student) iterator.next();
            //判斷重復的向新集合中添加
            if (list2.contains(s)){
                list2.add(s);
            }
        }

        System.out.println("去重后的集合為:\n" + list2);

    }
}

輸出結果:

去重之前的集合為:
[Student{name='劉德華', age=18}
, Student{name='張學友', age=19}
, Student{name='郭富城', age=20}
, Student{name='劉德華', age=18}
, Student{name='劉德華', age=19}
]
==================================================
去重后的集合為:
[]

通過運行結果發現,這并不是我們想要的結果,我們按照字串的形式處理重復的自定義物件,發現結果并沒有去重這是為什么呢?

查看原碼分析:

經過查看原碼的分析后,我們發現問題出現了在判斷的時候出現了, 因為只有當if里面是true的時候,才添加到新集合中, 說明我們的代碼一直都是true,換句話說,contains()方法并沒有生效 怎么改呢?要想知道怎么改,看一看contains內部是怎么實作的, 底層呼叫的是元素的equals方法,又因為我們Student類沒有重寫equals方法 呼叫的是父類Object類中的equals方法,比較的是地址值,所以contains() 結果永遠是true,if判斷永遠判斷的是新集合不包含,就添加到新集合中,所以 產生了沒有去重的效果,

解決辦法:元素類重寫equals()方法

在Student類中重寫equals方法:

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }
}

用我們之前的測驗類:

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTest2 {
    public static void main(String[] args) {
        //創建集合物件
        ArrayList list = new ArrayList();

        //創建學生物件
        Student s1 = new Student("劉德華", 18);
        Student s2 = new Student("張學友", 19);
        Student s3 = new Student("郭富城", 20);
        Student s4 = new Student("劉德華", 18);
        Student s5 = new Student("劉德華", 19);

        //向集合中添加元素
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);

        System.out.println("去重之前的集合為:\n" + list);

        System.out.println("==================================================");

        //創建新的集合物件
        ArrayList list2 = new ArrayList();
        //遍歷舊的集合
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            //向下轉型
            Student s = (Student) iterator.next();
            //判斷重復的向新集合中添加
            if (!list2.contains(s)){
                list2.add(s);
            }
        }

        System.out.println("去重后的集合為:\n" + list2);

    }
}

輸出結果:

去重之前的集合為:
[Student{name='劉德華', age=18}
, Student{name='張學友', age=19}
, Student{name='郭富城', age=20}
, Student{name='劉德華', age=18}
, Student{name='劉德華', age=19}
]
==================================================
去重后的集合為:
[Student{name='劉德華', age=18}
, Student{name='張學友', age=19}
, Student{name='郭富城', age=20}
, Student{name='劉德華', age=19}
]

這樣就達到我們想要的目的了,是不是很有意思呢?


案例4

面試題

需求:請用LinkedList模擬堆疊資料結構的集合,并測驗

參考代碼1:

import java.util.Iterator;
import java.util.LinkedList;

public class LinkedListTest2 {
    public static void main(String[] args) {
        //創建LinkedList集合
        LinkedList linkedList = new LinkedList();

        //使用addFirst向集合中添加元素
        linkedList.addFirst("hello");
        linkedList.addFirst("world");
        linkedList.addFirst("java");
        linkedList.addFirst("hadoop");

        System.out.println("入堆疊:\n" + linkedList);

        System.out.println("=======================");

        //遍歷集合
        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println("出堆疊:\n" + next);
        }
        //如果面試的時候,你按照上面的寫法 0分
    }
}

輸出結果:

入堆疊:
[hadoop, java, world, hello]
=======================
出堆疊:
hadoop
出堆疊:
java
出堆疊:
world
出堆疊:
hello

如果面試的時候,按照上面的寫法 0分!!!

題目真正的意思是,讓我們自己寫一個類,底層是LinkedList,呼叫自己寫的方法實作堆疊資料結構!

參考代碼:

創建MyStack類:

import java.util.LinkedList;

public class MyStack {
    private LinkedList linkedList;

    //自定義集合類
    MyStack(){
        linkedList = new LinkedList();
    }

    //進堆疊方法
    public void myAdd(Object object){
        linkedList.addFirst(object);
    }

    //出堆疊方法
    public Object myGet(){
        return linkedList.removeFirst();
    }

    //由于不知道集合元素有多少判斷集合是否為空
    public boolean myIsEmpty(){
        return linkedList.isEmpty();
    }

    @Override
    public String toString() {
        return "MyStack{" +
                "linkedList=" + linkedList +
                '}';
    }
}

創建測驗類MyStackTest:

public class MyStackTest {
    public static void main(String[] args) {
        //創建自己定義的集合類
        MyStack myStack = new MyStack();

        //添加元素(入堆疊)
        myStack.myAdd("hello");
        myStack.myAdd("world");
        myStack.myAdd("java");
        myStack.myAdd("bigdata");

        System.out.println("入堆疊:\n" + myStack);

        //遍歷
        System.out.println("出堆疊:");
        while (!myStack.myIsEmpty()){
            //向下轉型
            String s = (String) myStack.myGet();
            System.out.println(s);
        }
    }
}

輸出結果:

入堆疊:
MyStack{linkedList=[bigdata, java, world, hello]}
出堆疊:
bigdata
java
world
hello

這樣我們就可以面試拿滿分啦!


到底啦!給靚仔一個關注吧!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/387830.html

標籤:其他

上一篇:云計算清覽作業

下一篇:大資料和云計算

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more