day18 java ​​​​​​​集合Collection的List和Set

Collection分成List和Set|------Collection|-------List : 存储的元素是有序的并且可以重复|--------ArrayList|--------LinkedList|--------Vector|-------Set :  存储的元素是无序的并且不可以重复|--------HashSet|--------LinkedHashSet|--------TreeSet

List接口

List常用的实现类有 : ArrayList LinkedList Vector

1.List是单列集合

2.List继承了Collection接口

3.List中存放的元素是有序可重复的

ArrayList

[面试题]ArrayList的底实现?当我们通过ArrayList的空参构造器创建对象时底层会创建一个长度为0的Object[]。当我们第一次向该对象中添加元素时底层会扩容 扩容的长度为10(原来的长度是0).当我们向该对象中添加第11个元素时底层会再次扩容扩容为原来的1.5倍。并且将原来的数组中的元素
copy到当前数组中。
Collection c = new ArrayList();
List list = new ArrayList();
ArrayList list = new ArrayList(100);//可以指定初始化时的数组的长度。

方法API看上一章day17

LinkedList

说明:LinkedList底层是一个双向链表

ArrayList和LinkedList如何选择?

如果对集合中的数据只是查询或修改比较多那么可以选择ArrayList 如果对集合中的数据增,删的操作比较多那么可以使用LinkedList

[面试题] ArrayList和LinkedList的区别?

ArrayList底层是数组,LinkedList底层是双向链表

@Testpublic void test2(){LinkedList list = new LinkedList();list.add("a");list.add("b");list.add("c");//在链表的第一个位置添加元素list.addFirst("e");System.out.println(list);//在链表的最后一个位置添加元素list.addLast("f");System.out.println(list);//删除链表中的最后一个元素list.removeLast();System.out.println(list);//删除链表中的第一个元素list.removeFirst();System.out.println(list);}
队列:Queue queue = new LinkedList();
双端队列:Deque d = new LinkedList();

Vector

    1.Vector是List接口的实现类2.Vector的底层是数组(Object[])[面试题] ArrayList和Vector的区别?1.ArrayList和Vector底层都是Object[]2.ArrayList是线程不安全的,Vector是线程安全的。3.ArrayList空参构造器创建的是一个长度为0的数组,Vector空参构造器创建的是一个长度为10的数组ArrayList扩容为原来的1.5倍。Vector默认扩容为原来的2倍(也可以指定扩容大小)
/*第1个参数 :数组初始化长度第2个参数 : 指定数组扩容的大小*/
Vector vector = new Vector(10,20);

Stack存储的数据的特点: 先进后出说明 :Stack是Vector的子类
Stack s = new Stack();

Set

1.Set继承了Collection接口
2.Set是单列集合
3.Set存储的元素无序并且不可以重复无序性 :是因为存放的元素的位置是根据hash值计算出的-计算出的值(0 到 数组的长度-1)没有序不可重复 :是通过equals方法进行比较的结果。如果为true说明重复如果为false说明不重复。
4.Set的元素的遍历Iterator和增强for循环
5.Set中并没有再增加其它方法
5.Set的主要实现类 :HashSet LinkedHashSet TreeSet

HashSet

HashSet的底层是Hash表(数组 + 链表 + 红黑树)注意:HashSet中如果存放的是自定义类的对象那么该对象所属的类必须重写equals和hashCode方法。
思考? 如何要数据不重复得怎么做 - HashSet?(类散列表)当我们向集合中存放数据a时会先调用a的hashCode方法得出一个在数组中存放的位置如果该位置没有其它元素则直接放入到该位置。如果该位置已经存在了其它元素b时。那么会调用a的equals方法和b进行比较,如果返回的结果为false说明a和b不一样则以链表的形式存式。如果返回的结果为true则说明a和b是一样的则不能放入。
当我们向Set中放数据  第1步是找位置  第2步是比较内容

LinkedHashSet

LinkedHashSet :LinkedHashSet是HashSet的子类。LinkedHashSet和HashSet的底层实现是一样的。只不过LinkedHashSet的底层维护了一张链表(双向链表) 通过该链表就可以按照添加的元素顺序进行遍历

TreeSet

TreeSet :1.TreeSet底层是红黑树2.TreeSet的作用是用来对元素进行排序3.TreeSet中存放的元素的类型必须是同一类型4.TreeSet的排序-自然排序 vs 定制排序
public class SetTest3 {@Testpublic void test(){TreeSet<String> set = new TreeSet<>();set.add("c");set.add("a");set.add("b");set.add("d");System.out.println(set);}@Testpublic void test2(){TreeSet set = new TreeSet();set.add("c");set.add(1);set.add(2);set.add("d");System.out.println(set);}/*自然排序 - 自定义的类实现Comparable接口*/@Testpublic void test3(){TreeSet<Student> set = new TreeSet<>();set.add(new Student("c",1));set.add(new Student("d",5));set.add(new Student("a",3));set.add(new Student("b",2));set.add(new Student("k",2));set.add(new Student("f",2));System.out.println(set);}/*定制排序 - 将Comparator接口的实现类的对象传到TreeSet的构造器即可*/@Testpublic void test4(){//如果使用定制排序那么自定义类就不需要实现Comparable接口//如果两种都有 --- 定制排序生效TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.name.compareTo(o2.name);}});set.add(new Student("c",1));set.add(new Student("d",5));set.add(new Student("a",3));set.add(new Student("b",2));set.add(new Student("k",2));set.add(new Student("f",2));System.out.println(set);}
}class Student implements Comparable<Student>{String name;int id;public Student(String name, int id) {this.name = name;this.id = id;}@Overridepublic String toString() {return id + " " + name;}/*按照id排序 如果id相同再按照name排序。@Overridepublic int compareTo(Student o) {int cid = this.id - o.id;if (cid == 0){return this.name.compareTo(o.name);}return cid;}*/@Overridepublic int compareTo(Student o) {return this.id - o.id;}
}

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

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

相关文章

java面向对象.day28(接口的定义与实现)

Java接口&#xff08;Interface&#xff09;是Java编程语言中的一个重要概念&#xff0c;它定义了一个类应该具备的方法&#xff0c;但不提供具体的实现。接口可以被看作是一种特殊的抽象类&#xff0c;其中所有的方法都是抽象的。一个类可以实现&#xff08;implements&#x…

模块三:二分——69.x的平方根

文章目录 题目描述算法原理解法一&#xff1a;暴力查找解法二&#xff1a;二分查找 代码实现暴力查找CJava 题目描述 题目链接&#xff1a;69.x的平方根 算法原理 解法一&#xff1a;暴力查找 依次枚举 [0, x] 之间的所有数 i &#xff08;这⾥没有必要研究是否枚举到 x /…

【后端】python2和python3的安装与配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、python是什么二、python环境的安装与配置Python 2的安装与配置Python 3的安装与配置注意事项 三、总结 前言 随着开发语言及人工智能工具的普及&#xff0…

洗地机哪个牌子好?推荐这四款热销品牌

随着科技的不断发展&#xff0c;洗地机已经成为了家庭中不可或缺的智能家居设备。它们能够帮助我们轻松地完成地面清洁工作&#xff0c;节省时间和精力。但是&#xff0c;面对市场上琳琅满目的洗地机品牌&#xff0c;我们该如何选择呢&#xff1f;本文将为大家介绍四大口碑洗地…

Jackson 2.x 系列【31】Spring Boot 集成之字典翻译

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

使用PlantUML绘制活动图、泳道图

最近在学PlantUML 太漂亮了 给大家欣赏一下 我也记录一下 startuml |使用前| start :用户打开旅游App; |#LightSkyBlue|使用后| :用户浏览旅游信息; |#AntiqueWhite|登机前| :用户办理登机手续; :系统生成登机牌; |使用前| :用户到达机场; |登机前| :用户通过安检; |#Light…

2024华中杯A题|太阳能路灯光伏板的朝向设计问题(思路、代码.....)

太阳能路灯由太阳能电池板组件部分(包括支架)、LED灯头、控制箱(包含控制器、蓄电池)、市电辅助器和灯杆几部分构成。太阳能电池板通过支架固定在灯杆上端。太阳能电池板也叫光伏板,它利用光伏效应接收太阳辐射能并转化为电能输出,经过充放电控制器储存在蓄电池中。太阳能…

使用vue3+ts+vite从零开始搭建bolg(三)(持续更新中)

三、axios&#xff0c;API和路由封装 3.1 axios二次封装 pnpm i axios在src下建立如图文件夹 在request下配置请求拦截器&#xff0c;响应拦截器 import axios from axios import { ElMessage } from element-pluslet request axios.create({baseURL: import.meta.env.VITE…

近场到远场转换的脚本实现(fdtd)

FDTD&#xff08;Finite Difference Time Domain&#xff09;是一种用于模拟电磁场行为的数值方法。在FDTD模拟中&#xff0c;近场通常指的是靠近源或观察点的区域&#xff0c;而远场通常指的是远离源或观察点的区域。实现近场到远场的转换&#xff0c;通常涉及到从模拟区域中提…

DFS与回溯专题:路径总和问题

DFS与回溯专题&#xff1a;路径总和问题 一、路径总和 题目链接&#xff1a; 112.路径总和 题目描述 代码思路 对二叉树进行dfs搜索&#xff0c;递归计算每条路径的节点值之和&#xff0c;当某个节点的左右子节点都为空时&#xff0c;说明已经搜索完成某一条路径&#xff0…

牛客NC195 二叉树的直径【simple DFS C++ / Java /Go/ PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/15f977cedc5a4ffa8f03a3433d18650d 思路 最长路径有两种情况&#xff1a; 1.最长条路径经过根节点&#xff0c;那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。 2.最长路径没有经过根节点&#xf…

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

Vue3的监听属性watch和计算属性computed

监听属性watch 计算属性computed 一、监听属性watch watch 的第一个参数可以是不同形式的“数据源&#xff0c;watch 可以监听以下几种数据&#xff1a; 一个 ref (包括计算属性)、 一个响应式对象、 一个 getter 函数、 或多个数据源组成的数组 watch 的参数:监视的回调&…

企业数字化转型

企业数字化更多是业务数字化&#xff0c;是“信息化”的更新升级&#xff0c;和信息化有较大差别。 企业信息化专注于企业信息的记录&#xff0c;“无纸化办公”是其明显特征。企业信息化不改造业务&#xff0c;只是业务的计算机方式实现&#xff0c;不对企业内部流程或组织做…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序等等&#xff0c;对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中…

C#:用 BigInteger 计算 斐波那契数列

using System.Numerics; 计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;不受长整型位数限制。 编写 fibonacci.cs 如下 // C# program for Fibonacci Series // using Dynamic Programming using System; using System.Numerics;class fibona…

【C++语言】字符串String练习题

题目连接&#xff1a; 仅仅反转字母 1.仅仅反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s …

Linux学习(补充部分)

关键字 goto关键字 goto 是一个在编程语言中用于控制流的关键字,它允许程序跳转到代码中的标记处。尽管在一些编程规范中被视为不良实践,但在某些情况下,goto 仍然可以是一种有用的工具。 在 C、C++、Python、以及一些其他编程语言中,goto 的基本语法如下: goto label;…

STM32单片机C语言模块化编程实战:按键控制LED灯并串口打印详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 虽然这里演示的是STM32F407&#xff0c;但是ST…

INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN

联表查询是指在数据库中同时查询多个表&#xff0c;并通过它们之间的关联条件将结果合并在一起。这通常通过 SQL 中的 JOIN 操作来实现。常见的 JOIN 类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。 让我们通过一个示例来说明联表查询的基本用法。假设有两个表&a…