11.集合之List
集合
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))
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);
}
* 結(jié)果```java 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 ================================= 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 =============================== 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 10總結(jié)
以上是生活随笔為你收集整理的11.集合之List的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 13. 软件包详解,rpm包的查找,安装
- 下一篇: 举个栗子!Tableau 技巧(199)