42、集合的第一大类:List

news2025/8/8 18:06:00

一、基本介绍:

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;i<listSize-1;i++){
            for(int j=0;j<listSize-1-i;j++){
                Book book1=(Book) list.get(j);//卡在了如何取出对象Book是关键,使用向下转型
                Book book2=(Book) list.get(j+1);
                if(book1.getPrice()>book2.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){
    }
    @Override
    public 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<E>
extends AbstractList<E>
implements List<E>, 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-->jack
        hsp.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和老韩之间直接插入一个对象smith
        Node 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;
    }

    @Override
    public 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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五章TCP/IP 我们网络在我们身边

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

GOT Online For Unreal | 支持GPU Counter、DrawCall和Triangle、功率

UWA GOT Online For Unreal 新功能上线&#xff0c;马上分享&#xff1a; 在GOT Online - Overview模式中&#xff0c;新增了GPU Counter、DrawCall、Triangle和功率数据采集等&#xff0c;同时也对新增了便于报告上传和查看的API接口&#xff0c;以便开发者在查看报告时可以更…

计算机组成原理4小时速成:存储器容量扩展:位扩展,字扩展,存储器与cpu链接,地址线,数据线,片选线,控制线,汉明码编码,奇偶校验

计算机组成原理4小时速成&#xff1a;存储器容量扩展&#xff1a;位扩展&#xff0c;字扩展&#xff0c;存储器与cpu链接&#xff0c;地址线&#xff0c;数据线&#xff0c;片选线&#xff0c;控制线&#xff0c;汉明码编码&#xff0c;奇偶校验 2022找工作是学历、能力和运气…

[附源码]java毕业设计游戏装备交易网站论文2022

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

项目管理中,如何应对需求蔓延?

项目管理中&#xff0c;需求蔓延几乎难以避免&#xff0c;控制不好所产生的后果不言而喻&#xff0c;轻则增加工作量&#xff0c;造成项目延期&#xff1b;重则导致方案不完善&#xff0c;导致交付质量难以保证&#xff0c;使项目失败&#xff0c;因此我们要做好充分的准备。 …

硬盘分区管理软件,硬盘分区软件哪个好用

磁盘分区是很高频的磁盘管理方式&#xff0c;但是&#xff0c;很多的用户又不知道磁盘分区&#xff0c;只能借助于专业的磁盘分区大师。那么&#xff0c;在本文中&#xff0c;易我小编将讲解磁盘分区的知识&#xff0c;并且为大家介绍一款超实用的硬盘分区管理软件。 一、电脑磁…

基于fastai 1.0.61的SSD目标检测算法 代码详解 (一)

基于fastai的目标检测算法&#xff0c;主要是2018年course ① 2018 coursev2 : https://nbviewer.org/github/fastai/fastai1/tree/master/courses/ pascal.ipynb pacal_multi.ipynb SSD② jav fastai1.x SSD 没有mAP&#xff1a; https://github/jav0927/course-v3/blob/…

41、集合

一、基本介绍&#xff1a; 1、引入&#xff1a; &#xff08;1&#xff09;前面我们保存多个数据使用的是数组&#xff0c;但数组不足的地方有&#xff1a; 1&#xff09;长度开始时必须指定&#xff0c;而且一旦指定&#xff0c;不能更改 2&#xff09;保存的必须为同一类…

最新uniApp微信小程序获取头像open-type=“chooseAvatar“ @chooseavatar方法

小程序用户头像昵称获取规则调整公告 调整说明 自 2022 年 10 月 25 日 24 时后&#xff08;以下统称 “生效期” &#xff09;&#xff0c;用户头像昵称获取规则将进行如下调整&#xff1a; 自生效期起&#xff0c;小程序 wx.getUserProfile 接口将被收回&#xff1a;生效期…

maven学习:继承与聚合

4.1继承 ​ 做面向对象编程的人都会觉得这是一个没意义的问题&#xff0c;是的&#xff0c;继承就是避免重复&#xff0c;maven的继承也是这样&#xff0c;它还有一个好处就是让项目更加安全. 我们在项目开发的过程中&#xff0c;可能多个模块独立开发&#xff0c;但是多个模块…

【面试宝典】Java八股文之Redis面试题

Redis面试题1、什么是 Redis?2、Redis 与其他 key-value 存储有什么不同?3、Redis 的数据类型?4、使用 Redis 有哪些好处?5、Redis 相比 Memcached 有哪些优势?6、Memcache 与 Redis 的区别都有哪些?7、Redis 是单进程单线程的?8、一个字符串类型的值能存储最大容量是多…

利用FME读取Word中的表格

利用FME的MSWordStyler转换器和Word写模块&#xff0c;我们可以将一些简单的文本和表格写出到Word文档格式中&#xff0c;转换器和写模块截图如下&#xff1a; 图1 MSWordStyler转换器 图2 Word写模块 FME目前还没有Word读模块可以直接读取和解析Word格式&#xff0c;今天我们给…

java基本语法 上

目录 关键字与保留字 关键字(keyword)的定义和特点 保留字 标识符 Java中的名称命名规范 变量 变量的定义 变量的分类 整数类型&#xff1a;byte、short、int、long 浮点类型&#xff1a;float、double 字符类型&#xff1a;char 布尔类型&#xff1a;boolean 字符…

【亲测】网址引导页管理系统

介绍&#xff1a; 易航网址引导系统-网址引导页管理系统去授权版一款极其优雅的易航网址引导页管理系统&#xff0c; 如果有问题可以跟我反馈&#xff0c;共同进步。祝各位道友一路飞升&#xff0c;顶峰相见&#xff01;内置12套模板和防墙插件。 项目亮点&#xff1a; 1、…

国产无线蓝牙耳机哪个好?性价比高的国产耳机品牌

目前市面上的无线蓝牙耳机品类众多&#xff0c;面对琳琅满目的无线蓝牙耳机&#xff0c;很多人一时之间无从下手&#xff0c;国产的产品越做越好&#xff0c;很多爱国人士纷纷支持自家品牌&#xff0c;因此小编根据蓝牙耳机热卖榜&#xff0c;给大家整理了一期性价比高的蓝牙耳…

Spring Boot + Activiti 完美结合,快速实现工作流~

概念 工作流。通过计算机对业务流程自动化执行管理&#xff0c;主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目标的实现”。 Activiti7 介绍 Activiti是一个工作…

数百个模型放在面前,金融机构要如何高效管理

疫情推动金融机构加速数字化转型。依托人工智能、大数据等技术&#xff0c;金融机构建立各类模型&#xff0c;特别是以机器学习为代表的数据模型&#xff0c;被广泛运用在风险计量、客户准入、资本计量、拨备计提、客户管理、反洗钱、反欺诈、精准营销等领域。在用户行为模式改…

11.24总结二叉树

目录 一.将二叉搜索树变成有序链表 二.从前序遍历和中序遍历构建二叉树 三.从中序遍历和后续遍历创建字符串 四.二叉树创立字符串 五.订正题目 六.排序子序列 七.二叉树非递归遍历 1.前序遍历 3.后续遍历 一.将二叉搜索树变成有序链表 我们的思路就是因为一颗二叉搜索…

如何通过短链接跳转到小程序,或者跳转至小程序webview一个h5页面

theme: channing-cyan 一、需求背景&#xff1a; 公司需要通过发送短信携带短链接&#xff0c;用户点击短链接跳转到小程序的某个页面&#xff0c;然后打开小程序该页面webviewh5页面&#xff0c;然后链接携带参数。 使用技术&#xff1a; 主要是用小程序的云开发&#x…

HashMap为什么会发生死循环?

Java的HashMap是线程不安全的&#xff0c;所以在jdk1.7中&#xff0c;多线程的HashMap扩容采用头插法会发生死循环问题。为什么会发生这种情况呢&#xff1f; 正常扩容 当我们向HashMap中添加值的时候&#xff0c;调用的是Put()方法。 public V put(K key, V value) {//如果…