42、集合的第一大类:List
创始人
2024-02-14 02:46:36

一、基本介绍:

1、List接口和常用方法

(1)List接口基本介绍:

List接口是Collection接口的子接口

1)List集合类中元素有序(即添加顺序和取出顺序一致),且可重复

2)List集合中每个元素都有其对应的顺序索引,即支持索引(索引从0开始)

3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素

4)JDK API中List接口的实现类有

 其中常用的有:ArrayList, LinkedList和Vector

 ·注意:subList()返回的是[fromIndex, toIndex)

5)

 //我的代码:

package Collection_;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class List01 {@SuppressWarnings({"all"})public static void main(String[] args) {List list=new ArrayList<>();list.add("hello");list.add("hello");list.add("hello");list.add("hello");list.add("hello");list.add("hello");list.add("hello");list.add("hello");list.add("hello");list.add("hello");System.out.println("list="+list);list.set(2,"韩顺平教育");System.out.println("list="+list);System.out.println("list的第5个元素是:"+list.get(5));list.remove(6);list.set(7,"hi");System.out.println("=======使用迭代器遍历list=========");Iterator iterator=list.iterator();while (iterator.hasNext()) {Object next =  iterator.next();System.out.println(next);}}
}
//list=[hello, hello, hello, hello, hello, hello, hello, hello, hello, hello]
//list=[hello, hello, 韩顺平教育, hello, hello, hello, hello, hello, hello, hello]
//list的第5个元素是:hello
//=======使用迭代器遍历list=========
//hello
//hello
//韩顺平教育
//hello
//hello
//hello
//hello
//hi
//hello

//老师的代码:

package Collection_;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListExercise01 {@SuppressWarnings({"all"})public static void main(String[] args) {List list=new ArrayList();for(int i=0;i<12;i++){list.add("hello"+i);}System.out.println("list="+list);list.add(1,"韩顺平教育");System.out.println("list="+list);System.out.println("第五个元素:"+list.get(4));list.remove(5);System.out.println("list="+list);list.set(6,"hi");System.out.println("list="+list);Iterator iterator=list.iterator();while (iterator.hasNext()) {Object obj =  iterator.next();System.out.println("obj="+obj);}}
}
//list=[hello0, hello1, hello2, hello3, hello4, hello5, hello6, hello7, hello8, hello9, hello10, hello11]
//list=[hello0, 韩顺平教育, hello1, hello2, hello3, hello4, hello5, hello6, hello7, hello8, hello9, hello10, hello11]
//第五个元素:hello3
//list=[hello0, 韩顺平教育, hello1, hello2, hello3, hello5, hello6, hello7, hello8, hello9, hello10, hello11]
//list=[hello0, 韩顺平教育, hello1, hello2, hello3, hello5, hi, hello7, hello8, hello9, hello10, hello11]
//obj=hello0
//obj=韩顺平教育
//obj=hello1
//obj=hello2
//obj=hello3
//obj=hello5
//obj=hi
//obj=hello7
//obj=hello8
//obj=hello9
//obj=hello10
//obj=hello11

2、List的三种遍历方式:

 (1)

package Collection_;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListExercise02 {@SuppressWarnings({"all"})public static void main(String[] args) {List list=new ArrayList();//List list=new LinkedList();//List list=new Vector();list.add(new Book("红楼梦","曹雪芹",100));list.add(new Book("西游记","吴承恩",10));list.add(new Book("水浒传","施耐庵",9));list.add(new Book("三国演义","罗贯中",80));for (Object o :list) {System.out.println(o);}sort(list);System.out.println("==================排序后===================");for (Object o :list) {System.out.println(o);}}public static void sort(List list){int listSize=list.size();for(int i=0;ibook2.getPrice()){list.set(j,book2);list.set(j+1,book1);}}}}
}
class Book{private String bookName;private String author;private double price;public Book(String bookName, String author, double price) {this.bookName = bookName;this.author = author;this.price = price;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public void bubbleSort(List list){}@Overridepublic String toString() {return "名称:" + bookName + '\t' + "价格:" + price + '\t' + "作者:" + author;}
}
//名称:红楼梦	价格:100.0	作者:曹雪芹
//名称:西游记	价格:10.0	作者:吴承恩
//名称:水浒传	价格:9.0	作者:施耐庵
//名称:三国演义	价格:80.0	作者:罗贯中
//==================排序后===================
//名称:水浒传	价格:9.0	作者:施耐庵
//名称:西游记	价格:10.0	作者:吴承恩
//名称:三国演义	价格:80.0	作者:罗贯中
//名称:红楼梦	价格:100.0	作者:曹雪芹

3、ArrayList

(1)注意事项:

1) permits all elements, including null,ArrayList 可以加入null,并且多个

2)ArrayList是由数组来实现数据存储的

3)ArrayList 基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码,

在多线程情况下,不建议使用ArrayList

(2)ArrayList的底层操作机制源码分析(重点,难点.)(B站第510集,还没有吃透)

1)ArrayList中维护了一个Object类型的数组elementData.

transient Object[] elementData;  //transient表示瞬间、短暂的,表示该属性不会被序列化

2) 当创建对象时,如果使用的是无参构造器,则初始elementData容量为0(jdk7是10)

3) 当添加元素时:先判断是否需要扩容,如果需要扩容,则调用grow方法,否则直接添加元素到合适位置

4) 如果使用的是无参构造器,如果第一次添加,需要扩容的话,则扩容elementData为10,如果需要再次扩容的话,则扩容elementData为1.5倍。

5)如果使用的是指定容量capacity的构造器,则初始elementData容量为capacity

6)如果使用的是指定容量capacity的构造器,如果需要扩容,则直接扩容elementData为1.5倍。

4、Vector:

1) Vector类的定义说明

public class vector
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable

2) Vector底层也是一个对象数组, protected Object[] elementData;

3) Vector 是线程同步的,即线程安全, Vector类的操作方法带有synchronized

public synchronized E get(int index) (
if (index >= elementCount) 1
throw new ArraylndexOutOfBoundsException(index); return elementData(index);

4)在开发中,需要线程同步安全时,考虑使用Vector

5、LinkedList:

(1)基本介绍:

1)LinkedList底层实现了双向链表和双端队列特点

2)可以添加任意元素(元素可以重复),包括null

3)线程不安全,没有实现同步

(2)LinkedList的底层操作机制

1)LinkedList底层维护了一个双向链表.

2)LinkedList中维护了两个属性first和last分别指向 首节点和尾节点

3) 每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点,item用于存放数据。最终实现双向链表.

4)所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。

5) 模拟一个简单的双向链表:

package Collection_;public class LinkedList_ {public static void main(String[] args) {//模拟一个简单的双向链表Node jack=new Node("jack");Node tom=new Node("tom");Node hsp=new Node("老韩");//连接三个结点,形成双向链表jack.next=tom;tom.next=hsp;//hsp-->tom-->jackhsp.pre=tom;tom.pre=jack;Node first=jack;//让first引用指向jack,就是双向链表的头结点Node last=hsp;//让last引用指向hsp,就是双向链表的尾结点System.out.println("=====从头到尾进行遍历======");while(true){if(first==null){break;}System.out.println(first);first=first.next;}System.out.println("=====从尾到头进行遍历======");while(true){if(last==null){break;}System.out.println(last);last=last.pre;}//添加一个对象,在tom和老韩之间直接插入一个对象smithNode smith=new Node("smith");smith.next=hsp;smith.pre=tom;hsp.pre=smith;tom.next=smith;//让first再次指向jack,就是双向链表的头结点first=jack;System.out.println("=====从头到尾进行遍历======");while(true){if(first==null){break;}System.out.println(first);first=first.next;}last=hsp;//让last再次指向hsp,就是双向链表的尾结点System.out.println("=====从尾到头进行遍历======");while(true){if(last==null){break;}System.out.println(last);last=last.pre;}}
}
class Node{public Object item;//真正存放数据public Node next;//指向后一个结点public Node pre;//指向前一个结点public Node(Object name){this.item=name;}@Overridepublic String toString() {return "Node name="+item;}
}
//=====从头到尾进行遍历======
//Node name=jack
//Node name=tom
//Node name=老韩
//=====从尾到头进行遍历======
//Node name=老韩
//Node name=tom
//Node name=jack
//=====从头到尾进行遍历======
//Node name=jack
//Node name=tom
//Node name=smith
//Node name=老韩
//=====从尾到头进行遍历======
//Node name=老韩
//Node name=smith
//Node name=tom
//Node name=jack

补:CRUD:表示增删改查(create, read, update, delete)

6、ArrayList和LinkedList的比较

(2)如何选择ArrayList和LinkedList:

1)如果我们改查的操作多,选择ArrayList

2) 如果我们增删的操作多,选择LinkedList

3) 一般来说,在程序中,80%—90%都是查询,因此大部分情况下会选择ArrayList

4) 在一个项目中,根据业务灵活选择,也可能这样,一个模块使用的是ArrayList,另外一个模块是LinkedList.

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...