百无聊赖之JavaEE从入门到放弃(十九)容器之List

news/2024/10/17 16:23:03/

目录

一.容器简介

二.容器的结构

三.Collection接口介绍

四.List接口介绍

五.ArrayList

1.基本操作

2.索引操作

3.ArrayList的并集、交集、差集

六.Vector容器

七.LinkedList


一.容器简介

容器,是用来容纳物体、管理物体。生活中 , 我们会用到各种各样的容器。如锅碗瓢盆、箱子和包等。
程序中的 容器 也有类似的功能,用来容纳和管理数据。
开发和学习中需要时刻和数据打交道,如何组织这些数据是我们编程中重要的内容。 我们一般通过 容器 来容纳和管理数 据。事实上,我们前面所学的数组就是一种容器,可以在其中
放置对象或基本类型数据。
数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从查询效率和类型检查的角度讲,数组是最 好的。
数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。比如:我们在一个用户管理系统中,要把今天注 册的所有用户取出来,那么这样的用户有多少个?我们在写程 序时是无法确定的。因此,在这里就不能使用数组。
基于数组并不能满足我们对于 管理和组织数据的需求 ,所以我们需要一种更强大、更灵活、容量随时可扩的容器来装载我们的对 象。 这就是我们今天要学习的容器,也叫集合 (Collection)

二.容器的结构

单例集合:

双例集合:

三.Collection接口介绍

Collection 表示一组对象,它是集中、收集的意思。 Collection 接口 的两个子接口是 List Set 接口。

 

Collection 接口中定义的方法:
由于 List Set Collection 的子接口,意味着所有 List Set 的实现类都有上面的方法。
JDK8 之后, Collection 接口新增的方法(将在 JDK 新特性和函数式编程中介绍):

四.List接口介绍

List 接口特点
List 是有序、可重复的容器。
有序: 有序 ( 元素存入集合的顺序和取出的顺序一致 ) List 中每个元素都有索引标记。可以根据元素的索引标记(在 List 中的位置)访问 元素,从而精确控制这些元素。
可重复: List 允许加入重复的元素。更确切地讲, List 通常允许满足e1.equals(e2) 的元素重复加入容器。
List 接口中的常用方法
除了 Collection 接口中的方法, List 多了一些跟顺序 ( 索引 ) 有关的方法,参见下表:

五.ArrayList

ArrayList List 接口的实现类。是 List 存储特征的具体实现。
ArrayList 底层是用数组实现的存储。特点:查询效率高,增删效率低,线程不安全。

1.基本操作

public class ArrayListTest {public static void main(String[] args) {//实例化ArrayList容器List<String> list  =new ArrayList<>();//添加元素boolean flag1=list.add("oldlu");boolean flag2=list.add("itbz");boolean flag3=list.add("sxt");boolean flag4=list.add("sxt");System.out.println(flag1+"\t"+flag2+"\t"+fl ag3+"\t"+flag4);//删除元素boolean flag4=list.remove("oldlu");System.out.println(flag4);//获取容器中元素的个数int size=list.size();System.out.println(size);//判断容器是否为空boolean empty=list.isEmpty();        System.out.println(empty);//容器中是否包含指定的元素boolean value=list.contains("itbz");System.out.println(value);        //清空容器list.clear();//将ArrayList转换为数组Object[] objects1=list.toArray();      System.out.println(Arrays.toString(objects1));}
}

2.索引操作

ArrayList可以根据索引位置操作元素。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class ArrayListTest2 {public static void main(String[] args) {//实例化ArrayList容器List<String> list  = new ArrayList<>();//添加元素list.add("oldlu");list.add("itbz");//向指定位置添加元素list.add(0,"sxt");Object[] objects = list.toArray();System.out.println(Arrays.toString(objects));System.out.println("获取元素");String s = list.get(1);System.out.println(s);System.out.println("获取所有元素方式一");//使用普通for循环for(int i=0;i<list.size();i++){System.out.println(list.get(i));}System.out.println("获取所有元素方式二");for(String str: list){System.out.println(str);}System.out.println("元素替换");String k = list.set(1, "kevin");System.out.println(k);System.out.println("根据索引的位置删除元素");String remove = list.remove(1);System.out.println(remove);System.out.println("查找元素在容器中第一次出现的位置");int sxt = list.indexOf("sxt");System.out.println(sxt);System.out.println("查找元素在容器中最后一次出现的位置");list.add("sxt");int sxt1 = list.lastIndexOf("sxt");System.out.println(sxt1);}
}

3.ArrayList的并集、交集、差集

import java.util.ArrayList;
import java.util.List;public class ArrayListTest3 {public static void main(String[] args) {//并集操作:将另一个容器中的元素添加到当前容器中List<String> a  = new ArrayList<>();a.add("a");a.add("b");a.add("c");List<String> b = new ArrayList<>();b.add("a");b.add("b");b.add("c");//a并集ba.addAll(b);for(String str :a){System.out.println(str);}System.out.println("------------------");//交集操作:保留相同的,删除不同的List<String> a1  = new ArrayList<>();a1.add("a");a1.add("b");a1.add("c");List<String> b1 = new ArrayList<>();b1.add("a");b1.add("d");b1.add("e");//交集操作a1.retainAll(b1);for(String str :a1){System.out.println(str);}System.out.println("-------------");//差集操作:保留不同的,删除相同的List<String> a2  = new ArrayList<>();a2.add("a");a2.add("b");a2.add("c");List<String> b2= new ArrayList<>();b2.add("b");b2.add("c");b2.add("d");a2.removeAll(b2);for(String str :a2){System.out.println(str);}}
}

 ArrayList底层是用数组实现的存储。

六.Vector容器

Vector 容器的基本使用
Vector 底层是用数组实现的,相关的方法都加了同步检查,因此 线程安全 , 效率低 。比如, indexOf 方法就增加了 synchronized 同步 标记。

Vector 的使用
Vector 的使用与 ArrayList 是相同的,因为他们都实现了 List 接口,对 List 接口中的抽象方法做了具体实现。

import java.util.List;
import java.util.Vector;public class VectorTest {public static void main(String[] args) {//实例化Vector容器List<String> v = new Vector<>();//添加v.add("a");v.add("b");v.add("c");v.add("a");//遍历Vector容器for(int i=0;i<v.size();i++){System.out.println(v.get(i));}}
}

七.LinkedList

容器介绍

LinkedList 底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。所以,从双向链表中 的任意一个节点开始,都可以很方便地找到所有节点。
LinkedList 的存储结构图

每个节点都应该有 3 部分内容:
如何选用 ArrayList LinkedList Vector?
  • 需要线程安全时,用Vector
  • 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)
  • 不存在线程安全问题时,增加或删除元素较多用LinkedList
LinkedList 容器的使用( List 标准)
LinkedList 实现了 List 接口,所以 LinkedList 是具备 List 的存储特征的( 有序,元素有重复 )
import java.util.LinkedList;
import java.util.List;public class LinkedListTest {public static void main(String[] args) {//实例化LinkedList容器List<String> list = new LinkedList<>();//添加元素boolean a = list.add("a");boolean b = list.add("b");boolean c = list.add("c");list.add(3,"a");System.out.println(a+"\t"+b+"\t"+c);//获取容器中的所有元素for(int i=0;i<list.size();i++){System.out.println(list.get(i));}}
}

 LinkedList容器的使用(非List标准)

import java.util.LinkedList;public class LinkedListTest2 {public static void main(String[] args) {//示例化LinkedList容器LinkedList<String> list = new LinkedList<>();//将指定元素插入到开头list.addFirst("a");list.addFirst("b");list.addFirst("c");for(String str:list){System.out.println(str);}System.out.println("--------------------");//将指定元素插入到结尾LinkedList<String> list2 = new LinkedList<>();list2.addLast("a");list2.addLast("b");list2.addLast("c");for(String str:list2){System.out.println(str);}System.out.println("--------------------");//返回此链表的第一个元素System.out.println(list2.getFirst());//返回此链表的最后一个元素System.out.println(list2.getLast());System.out.println("--------------------");//移除此链表中的第一个元素,并返回这个元素/*String s = list2.removeFirst();System.out.println(s+" S");*///从此链表所表示的堆栈处弹出一个元素,等效于removeFirstSystem.out.println(list2.pop()+" S");//移除此链表中的最后一个元素,并返回这个元素String s1 = list2.removeLast();System.out.println(s1+" S1");//将元素推入此链表所表示的堆栈  这个等效于addFisrt(E e)list2.push("e");for(String str:list2){System.out.println(str);}}
}


http://www.ppmy.cn/news/1341772.html

相关文章

计算机网络(第六版)复习提纲23

第五章&#xff1a;运输层 SS5.1 运输层协议概述 1 进程之间的通信 A 运输层要实现复用和分用&#xff1a; 复用&#xff1a;发送方不同进程都能使用用一个运输层协议传送数据 分用&#xff1a;接收方的运输层在剥去报文首部后能将这些数据交付给正确的应用 B 运输层提供应用进…

Java设计模式 – 四大类型

设计模式 – 四大类型 创建型模式结构型模式行为型模式J2EE模式 设计模式&#xff08;Design pattern&#xff09;是重构解决方案 根据书Design Patterns – Elements of Reusable Object-Oriented Software&#xff08;中文译名&#xff1a;设计模式 – 可复用的面向对象软件元…

91 C++对象模型探索。数据语义学 - RTTI运行时类型识别回顾 与 存储位置介绍

一&#xff0c;RTTI 运行时类型识别&#xff0c;简单回顾 C运行时类型识别RTTI&#xff0c;要求父类这种必须 至少有一个虚函数&#xff0c;如果父类中没有虚函数&#xff0c;那么得到的RTTI就不准确&#xff1b; RTTI就可以在执行期间查询一个多态指针&#xff0c;或者多态应…

前端工程化之:webpack1-12(常用扩展)

目录 前言 一、CleanWebpackPlugin 二、HtmlWebpackPlugin 三、CopyPlugin 四、webpack-dev-server 五 、file-loader 六、url-loader 七、路径问题 前言 由于 webpack 、 webpack-cli 、 webpack-dev-server 会存在版本不兼容问题&#xff0c;所以这里使用的版本如下&…

【前端工程化】环境搭建 nodejs npm

文章目录 前端工程化是什么&#xff1f;前端工程化实现技术栈前端工程化环境搭建 &#xff1a;什么是Nodejs如何安装nodejsnpm 配置和使用npm 介绍npm 安装和配置npm 常用命令 总结 前端工程化是什么&#xff1f; 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块…

2024年R1快开门式压力容器操作证考试题库及R1快开门式压力容器操作试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年R1快开门式压力容器操作证考试题库及R1快开门式压力容器操作试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人…

wangEditor v4的简单使用

当前文档是 wangEditor v4 版本的。 wangEditor v5 已经正式发布&#xff0c;可参考文档。 v5 发布之后&#xff0c;v4 将不再开发新功能。 介绍 English documentation wangEditor4 —— 轻量级 web 富文本编辑器&#xff0c;配置方便&#xff0c;使用简单。 官网&#…

二叉树可视化

二叉树可视化 运行演示代码和程序已上传二叉树知识平衡二叉树红黑树最优二叉搜索树哈夫曼树KD树B树和B树 参考 运行演示 学习二叉树总是脑补图像&#xff0c;实在是恶心&#xff0c;就想写一个能可视化的二叉树&#xff0c;结果没控制好&#xff0c;功能越想越多&#xff0c;先…