【Java】集合(一)单列集合List

news2024/9/23 9:23:37

1.集合

可以动态保存任意多个对象,并提供了一系列的操作对象的方法:add、remove、set、get等。

2.集合框架体系

分为两大类:

单列集合和双列集合

3.List接口基本介绍

List接口是Collection接口的子接口

List集合类中元素有序可重复支持索引,List容器中的元素都对应一个整数型的序号,可以根据序号存取容器中的元素。

List 集合里添加了一些根据索引来操作集合元素的方法

1) void add(int index,Obiect ele):在index位置插入ele元素

2)boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来

3)Object get(int index):获取指定index位置的元素

4)int indexof(Obiect obi):返回obi在集合中首次出现的位置

5)int lastlndexof(Obiect obi):返回obi在当前集合中未次出现的位置

6)Object remove(int index):移除指定index位置的元素,并返回此元素

7)Object set(int index, Object ele):设置指定index位置的元素为ele相当于是替换

8)List subList(int fromIndex, int tolndex):返回从fromIndex到tolndex位置的子集合

例子

	    List list=new ArrayList();
        //插入
        list.add(100);
        list.add(3);
        list.add("a");
         System.out.println(list);
        //删除
         list.remove(1);//默认按索引删除,索引从0开始
        list.remove(new Integer(100));//按指定元素删除,需要传入对象才行
        System.out.println(list);
        //修改
        list.set(0,"aaa");
        System.out.println(list);

List的三种遍历方式

方式一:使用iterator

        Iterator iter=list.iterator();
        while(iter.hasNext()) {
        	Object o=iter.next();
        	System.out.println(o);
        }

方式二:使用增强for

         for(Object o:list) {
        	 System.out.println(o);
         }

方式三:使用普通for

         for(int i=0;i<list.size();i++) {
        	 Object o=list.get(i);
        	 System.out.println(o);
         }

4.ArrayList底层结构和源码分析

基本介绍:

1)ArrayList可以加入多个null

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

3)ArrayList是线程不安全的,原因看源码没有synchronized

ArrayList底层操作机制源码分析

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

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

2)当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容则直接扩容elementData为1.5倍。

5.Vector底层结构和源码解剖

基本介绍:

1) Vector底层也是一个对象数组,protected Objectl] elementData;

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

//1. new Vector() 底层
/*
public Vector() {
this(10);
}
补充:如果是 Vector vector = new Vector(8);
走的方法:
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
2. vector.add(i)
2.1 //下面这个方法就添加数据到 vector 集合
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
2.2 //确定是否需要扩容 条件 : minCapacity - elementData.length>0
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法
//newCapacity = oldCapacity + ((capacityIncrement > 0) ?
//
capacityIncrement : oldCapacity);
//就是扩容两倍.
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}

6.LinkedList底层结构

LinkedList的全面说明
1)LinkedList底层实现了双向链表和双端队列特点

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

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

 LinkedList的底层操作机制
1)LinkedList底层维护了一个双向链表

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

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

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

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

/* linkedList.remove(); // 这里默认删除的是第一个结点
1. 执行 removeFirst
public E remove() {
return removeFirst();
}
2. 执行
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
3. 执行 unlinkFirst, 将 f 指向的双向链表的第一个结点拿掉
private E unlinkFirst(Node<E> f) {
// assert f == first && f != null;
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null; // help GC
first = next;
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}
*/

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

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

相关文章

2024京津冀人工智能展会(世亚智博会)展现“中国智造”高端技术

2024京津冀人工智能展会&#xff08;简称:世亚智博会&#xff09;已正式定档2024年6月28-30日&#xff0c;将启用北京亦创会展中心的一层全部展厅&#xff0c;预计展出面积达6万平方米&#xff0c;吸纳全球超过800家展商&#xff0c;展现“中国智造”的尖端理念与高端技术&…

制作企业期刊的网站,小白也能做出超吸睛的期刊

制作企业期刊的网站&#xff0c;对于许多企业来说&#xff0c;是一项既重要又具有挑战性的任务。然而&#xff0c;如果你是一位初学者或者是一位小白&#xff0c;也不用过于担心。按照小编说的步骤去做&#xff0c;你也能制作出吸引人的电子期刊 首先&#xff0c;你需要选择一个…

操作系统(三)进程和线程的基础知识

文章目录 前言进程和线程进程进程的状态进程控制块(PCB&#xff0c;Process Control Block)进程的上下文切换 线程线程的实现 进程加载进程等待和退出等待退出 优先级控制进程调试支持定时 小结 前言 本文主要涉及操作系统的简介、硬件结构、内存管理、进程管理、文件系统、设…

【Proteus仿真】【STM32单片机】停车场车位管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LED、蜂鸣器、LCD1602、红外传感器、74HC595模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示进入、驶出、剩余车位数…

什么是光电耦合器?如何选择型号及种类

光电耦合器(英文缩写为OC)亦称光电隔离器&#xff0c;简称光耦&#xff1b;以光为媒介传输电信号&#xff1b;它对输入、输出电信号有良好的隔离作用&#xff0c;是目前种类最多、用途最广的光电器件之一&#xff1b;所以&#xff0c;它在各种电路中得到广泛的应用。 光耦合器…

使用 `open-uri.with_proxy` 方法打开网页

Ruby 爬虫程序如下&#xff1a; require open-uri require nokogiri# 定义代理信息 proxy_host jshk.com.cn# 定义要爬取的网页 URL url http://www.example.com# 使用代理信息打开网页 open-uri.with_proxy(proxy_host, proxy_port) do |proxy|# 使用 Nokogiri 库解析网页内…

uniapp h5发行

前端使用uniapp开发项目完成后&#xff0c;需要将页面打包&#xff0c;生成H5的静态文件&#xff0c;部署在服务器上。 这样通过服务器链接地址&#xff0c;直接可以在手机上点开来访问。 打包全步骤如下&#xff1a; 首先在manifest.json文件中进行基础配置&#xff0c;获取…

Windows电脑训练 RT-DETR 改进算法 (Ultralytics) 教程,改进RTDETR算法(包括使用训练、验证、推理教程)

手把手从零开始训练 RT-DETR 改进项目 (Ultralytics版本) 教程,改进RTDETR算法 本文以Windows服务器为例:从零开始使用Windows训练 RT-DETR 算法项目 《芒果剑指 RT-DETR 目标检测算法 改进》 适用于芒果专栏改进RT-DETR算法 文章目录 百度 RT-DETR 算法介绍改进网络代码汇…

【ATTCK】MITRE Caldera-插件

CALDERA是一个由python语言编写的红蓝对抗工具&#xff08;攻击模拟工具&#xff09;。它是MITRE公司发起的一个研究项目&#xff0c;该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的&#xff0c;能够较真实地APT攻击行为模式。 通过CALDERA工具&#xff0c;安全…

测量均值频率、功率、带宽

测量均值频率、功率、带宽 生成以 1024 kHz 采样的啁啾信号的 1024 个采样点。啁啾信号的初始频率为 50 kHz&#xff0c;采样结束时达到 100 kHz。添加高斯白噪声&#xff0c;使信噪比为 40 dB。 nSamp 1024; Fs 1024e3; SNR 40;t (0:nSamp-1)/Fs;x chirp(t,50e3,nSamp/…

ssm+vue的课堂管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的课堂管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;SpringIOC和DI的代码实现&#xff0c;Spring如何存取对象&#xff1f;Controller、Service、Repository、Component、Configuration、Bean DI详…

使用LLM-Tuning实现百川和清华ChatGLM的Lora微调

LLM-Tuning项目源码&#xff1a; GitHub - beyondguo/LLM-Tuning: Tuning LLMs with no tears&#x1f4a6;, sharing LLM-tools with love❤️.Tuning LLMs with no tears&#x1f4a6;, sharing LLM-tools with love❤️. - GitHub - beyondguo/LLM-Tuning: Tuning LLMs wit…

Linux编辑器:vim的简单介绍及使用

目录 1.什么是vim 2.vim的基本概念 3.vim 的基本操作 4. 各模式下的命令集 4.1 正常模式命令集 4.2 末行模式命令集 5.补充 5.1 vim支持多文件编辑 5.2 vim 的配置 1.vim 配置原理 2. 常用简单配置选项&#xff1a; 3. 使用插件 1.什么是vim Vim 是从 vi 发展出…

Autosar模块介绍:MemIf(内存抽象接口)

上一篇 | 返回主目录 | [下一篇] Autosar模块介绍&#xff1a;MemIf(内存抽象接口 1 基本术语解释2 MemIf组成结构图 1 基本术语解释 编号缩写原文解释1(Logical) Block——可单独寻址的连续内存区域&#xff08;即&#xff0c;用于读、写、擦除、比较等操作&#xff09;2Pag…

京东数据软件系统:京东销量和销额数据在哪里看?

京东平台店铺众多&#xff0c;行业同行也数不胜数&#xff0c;若想要在平台中更好的运营店铺&#xff0c;品牌需要做好数据分析。下面结合鲸参谋电商数据分析平台这一数据分析工具&#xff0c;我们来看一看品牌在做数据分析时需要注重哪些数据维度。 *行业数据 京东商家通过鲸…

半导体应用系统一些小知识收集(stripwafer mapping,EAPscada)

1、Strip Mapping 针对于半导体后道基板上的每个芯片的良率实时追溯。从Die Bond贴芯片到Wire Bond,Marking为止的过程中实时处理及管理设备上传的基板Defect Mapping 信息&#xff0c;提高生产效率及品质&#xff1b; 提高生产效率:自动判别芯片不良信息,提高生产效率 提高品…

SPSS因子分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

全院级不良事件管理系统源码,事件上报、流转审批、数据统计、原因分析、措施制定

不良事件报告管理系统源码 事件上报、流转审批、数据统计、原因分析、措施制定 医院不良事件管理系统&#xff0c;支持医疗管理、护理管理、药品管理、医技管理、器械管理、输血管理、院感管理、职业防护管理、信息管理、后勤管理、治安管理等事件&#xff0c;内容齐全&#xf…

关于pip basicsr,facexlib,realesrgan et al.安装报错。

首先basicsr是一个超分的库&#xff0c;在ubuntu系统上pip时会报错。 上图这种错误&#xff0c;或者其他的错误&#xff0c;有的方法让去github上安装&#xff0c;那种方法到setup.py的时候也会报错。 问题在于首先 -i的源要换成阿里的源&#xff0c;然后要安装他要求的库&…