Java学习苦旅(十六)——List

本篇博客将详细讲解Java中的List。

文章目录

  • 预备知识——初识泛型
    • 泛型的引入
    • 泛型小结
  • 预备知识——包装类
    • 基本数据类型和包装类直接对应关系
    • 装包与拆包
  • ArrayList
    • 简介
    • ArrayList使用
      • ArrayList的构造
      • ArrayList常见操作
      • ArrayList遍历
  • 结尾

预备知识——初识泛型

泛型的引入

我们之前实现过的顺序表,只能保存int类型的元素,如果现在需要保存指向String类型对象的引用的顺序表,请问应该如何解决?

这个时候就需要引入泛型这个概念了。

泛型的意义:

  • 自动对类型进行检查
  • 自动对类型进行强制类型的转换

示例代码:

class MyArrayList<E> {private E[] elem;private int usedSize;public MyArrayList() {this.elem = (E[]) new Object[10];}public void add(E val) {this.elem[usedSize] = val;usedSize++;}public E get(int pos) {return this.elem[pos];}
}public class TestDemo {public static void main(String[] args) {MyArrayList<String> myArrayList = new MyArrayList<>();myArrayList.add("ABC");myArrayList.add("DEF");System.out.println(myArrayList.get(1));}
}

执行结果为:

image-20220228143543228

泛型小结

  1. 泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。

  2. 泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。

  3. 泛型是一种编译期间的机制,即 MyArrayList<Integer> 和MyArrayList<String> 在运行期间是一个类型。

  4. 泛型是 java 中的一种合法语法,标志就是尖括号<>。

预备知识——包装类

基本数据类型和包装类直接对应关系

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

装包与拆包

示例代码

Integer a = 123;//隐式的装包
int b = a;//隐式的拆包Integer a2 = Integer.valueOf(123);//显式的装包
Integer a3 = new Integer(123);//显式的装包int b2 = a2.intValue();//显式的拆包

ArrayList

简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

说明

  1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问。

  2. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的。

  3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。

  4. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList。

  5. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。

ArrayList使用

ArrayList的构造

方法解释
ArrayList()无参构造
ArrayList(Collection<? extends E> c)利用其他Collection构建ArrayList
ArrayList(int initialCapacity)指定顺序表初始容量

示例代码

public static void main(String[] args) {List<Integer> list1 = new ArrayList<>();//构造一个空的列表List<Integer> list2 = new ArrayList<>(10);//构造一个具有10个容量的列表list2.add(1);list2.add(2);list2.add(3);ArrayList<Integer> list3 = new ArrayList<>(list2);//list3构造好之后,与list2中的元素一致
}

结论:

如果ArrayList调用,不带参数的构造方法,那么顺序表的大小是0。当第一次add的时候,整个顺序表才变为了10,当这10个放满了,开始扩容,以1.5倍的方式进行扩容。

如果调用的是给定容量的构造方法,那么顺序表的大小是所给的容量,放满之后还是以1.5倍进行扩容。

ArrayList常见操作

方法解释
boolean add(E e)尾插e
void add(int index, E element)将e插入到index位置
boolean addAll(Collection<? extends E> c)尾插c中的元素
E remove(int index)删除index位置元素
boolean remove(Object o)删除遇到的第一个o
E get(int index)获取下标index位置元素
E set(int index, E element)将下标index位置元素设置为element
void clear()清空
boolean contains(Object o)判断o是否在线性表中
int indexOf(Object o)返回第一个o所在下标
int lastIndexOf(Object o)返回最后一个o的下标
List<E> subList(int fromIndex, int toIndex)截取部分list

示例代码

List<String> list = new ArrayList<>();
list.add("abc");
list.add("def");
list.add("ABC");
list.add("EFG");
System.out.println(list);
System.out.println(list.size());//获取list中有效元素个数
System.out.println("=========更改指定元素==========");
System.out.println(list.get(1));
list.set(1,"xyz");
System.out.println(list.get(1));
System.out.println("=========插入指定元素==========");
list.add(1,"LMN");//在list的index位置插入指定元素,index及后续的元素统一往后移动一个位置
System.out.println(list);
System.out.println("=========删除指定元素==========");
list.remove("ABC");//删除指定元素,找到了就删除,该元素之后的元素统一往前移动一个位置
System.out.println(list);
if(list.contains("OPQ")) {list.add("OPQ");
}
System.out.println("===查找指定元素第一次出现的位置===");
System.out.println(list.indexOf("EFG"));//indexOf从前往后找
System.out.println(list.lastIndexOf("EFG"));//lastIndexOf从后往前找
System.out.println("============================");
List<String> ret = list.subList(1,3);
System.out.println(ret);list.clear();
System.out.println(list.size());

执行结果为:

image-20220228191007198

ArrayList遍历

示例代码

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
//直接打印
System.out.println(list);
//使用for循环
for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");
}
System.out.println();
//使用for-each
for (Integer s : list) {System.out.print(s + " ");
}
System.out.println();
//迭代器打印——Iterator
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {System.out.print(it.next() + " ");
}
System.out.println();
//迭代器打印——ListIterator
ListIterator<Integer> it1 = list.listIterator();
while(it1.hasNext()) {System.out.print(it1.next() + " ");
}
System.out.println();

执行结果为:

image-20220228193049060

结尾

本篇博客到此结束。
上一篇博客:Java学习苦旅(十五)——异常
下一篇博客:Java学习苦旅(十七)——栈和队列

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

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

相关文章

vmware安装龙蜥操作系统

vmware安装龙蜥操作系统 1、下载龙蜥操作系统 8.8 镜像文件2、安装龙蜥操作系统 8.83、配置龙蜥操作系统 8.83.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载龙蜥操作系统 8.8 镜像文件 这里选择 2023年2月发布的 8.8 版本 官方下载链接 https://mirro…

Cytoscape3.8安装下载及安装教程

Cytoscape3.8下载链接&#xff1a;https://docs.qq.com/doc/DUmhZQ1lqTWhuSXJC 1.选中下载好的安装包右键选择“解压到 Cytoscape3.8.0”文件夹 2.打开解压好的”Cytoscape3.8.0“文件夹 3.选中“Cytoscape_3_8_0_windows_64bit.exe“右键以管理员身份运行 4.点击”Download“&…

MP3音乐播放器搜索引擎-在线搜索MP3歌曲实现(一)

首先添加网络模块和播放模块 下载文件&#xff0c;获取响应&#xff0c;错误处理,加上可以进行网络访问 要加上头文件#include<QNetworkAccessManager> 上面头文件发送请求后返回的响应类用下边的头文件 #include<QNetworkReply> 添加多媒体播放列表#include&…

四川天蝶电子商务有限公司带货服务可信吗?

四川天蝶电子商务有限公司&#xff0c;一个充满活力和创新精神的企业&#xff0c;近年来在抖音带货服务领域取得了令人瞩目的成绩。作为一家致力于提供全方位电子商务解决方案的企业&#xff0c;天蝶公司紧跟时代潮流&#xff0c;积极布局抖音电商市场&#xff0c;为商家提供了…

MidTool图文创作-GPT-4与DALL·E 3的结合

GPT-4与DALLE 3的结合 GPT-4是由OpenAI开发的最新一代语言预测模型&#xff0c;它在前代模型的基础上进行了大幅度的改进&#xff0c;不仅在文本生成的连贯性、准确性上有了显著提升&#xff0c;还在理解复杂语境和执行多步骤指令方面表现出了更高的能力。而DALLE 3则是一个创…

python+pytest接口自动化 — 参数关联

什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&#xff0c;此时在某些接口之间可能会存在关联关系。 比如&#xff1a;B接口的某个或某些请求参数是…

华为OD机试 - 两个字符串间的最短路径问题(Java JS Python C)

题目描述 给定两个字符串,分别为字符串 A 与字符串 B。 例如 A字符串为 "ABCABBA",B字符串为 "CBABAC" 可以得到下图 m * n 的二维数组,定义原点为(0,0),终点为(m,n),水平与垂直的每一条边距离为1,映射成坐标系如下图。 从原点 (0,0) 到 (0,A) 为水…

第二百四十三回 再分享一个Json工具

文章目录 1. 概念介绍2. 分析与比较2.1 分析问题2.2 比较差异 3. 使用方法4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"相关的内容&#xff0c;本章回中将再 分享一个Json插件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

阿赵UE学习笔记——6、免费资源获取

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   接下来准备要往UE引擎里面放美术资源了。美术资源可以自己做&#xff0c;不过也有一些免费的资源可以供我们使用的&#xff0c;这里介绍一些获得免费美术资源的方法。 一、Quixel 1、Quixel网站下载 Quixel资源库&#…

计算机网络【Google的TCP BBR拥塞控制算法深度解析】

Google的TCP BBR拥塞控制算法深度解析 宏观背景下的BBR 慢启动、拥塞避免、快速重传、快速恢复&#xff1a; 说实话&#xff0c;这些机制完美适应了1980年代的网络特征&#xff0c;低带宽&#xff0c;浅缓存队列&#xff0c;美好持续到了2000年代。 随后互联网大爆发&#x…

线性代数-第五课,第六课,第七课,第八课

第五课 判断某向量是否可由某向量组线性表示 把向量组组成一个行列式&#xff0c;计算行列式的秩 把所有向量放在一起构成一个行列式&#xff0c;计算行列式的秩 如果两个行列式的秩相等&#xff0c;表示可以线性表示&#xff0c;写答案的格式如下 线性表示&#xff1a;bk…

李沐机器学习系列1--- 线性规划

1 Introduction 1.1 线性回归函数 典型的线性回归函数 f ( x ) w ⃗ ⋅ x ⃗ f(x)\vec{w} \cdot \vec{x} f(x)w ⋅x 现实生活中&#xff0c;简单的线性回归问题很少&#xff0c;这里有一个简单的线性回归问题。房子的价格和房子的面积以及房子的年龄假设成线性关系。 p r …