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

news/2024/9/22 15:31:04/

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底层是双向链表

java">@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 定制排序
java">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.ppmy.cn/news/1446284.html

相关文章

跟我学C++中级篇——内联

一、内联函数 内联函数的定义有各种形式&#xff0c;这里只提一种百度百科上的定义&#xff1a;“在计算机科学中&#xff0c;内联函数&#xff08;有时称作在线函数或编译时期展开函数&#xff09;是一种编程语言结构&#xff0c;用来建议编译器对一些特殊函数进行内联扩展&a…

XiaodiSec day038 Learn Note 小迪安全学习笔记

XiaodiSec day038 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 38 XSS XSS 的最后一节 结合 ctfshow 的题 316 - 331 关 16 题捏 开始 ctfshow 启动 使用 onerror 实践绕过对 script 的过滤 onload 时间能自动载入&#xff0c;加载自动执行 …

asp.net core webapi 写一个可以上传图片的接口,并把图片转成base64

asp.net core webapi 写一个可以上传图片的接口&#xff0c;并把图片转成base64 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using System; using System.IO; using System.Threading.Tasks;namespace YourNames…

论文阅读之MMSD2.0: Towards a Reliable Multi-modal Sarcasm Detection System

文章目录 论文地址主要内容主要贡献模型图技术细节数据集改进多视图CLIP框架文本视图图像视图图像-文本交互视图 实验结果 论文地址 https://arxiv.org/pdf/2307.07135 主要内容 这篇文章介绍了一个名为MMSD2.0的多模态讽刺检测系统的构建&#xff0c;旨在提高现有讽刺检测系…

WEB攻防-PHP特性-piwigoCMS审计实例

前置知识&#xff1a;PHP函数缺陷 测试环境 &#xff1a;piwigo CMS 漏洞URL&#xff1a; 漏洞文件位置&#xff1a;\include \functions_rate.inc.php 漏洞产生入口文件&#xff1a;/picture.php picture.php中接受了一个GET方法action参数&#xff0c;作为switch...case.…

OGG extract进程占据大量虚拟内存导致服务器内存异常增长分析

现象 oracle服务器一节点内存&#xff0c;一个月来持续升高&#xff0c;近一月上涨10%左右。 问题分析 OS内存使用情况 使用内存最大的10个进程如下&#xff0c;PID为279417占用最大的内存。 查询279417&#xff0c;发现是ogg相关进程。 发现ogg的extract进程占用了大量的虚拟内…

Python+Selenium基于PO模式的Web自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供…

SAP PP学习笔记07 - 作业手顺(工艺路线Routing)

上一章讲了BOM的相关知识。 SAP PP学习笔记07 - 简单BOM&#xff0c;派生BOM&#xff0c;多重BOM&#xff0c;批量修改工具 CEWB_sap半成品有多个bom-CSDN博客 本章来讲作业手顺&#xff08;工艺路线Routing&#xff09;的相关知识。 1&#xff0c;作业手顺(工艺路线 Routing…