IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Java学习第十八天——集合List和链表 -> 正文阅读

[数据结构与算法]Java学习第十八天——集合List和链表

1 概述

Java集合是使程序能够存储和操纵元素不固定的一组数据。 所有Java集合类都位于java.util包中。

【问】:之前我们需要把多个元素放到一起的时候,使用的是数组。那么为何还要提供Java集合工具类呢??
我们通过对比数组和Java集合工具类来解释Java集合工具类的必要性。

数组

集合

长度固定

长度不固定

存放任意类型

不能存放基本数据类型,只能存放对象的引用


注意:如果集合中存放基本类型,一定要将其 “装箱”成对应的”基本类型包装类”。

2 Collection

2.1 继承体系

Java的集合类主要由两个接口派生而出:Collection和Map。Collection和Map是Java结合框架的根接口,这两个接口又包含了一些子接口或实现类。

层次结构如图所示

Java集合类有清晰的继承关系,有很多子接口和实现类。但是,并不是所有子接口或实现类都是最常用的。

下面我们列举出最常用的几个子接口和实现类:

Collection ——> List ——> ArrayList类

Collection ——> List ——> LinkedList类

Collection ——> Set ——> HashSet类

Collection ——> Set ——> SortedSet接口 ——> TreeSet类

Map ——> HashMap类

Map ——> SortedMap ——> TreeMap类

?2.2 常用方法

?2.3 使用方法

?代码实现?? ?

? ? ? ? ?// 创建集合对象
?? ??? ?Collection c1 = new ArrayList<>();
?? ??? ?// 判断是否为空,即个数是否为0
?? ??? ?System.out.println(c1.isEmpty());
?? ??? ?// 集合中是不能保存基本类型的,需要转换为对应的包装类才可以
?? ??? ?// 这里会进行自动装箱为Integer类型,然后发生多态转型为Object类型进行存储
?? ??? ?c1.add(123);
?? ??? ?c1.add(new Integer(1));
?? ??? ?c1.add(new Collection_01());
?? ??? ?// 个数
?? ??? ?System.out.println(c1.size());
?? ??? ?System.out.println(c1.isEmpty());
?? ??? ?// 删除,会调用要删除的元素的equals方法,但是Integer覆写了,所以可以把1删除掉
?? ??? ?c1.remove(1);
?? ??? ?A a = new A("张三");
?? ??? ?A a1 = new A("张三");
?? ??? ?c1.add(a);
?? ??? ?// 所以使用集合保存自定义类型的时候,要注意是否要覆写equals方法,定义怎么算相等
?? ??? ?c1.remove(a1);
?? ??? ?// 把集合转换为数组
?? ??? ?Object[] arr = c1.toArray();
?? ??? ?for (Object object : arr) {
?? ??? ??? ?System.out.println(object);
?? ??? ?}
?? ??? ?// 清空集合
?? ??? ?c1.clear();
?? ??? ?System.out.println(c1.size());

2.4 注意Contains和Remove

Contains(数据) : 判断集合中是否包含某个元素

Remove(数据 ) : 删除指定元素

两个方法底层都会自动调用该对象的equals方法

因为不管是判断是否包含还是删除,都要先找到这个数据,而找到只能比较

但是集合中保存的都是引用类型,所以比较只能使用equals方法

所以如果存储的是自定义类型,就要考虑equals方法的覆写问题

3 Integer

3.1 概述

?在面向对象的编程中,迭代器模式是一种设计模式,是一种最简单也最常见的设计模式
?* 它可以让用户透过特定的接口寻访容器中的每一个元素,而不用了解底层的实现
?* 获取该集合的迭代器对象
?* Iterator it=集合对象.iterator();
?* ? ? ? ? ? ? ? 三个方法:
?* ? ? ? ? ? ? ? ? ? ? ? 1 boolean hasNext():判断下面有没有元素,如果有就返回true,没有就返回false
?* ? ? ? ? ? ? ? ? ? ? ? 2 E next():获取下一个元素,并指向下一个元素
?* ? ? ? ? ? ? ? ? ? ? ? 3 remove(): 删除当前指向的元素
?* ? ? ? ? ? ? ?三个方法的使用步骤就是1,2,3,按照这个顺序调用
?* ? 注意 : 迭代器一旦创建,集合中就不能添加和删除元素(长度就不能更改了)
?* ? ? ? ? ? ?如果添加或者删除了元素,那么迭代器必须重新生成
?* ? 增强for循环:就是为了让用iterator循环访问的方式简单,写起来更方便,当然功能不太全,比如删除时还是要用iterator来删除

?3.2 常用方法

?3.3 使用方法

代码实现?? ?

? ? ? ? Collection c1=new LinkedList();
?? ??? ?c1.add(1);
?? ??? ?c1.add("abc");
?? ??? ?//判断是否包含
?? ??? ?System.out.println(c1.contains(1));
?? ??? ?//1 创建迭代器
?? ??? ?Iterator it=c1.iterator();
?? ??? ?//遍历 ?判断下面是否有元素
?? ??? ?while(it.hasNext()){
?? ??? ??? ?//获取并指向下一个元素
?? ??? ??? ?Object obj=it.next();
?? ??? ??? ?System.out.println(obj);
?? ??? ?}
?? ??? ?//使用完之后想要再次使用需要重新创建
?? ??? ?it=c1.iterator();
?? ??? ?//迭代器创建之后不能添加和删除,必须重新生成迭代器
?? ??? ?c1.add(2);
?? ??? ?c1.add(3);
?? ??? ?c1.remove(1);
?? ??? ?it=c1.iterator();
?? ??? ?while (it.hasNext()) {
?? ??? ??? ?//获取并指向下一个元素
?? ??? ??? ?Object obj=it.next();
?? ??? ??? ?System.out.println(obj);
?? ??? ??? ?//使用迭代器的时候不能更改集合个数,所以删除数据的时候不能使用集合的删除,应该使用迭代器的删除
?? ??? ??? ?//c1.remove(obj);
?? ??? ??? ?it.remove();
?? ??? ?}
?? ??? ?System.out.println(c1.size()+"-----");

4 List

4.1 概述

?* List特点: 有序,可重复
?* ? ? ? ? ? ? ? 有序: 添加顺序和取出顺序是一致的
?* ? ? ? ? ? ? ? 可重复: 就是可以有重复的数据
?* ArrayList: 底层是个Object数组,随机查询和更改效率高,但随机添加和删除效率低
?* LinkedList: 底层是一个双向链表,随机查询更该效率低,但随机添加和删除效率高

4.2 ArrayList

4.2.1概述

? ?ArrayList底层是数组,下标从0开始
?* ? ? ? ? ? ? ? ? 默认初始化容量为10,扩大容量为原始容量的1.5倍
?* ? ? ? ? ? ? ? ? 并且默认容量是第一次添加数据的时候设置的
?* ? ? ? ? ? ?也就是说,我们new ArrayList()的时候,数组长度是为0的
?* ? ? ? ? ? ? ? ? 1.5倍: 长度+长度>>1 ? ?

? ? ? ?

?4.2.2基本使用

? ? ? ? //创建对象
?? ??? ?//Vector已经过时了,ArrayList是Vector的升级版,Vector是线程安全,而ArrayList是非线程安全
?? ??? ?List list=new ArrayList();
?? ??? ?list.add(100);
?? ??? ?list.add(123);
?? ??? ?//[100,123]覆写了toString方法
?? ??? ?System.out.println(list);

4.2.3 常用方法

? ? ? ? ?//add(E e): 尾部添加
?? ??? ?//add(int index,E e): 添加到指定位置
?? ??? ?//set(int index,E e): 更改指定位置上的元素值
?? ??? ?//remove(Object object): 根据元素内容删除
?? ??? ?//remove(int index): 根据索引删除
?? ??? ?//get(int index): 获取指定位置的数据?

4.2.4 遍历

? ? 代码实现? ??

? ? ? ? ?//传统for遍历
?? ??? ?for (int i = 0; i < list.size(); i++) {
?? ??? ??? ?System.out.println(list.get(i));
?? ??? ?}
?? ??? ?//foreach遍历
?? ??? ?for (Object object:list) {
?? ??? ??? ?System.out.println(object);
?? ??? ?}
?? ??? ?//迭代器遍历
?? ??? ?Iterator it=list.iterator();
?? ??? ?while(it.hasNext()){
?? ??? ??? ?System.out.println(it.next());

4.3 LinkedList

?4.3.1 基本使用及方法

? ? 和 ArrayList操作 一样

4.3.2 底层实现

4.3.2.1 Node节点类

?链表: 保存的都是节点,每个节点都有三个属性,分别是:?添加的数据,上一个节点引用,下一个节点引用

?4.3.2.2LinkedList类

?4.3.2.3 add方法实现

?

?4.3.2.4 Get方法实现

?

?

?获取数据

Get方法 只是模拟了下标获取数据的方式,本质就是遍历,从头挨个去找

所以这可以理解为 并不是下标,只是决定了循环次数

而 ArrayList的get才是根据下标获取

?

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:11:28  更:2021-10-22 11:13:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:51:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码