日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

11.集合之List

發(fā)布時(shí)間:2023/12/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11.集合之List 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

集合

1.定義

1.集合可以看作是一種容器,用來(lái)存儲(chǔ)對(duì)象信息的容器,并且長(zhǎng)度是可變的。

  • 因?yàn)閷?duì)象是可以創(chuàng)建無(wú)限個(gè)數(shù)的,而對(duì)象數(shù)組是開(kāi)辟固定長(zhǎng)度的存儲(chǔ)空間,顯然用對(duì)象是不合適的

  • 對(duì)象數(shù)組長(zhǎng)度不可變化并且無(wú)法保存具有映射關(guān)系的數(shù)據(jù);集合可以用于存儲(chǔ)數(shù)量不確定的數(shù)據(jù),長(zhǎng)度可變,以及可以保存具有映射關(guān)系的數(shù)據(jù)

  • 數(shù)組元素既可以是基本類(lèi)型的值,也可以是對(duì)象;集合只能保存對(duì)象(比如list集合add(1)方法,是把1變成包裝類(lèi)Integer包裝類(lèi))

  • 所有的集合繼承關(guān)系圖(雖然很全,但是我們不是都要掌握,我們掌握工作中常用到的就可以),掌握這個(gè)文檔的就足夠你跟面試官吹逼了。
  • 如果覺(jué)得上面太復(fù)雜,看這個(gè)簡(jiǎn)化版如圖:
  • 常用集合圖
  • 2.集合的使用

    2.1 list集合

    • list接口集合代表一個(gè)有序、可重復(fù)的集合,集合每個(gè)元素都有其對(duì)應(yīng)的順序索引。list集合默認(rèn)按照元素的添加順序設(shè)置元素的索引,可以通過(guò)索引來(lái)訪問(wèn)指定位置的集合元素。

    • 實(shí)現(xiàn)list接口的集合常用的有:ArrayList、linkedList、vector子類(lèi)等,實(shí)現(xiàn)list接口有哪些子類(lèi)具體參考打開(kāi)層級(jí)目錄去看,不需要使用都學(xué)會(huì)。

    2.1.1ArrayList

    • ArrayList底層是一個(gè)object類(lèi)型的數(shù)組,也是我們最常用于數(shù)據(jù)遍歷的集合.它允許任何符合規(guī)則的數(shù)據(jù)插入設(shè)置是null。該object類(lèi)型的數(shù)組集合的默認(rèn)長(zhǎng)度為0,也可以自定義長(zhǎng)度。每次所以list.add()方法插入元素時(shí),對(duì)容器進(jìn)行擴(kuò)容。

    • 如圖

      [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-kv2k1oRi-1599571925845)(D:\downfile\QQ\tu1.png)]

    • list.get(i):直接獲取數(shù)組的指定下標(biāo)位置的元素,查詢(xún)快。

      @SuppressWarnings("unchecked") E elementData(int index) { return (E) elementData[index]; }
    • ArrayList是一個(gè)有序可擴(kuò)容長(zhǎng)度的數(shù)組,所以可以插入有序的可重復(fù)的元素.優(yōu)點(diǎn)是:可以快速通過(guò)下標(biāo)獲取到元素,遍歷元素和查找元素快;由于插入、刪除需要位移,所以插入、刪除效率慢。

    • 同時(shí)ArrayList是非同步的,是非線程安全的,效率高。

    • 案例1:

      import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {//底層是一個(gè)數(shù)組,每次插入值的時(shí)候判斷有沒(méi)有位置并且擴(kuò)容保證數(shù)組能夠無(wú)限的插入值List lists = new ArrayList();lists.add(100);lists.add("馬云");lists.add(1000.98);lists.add(1,"王健林");lists.add(1,100);System.out.println("集合長(zhǎng)度:" + lists.size());System.out.println("是否包含:"+(lists.contains(100)?"有100":"沒(méi)有100"));System.out.println(lists.get(1)); // list.clear();//清空集合for (int i = 0; i <lists.size(); i++) {System.out.println(lists.get(i));}System.out.println("===============================");for (Object object : lists) {System.out.println(object);}} }
    • 結(jié)果

      集合長(zhǎng)度:5 是否包含:100 100 100 100 王健林 馬云 1000.98 =============================== 100 100 王健林 馬云 1000.98
    • 案例2:添加對(duì)象類(lèi)型

    • student類(lèi)

      public class Student {private String name;private int age;private char sex;public void showStudent() {System.out.println("你好我是"+name+"年齡:"+age+"性別:"+sex);}public Student() {super();}public Student(String name, int age, char sex) {super();this.name = name;this.age = age;this.sex = sex;}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;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}}
    • 測(cè)試類(lèi)

      import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {Student stu1 = new Student("馬云",45,'男');Student stu2 = new Student("馬化騰",46,'男');Student stu3 = new Student("董明珠",47,'女');Student stu4 = new Student("章澤天",28,'女');List list = new ArrayList();list.add(stu1);list.add(stu2);list.add(stu3);list.add(stu1);list.add(1,stu4); // list.add("張三豐");因?yàn)閍dd(odject)類(lèi)型可以插入任意類(lèi)型,Student student1 = (Student)list.get(1);student1.showStudent();System.out.println("================================");for (int i = 0; i < list.size(); i++) {Student student = (Student)list.get(i);student.showStudent();}System.out.println("==============================");list.remove(stu1);//根據(jù)對(duì)象刪除list.remove(1);//根據(jù)下標(biāo)刪除for (Object object : list) {Student student2 = (Student)object;student2.showStudent();}} }
    • 結(jié)果

      你好我是章澤天年齡:28性別:================================ 你好我是馬云年齡:45性別:男 你好我是章澤天年齡:28性別:女 你好我是馬化騰年齡:46性別:男 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:============================== 你好我是章澤天年齡:28性別:女 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:======================== 你好我是章澤天年齡:28性別:女 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:
    • 案例3

    • 用泛型約束集合中的元素類(lèi)型

      import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {Student stu1 = new Student("馬云",45,'男');Student stu2 = new Student("馬化騰",46,'男');Student stu3 = new Student("董明珠",47,'女');Student stu4 = new Student("章澤天",28,'女');//<Student>泛型 用于約束集合中約束的類(lèi)型List<Student> list = new ArrayList<Student>();list.add(stu1);list.add(stu2);list.add(stu3);list.add(stu1);list.add(1,stu4); // list.add("張三豐");因?yàn)槎x集合的時(shí)候通過(guò)泛型約束了集合的類(lèi)型是Student,所以只能插入Student類(lèi)型的數(shù)據(jù)System.out.println("================================");for (int i = 0; i < list.size(); i++) {Student student =list.get(i);student.showStudent();}System.out.println("==============================");list.remove(stu1);//根據(jù)對(duì)象刪除list.remove(1);//根據(jù)下標(biāo)刪除for (Student student : list) {student.showStudent();}} }
    • 結(jié)果

      你好我是章澤天年齡:28性別:================================ 你好我是馬云年齡:45性別:男 你好我是章澤天年齡:28性別:女 你好我是馬化騰年齡:46性別:男 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:============================== 你好我是章澤天年齡:28性別:女 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:======================== 你好我是章澤天年齡:28性別:女 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:

    2.1.2 LinkedList

    • LinkedList的實(shí)現(xiàn)機(jī)制與ArrayList的實(shí)現(xiàn)機(jī)制完全不同,ArrayLiat內(nèi)部以數(shù)組形式保存數(shù)組,所以查詢(xún)和遍歷元素快,但插入和刪除需要位移性能低;LinkedList內(nèi)部以鏈表的形式保存集合的元素,所以查詢(xún)和遍歷效率比ArrayList低,插入和刪除元素效率高

    • LinkedList.add()源碼:

    • 把元素插到集合容器中的同時(shí),將該元素記錄在該元素的前、后的位置。所以插入和刪除該元素不需要位移

      void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;}
    • LinhkedList集合的get(i),是根據(jù)下標(biāo)參數(shù),先將index位置化為兩半,如果index小于集合的一半就從第一個(gè)往后找直到找到index的值賦給x返回,如果大于就從集合最后的值往前找,直到找到index的值賦給x返回,這樣可以減少一部分不必要的遍歷,但是還是沒(méi)有ArrayLiat直接找到下標(biāo)位置的元素效率高。

      Node<E> node(int index) {// assert isElementIndex(index);if (index < (size >> 1)) {Node<E> x = first;for (int i = 0; i < index; i++)x = x.next;return x;} else {Node<E> x = last;for (int i = size - 1; i > index; i--)x = x.prev;return x;}}
    • 案例

      import java.util.LinkedList; import java.util.List;import day02.Student;public class Test {public static void main(String[] args) {Student stu1 = new Student("馬云",45,'男');Student stu2 = new Student("馬化騰",46,'男');Student stu3 = new Student("董明珠",47,'女');Student stu4 = new Student("章澤天",28,'女');LinkedList<Student> list = new LinkedList<Student>();list.add(stu1);list.add(stu2);list.addFirst(stu3);//插入最前面list.addLast(stu4);//插入最后面//獲取第一個(gè)和最后一個(gè)對(duì)象list.getFirst().showStudent();list.getLast().showStudent();for (Student student : list) {student.showStudent();}for (int i = 0; i < list.size(); i++) {Student stu = list.get(i);stu.showStudent();}} }
    • 結(jié)果

      你好我是董明珠年齡:47性別:女 你好我是章澤天年齡:28性別:女 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:男 你好我是馬化騰年齡:46性別:男 你好我是章澤天年齡:28性別:女 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:男 你好我是馬化騰年齡:46性別:男 你好我是章澤天年齡:28性別:

    2.1.3 vector

    • vector的add()方法的源碼

      public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
    • synchronized修飾使方法同步,此集合線程安全。

    • ArrayList和Vector的區(qū)別

      • ArrayList集合和vector集合底層數(shù)組存儲(chǔ)的操作都是一樣的。ArrayList非線程安全,效率高;vector是線程安全的。
    • 案例

      public class Test {public static void main(String[] args) {Student stu1 = new Student("馬云",45,'男');Student stu2 = new Student("馬化騰",46,'男');Student stu3 = new Student("董明珠",47,'女');Student stu4 = new Student("章澤天",28,'女');//因?yàn)锳rrayLiat是線程不安全的,而vector底層基本和ArrayList一致也是一個(gè)數(shù)組,并且線程安全Vector<Student> list = new Vector<Student>(); list.add(stu1);list.add(stu2);list.add(stu3);list.add(stu1);for (Student student : list) {student.showStudent();}} }
    • 結(jié)果

      你好我是馬云年齡:45性別:男 你好我是馬化騰年齡:46性別:男 你好我是董明珠年齡:47性別:女 你好我是馬云年齡:45性別:

    數(shù)據(jù)作為方法的參數(shù)
    Map<String,Student> map = new LinkedHashMap<String,Student>();
    map.put(stu1.getName(), stu1);
    map.put(stu2.getName(), stu2);
    map.put(stu3.getName(), stu3);
    map.put(stu4.getName(), stu4);

    //獲取到所有的鍵,是一個(gè)無(wú)序的set集合Set<String> keys = map.keySet();//創(chuàng)建迭代器,讓無(wú)序的鍵排隊(duì)Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒(méi)有鍵,如果有就取到下一個(gè)鍵String key = it.next();//根據(jù)鍵獲取值Student student = map.get(key);student.showStudent();}System.out.println("=================================");for (String key : keys) {Student student = map.get(key);student.showStudent();}System.out.println("===============================");for (Student student : map.values()) {student.showStudent();} }

    }

    * 結(jié)果```java 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 ================================= 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 =============================== 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 10

    總結(jié)

    以上是生活随笔為你收集整理的11.集合之List的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。