Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦

集合

1 Collection接口

1.1 集合概述

集合是一个装对象的容器。集合中只能存放引用数据类型的对象。集合中有一些大小是固定的,有一些是不固定的。有一些是有序的,有些是无序的。

有些可以有重复元素,有一些不可以有重复元素

1.2 集合常用方法

public static void main(String[] args) {// 创建集合对象Collection<String> coll = new ArrayList<>();// 添加元素coll.add("吴京");coll.add("王源");coll.add("丁真");coll.add("迪丽热巴");coll.add("刘浩存");coll.add("田晓威");// 清空集合
//        coll.clear();boolean contains = coll.contains("刘浩存");System.out.println(contains);// 判断集合是否为空boolean empty = coll.isEmpty();System.out.println(empty);// 移除指定的元素boolean remove = coll.remove("田晓威");System.out.println(remove);// 获取集合的实际元素个数int size = coll.size();System.out.println(size);// 把集合转换成数组String[] array = coll.toArray(new String[0]);for (String o : array) {System.out.println(o);}System.out.println(coll);}

1.3 List接口

1.3.1 List接口的特点

  • 有序的集合

  • 方法具有索引

  • 允许重复的元素

1.3.2 List接口带有索引的方法

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("郭靖");list.add("洪七公");list.add("黄蓉");list.add("欧阳锋");list.add("欧阳克");list.add("黄蓉");// 插入元素list.add(3,"黄药师");list.add(6,"周伯通");// IndexOutOfBoundsException: 索引越界//      ArrayIndexOutOfBoundsException: 数组越界
//              StringIndexOutOfBoundsException: 字符串越界
//        list.add(9,"王重阳");list.add("黄蓉");// 获取指定索引处的元素String s = list.get(4);System.out.println(s);// 获取指定元素首次出现的索引  找不到返回-1int index = list.indexOf("杨过");System.out.println(index);// 获取指定元素最后一次出现的索引  找不到返回-1int indexOf = list.lastIndexOf("黄蓉");System.out.println(indexOf);// 删除指定索引处的元素String remove = list.remove(5);System.out.println(remove);// 替换指定索引处的元素String set = list.set(6, "杨康");System.out.println(set);// 截取子列表   包头不包尾List<String> strings = list.subList(2, 6);System.out.println(strings);System.out.println(list);}

1.3.3 ArrayList的特点

  • 内部数据结构是数组

  • 内存是连续的,具有索引

  • 查询速度相对快

  • 增删速度相对慢

  • 异步线程不安全的集合

  • 可以存放null

  • 默认无参构造的初始容量是0

  • 默认的初始容量是10

  • 扩容是原来容量 + 原来容量 / 2

public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>(14);arrayList.add("阿珍");// 把ArrayList长度变成实际元素个数的长度arrayList.trimToSize();}

1.3.4 实现ArrayList练习

package cn.javasm.demo;
​
import java.util.Arrays;
import java.util.Objects;
​
/*** 模拟实现ArrayList*/
public class ArrayListDemo {// 存储数据的数组private String[] data;// 实际元素个数private int size;
​// 定义无参构造public ArrayListDemo(){// 默认长度是10data = new String[10];}
​// 定义有参构造,用户可以根据参数选择初始默认容量public ArrayListDemo(int len){if (len < 0) throw new IllegalArgumentException();data = new String[len];}
​// 添加元素public void add(String str){// 判断是否需要扩容if (size >= data.length){grow();}data[size++] = str;}
​/*** 扩容数组*/private void grow() {if (data.length >= 1)data = Arrays.copyOf(data,data.length + (data.length >> 1));elsedata = Arrays.copyOf(data,data.length + 1);}
​// 插入元素方法public void add(int index,String str){// 判断索引是否越界if (index < 0 || index > size) throw new IndexOutOfBoundsException("数组越界了");
​// 判断是否需要扩容if (size >= data.length){grow();}
​// 插入元素其实就是将数据向后挪动一位,然后腾出来的那一位赋值为要插入的数据// 方式一:
//        for (int i = size - 1;i >= index;i--){
//            data[i + 1] = data[i];
//        }// 方式二:System.arraycopy(data,index,data,index + 1,size - index);
​data[index] = str;// 实际元素+1size++;}
​/*** 删除指定索引处的元素* @param index*/public void remove(int index){// 判断索引是否越界out(index);
​// 删除元素就是将后面的元素依次向前移动一位// 方式一:
//        for (int i = index;i < size - 1;i++){
//            data[i] = data[i + 1];
//        }// 方式二:System.arraycopy(data,index + 1, data,index,size - index - 1);
​// 实际元素个数-1size--;}
​private void out(int index) {if (index >= size || index < 0) throw new IndexOutOfBoundsException();}
​/*** 查找指定元素首次出现的索引,找不到返回-1*/public int indexOf(String str){for (int i = 0; i < size; i++) {
//            if (str == data[i] || str != null && str.equals(data[i])){
//                return i;
//            }if (Objects.equals(str,data[i])){return i;}}return -1;}
​
​/*** 删除指定元素*/public void remove(String str){// 查找str首次出现的位置int index = indexOf(str);if (index != -1) remove(index);}
​/*** 清空集合*/public void clear(){data = new String[10];size = 0;}
​/*** 判断是否包含某个元素*/public boolean contains(String str){return indexOf(str) != -1;}
​/*** 获取指定索引处的元素*/public String get(int index){// 判断是否越界out(index);return data[index];}
​/*** 判断集合是否为空*/public boolean isEmpty(){return size == 0;}
​/*** 替换元素*/public void set(int index,String str){out(index);data[index] = str;}/*** 获取元素个数*/public int size(){return size;}
​/*** 截取子列表* @return*/public ArrayListDemo sublist(int fromIndex,int toIndex){// 判断索引是否越界out(fromIndex);out(toIndex);
​// 判断参数是否合法if (fromIndex > toIndex) throw new IllegalArgumentException();
​// 创建新的列表ArrayListDemo sublist = new ArrayListDemo(toIndex - fromIndex);// 拷贝数据System.arraycopy(data,fromIndex,sublist.data,0,toIndex - fromIndex);// 设置实际元素个数sublist.size = toIndex - fromIndex;return sublist;}
​// [元素1, 元素2, 元素3]@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("[");for (int i = 0; i < size; i++) {if (i != size - 1){stringBuilder.append(data[i]).append(", ");}else {stringBuilder.append(data[i]);}}stringBuilder.append("]");return stringBuilder.toString();
​}
}

1.3.5 LinkedList的特点

  • 底层数据结构是双向链表

  • 内存是不连续的

  • 增删速度快

  • 查询速度慢

  • 异步线程不安全的集合

1.3.6 实现LinkedList

package cn.javasm.demo;
​
import java.util.Objects;
​
public class LinkedListDemo {/*** 实际元素个数*/private int size;
​/*** 头结点*/private Node first;
​/*** 尾结点*/private Node last;
​// 结点private class Node{// 数据String item;
​// 上一个结点Node prev;
​// 下一个结点Node next;
​public Node(String item, Node prev, Node next) {this.item = item;this.prev = prev;this.next = next;}}
​/*** 添加元素* @param str 数据*/public void add(String str){// 创建新结点Node node = new Node(str,null,null);// 添加元素分为两种情况// 1.添加的是第一个结点  要求头尾相同if (size == 0){this.first = node;}else {// 2.不是第一个结点this.last.next = node;node.prev = this.last;}this.last = node;size++;}
​/*** 插入元素* @param index  插入的索引* @param str    数据*/public void add(int index,String str){// 判断索引是否越界if (index > size || index < 0) throw new IndexOutOfBoundsException();// 插入元素分为三种情况// 1.插入到尾部  2.插入到中间  3.插入到头部// 插入到尾部就是添加元素if (index == size){add(str);return;}
​// 创建新结点Node node = new Node(str,null,null);if (index == 0){// 插入到头部node.next = this.first;this.first.prev = node;this.first = node;}else {// 插入到中间
​// 先查询要插入索引的元素Node no = getNode(index);no.prev.next = node;node.prev = no.prev;node.next = no;no.prev = node;}size++;}
​/*** 根据索引查找结点* @param index* @return*/private Node getNode(int index) {Node no = first;for (int i = 0; i < index; i++) {no = no.next;}return no;}
​/*** 删除指定索引处的元素* @param index*/public void remove(int index){
​// 判断索引是否越界out(index);
​// 删除元素分为: 1.删除头结点  2.删除尾结点  3.删除中间结点if (index == 0){// 删除头结点this.first = this.first.next;this.first.prev = null;}else if (index == size - 1){//删除尾结点this.last = this.last.prev;this.last.next = null;}else {// 删除中间结点Node node = getNode(index);node.prev.next = node.next;node.next.prev = node.prev;}size--;}
​private void out(int index) {if (index >= size || index < 0) throw new IndexOutOfBoundsException();}
​/*** 查询指定元素首次出现的索引* @param str  指定的元素* @return     索引*/public int indexOf(String str){// 获取头结点Node node = this.first;for (int i = 0; i < size; i++) {if (Objects.equals(str,node.item)){return i;}node = node.next;}return -1;}
​/*** 删除指定元素的结点*/public void remove(String str){// 查找出现的索引int index = indexOf(str);if (index != -1) this.remove(index);}
​/*** 清空链表*/public void clear(){this.first = this.last = null;size = 0;}
​/*** 判断是否包含指定的元素* @return*/public boolean contains(String str){return indexOf(str) != -1;}
​/*** 获取元素* @return*/public String get(int index){//判断是否越界out(index);return getNode(index).item;}
​/*** 判断链表是否为空* @return*/public boolean isEmpty(){return size == 0;}
​/*** 替换元素* @return*/public void set(int index,String str){// 判断是否越界out(index);getNode(index).item = str;}
​/*** 获取元素个数* @return*/public int size(){return size;}
​/*** 截取子链表*/public LinkedListDemo sublist(int fromIndex,int toIndex){// 判断是否越界out(fromIndex);out(toIndex);// 判断参数是否合法if (fromIndex > toIndex) throw new IllegalArgumentException();
​// 创建新链表LinkedListDemo sublist = new LinkedListDemo();// 获取开始的结点Node node = getNode(fromIndex);for (int i = fromIndex;i < toIndex;i++){sublist.add(node.item);node = node.next;}return sublist;}
​@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("[");Node node = this.first;for (int i = 0; i < size; i++) {if (i != size - 1){stringBuilder.append(node.item).append(", ");}else {stringBuilder.append(node.item);}node = node.next;}stringBuilder.append("]");return stringBuilder.toString();}
​public Node getFirst() {return first;}
​public Node getLast() {return last;}
}
​

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

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

相关文章

硬件基础:串口通信

数据传输方式&#xff08;按位传输方式&#xff09;并行通信通过多条数据线同时传输多个数据位&#xff0c;速度较快但成本高&#xff0c;抗干扰能力弱&#xff0c;适用于短距离通信&#xff0c;如早期的打印机接口。串行通信通过单条或少数数据线逐位传输数据&#xff0c;线路…

从Java全栈到云原生:一场技术深度对话

从Java全栈到云原生&#xff1a;一场技术深度对话 面试官与应聘者互动记录 面试官&#xff1a;你好&#xff0c;欢迎来到我们的面试。先简单介绍一下你自己吧。 应聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;28岁&#xff0c;硕士学历&#xff0c;有5年Java全栈开发…

158-EEMD-HHT算法

158-EEMD-HHT#EMD #希尔伯特变换-&#xff08;Hilbert- Huang Transform&#xff0c;HHT&#xff09;#集合经验模态分解 EEMD #时频分析 #边际谱代码描述1、利用 集合经验模态分解&#xff08;EEMD&#xff09;方法对信号进行分解&#xff0c;得到模态分量 IMF&#xff1b;2、计…

C#开发中的 token

C# 开发中的 Token 详解 C# 开发中的 Token 详解与示例 1. CancellationToken - 异步取消令牌 示例 1:基础取消机制 示例 2:Web API 中的请求取消 2. JWT Token - 身份验证令牌 示例 1:JWT Token 生成与验证 示例 2:ASP.NET Core JWT 认证配置 3. Access Token - API 访问令…

旅游安全急救实训室助力应急处置技能实战化

随着旅游行业的快速发展&#xff0c;游客安全需求日益突出&#xff0c;应急处置能力已成为旅游服务人才的核心素养之一。在中职教育旅游服务与管理专业中&#xff0c;旅游安全急救实训室作为关键教学场所&#xff0c;正发挥着不可替代的作用。一、旅游安全急救实训室的建设背景…

分布式微服务--ZooKeeper的客户端常用命令 Java API 操作

一、ZooKeeper 客户端常用命令 1. 启动与退出 bin/zkCli.sh -server 127.0.0.1:2181 # 连接客户端 quit # 退出客户端2. 节点操作 # 查看子节点 ls / ls -s / ls /app# 查看节点详细信息 ls2 /app stat /app# 创建节点 create /node1 "…

PID控制技术深度剖析:从基础原理到高级应用(六)

PID 控制技术深度剖析&#xff1a;从基础原理到高级应用 最近在项目中有要开始进行PID的控制了&#xff0c;隔了很久没有做PID控制的东西了&#xff0c;所以想正好借这个机会&#xff0c;温习一下和PID有关的内容。 系列文章目录 PID控制技术深度剖析&#xff1a;从基础原理到…

PCL关键点提取

1. 核心概念:什么是关键点?为什么需要关键点? 关键词:信息冗余、计算效率、突出特征 “想象一下,我们有一片密集的点云,包含几十万个点。如果我们直接在每个点上都计算像FPFH这样的局部特征,计算量会非常大,极其耗时,而且很多点所处的区域(比如平坦的墙面)特征非常…

vcruntime140_1.dll缺失怎么办?暗黑破坏神游戏vcruntime140_1.dll缺失的4个解决方法

你是否遇到过这样的情况&#xff1a; 玩《暗黑破坏神》《英雄联盟》《GTA5》的时候&#xff0c;游戏忽然闪退&#xff0c;弹窗提示&#xff1a; “无法启动&#xff0c;因为计算机中丢失 vcruntime140_1.dll” 这不是某一个游戏的问题&#xff0c;而是 Windows 系统运行库缺失…

迁移学习-ResNet

好的&#xff0c;我将为你撰写一篇关于ResNet迁移学习的技术博客。以下是博客的主要内容&#xff1a;ResNet迁移学习&#xff1a;原理、实践与效果深度解析1. 深度学习中迁移学习的重要性与ResNet的独特价值迁移学习&#xff08;Transfer Learning&#xff09;是机器学习中一种…

极大似然估计与概率图模型:统计建模的黄金组合

在数据驱动的时代&#xff0c;如何从海量信息中提取有价值的规律&#xff1f;统计建模提供了两大核心工具&#xff1a;极大似然估计&#xff08;MLE&#xff09;帮助我们根据数据推断模型参数&#xff0c;而概率图模型&#xff08;PGM&#xff09;则通过图形化语言描述变量间的…

解析豆科系统发育冲突原因

生命之树是进化生物学的核心&#xff0c;但由于 不完全谱系排序&#xff08;ILS&#xff09;、杂交 和 多倍化 等复杂过程&#xff0c;解析深层且难解的系统发育关系仍然是一个挑战。**豆科&#xff08;Leguminosae&#xff09;**这一物种丰富且生态多样化家族的理解&#xff0…

从Java全栈到前端框架:一次真实的面试对话与技术解析

从Java全栈到前端框架&#xff1a;一次真实的面试对话与技术解析 在一次真实的面试中&#xff0c;一位拥有多年经验的Java全栈开发工程师&#xff0c;被问及了多个涉及前后端技术栈的问题。他的回答既专业又自然&#xff0c;展现了扎实的技术功底和丰富的实战经验。 面试官&…

阿瓦隆 A1566HA 2U 480T矿机参数解析:性能与能效深入分析

在矿机行业&#xff0c;AvaLON是一个备受关注的品牌&#xff0c;尤其在比特币&#xff08;BTC&#xff09;和比特币现金&#xff08;BCH&#xff09;挖矿领域&#xff0c;凭借其强劲的算力和高效能效&#xff0c;在市场中占据了一席之地。本文将针对阿瓦隆 A1566HA 2U 480T矿机…

小迪安全v2023学习笔记(七十八讲)—— 数据库安全RedisCouchDBH2database未授权CVE

文章目录前记服务攻防——第七十八天数据库安全&Redis&CouchDB&H2database&未授权访问&CVE漏洞前置知识复现环境服务判断对象类别利用方法数据库应用 - Redis-未授权访问&CVE漏洞前置知识案例演示沙箱绕过RCE - CVE-2022-0543未授权访问 - CNVD-2019-2…

HTML + CSS 创建图片倒影的 5 种方法

HTML CSS 创建图片倒影的 5 种方法 目标&#xff1a;掌握多种生成“图片倒影 / Reflection”效果的实现思路&#xff0c;理解兼容性、性能差异与最佳实践&#xff0c;方便在真实业务&#xff08;商品展示、相册、登陆页面视觉强化&#xff09;中安全使用。 总览对比 方法核心…

一个文件被打开io流和不打卡 inode

1. 磁盘 最小基本单位 扇区 机器磁盘的io效率 &#xff08;读和取&#xff09;2. 文件系统 对磁盘分区 &#xff0c;最小的文件单位块组&#xff0c;快组内部已经划分好区域&#xff0c;巴拉巴拉&#xff0c;总之&#xff0c;每次使用数据&#xff0c;以操作系统的处理都是块级…

ThermoSeek:热稳定蛋白数据库

这篇论文提出了ThermoSeek&#xff0c;一个综合性的网络资源&#xff0c;用于分析来自嗜热和嗜冷物种的蛋白质序列和结构。具体来说&#xff0c;数据收集&#xff1a;从美国国家生物技术信息中心&#xff08;NCBI&#xff09;的基因组数据库中收集了物种的分类ID&#xff0c;并…

leetcode算法刷题的第二十七天

1.leetcode 56.合并区间 题目链接 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<v…

解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题

文章目录解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题为什么会出现证书链错误&#xff1f;常见场景直连服务器正常&#xff0c;但经过 WAF 出错Windows/Linux 下证书文件说明引入 WAF 或其他中间层&#xff1a;解决方法方法一&#xff1a;单独配置 …