Java集合详解(List和Set)

您所在的位置:网站首页 java接口list Java集合详解(List和Set)

Java集合详解(List和Set)

2024-07-12 14:41:01| 来源: 网络整理| 查看: 265

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步! 吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…

文章目录 一. 集合的诞生二. 集合的家族

一. 集合的诞生

集合是为了弥补数组的不足而存在。

集合相对于数组优势在于:a.集合的长度可以动态改变;b.集合中能够存放多种类型的数据。

在这里插入图片描述

二. 集合的家族

Collection接口是所有单值集合的父接口

List接口与Set接口的区别:

在这里插入图片描述

一个集合类的对象就一个集合。

Collection中常用的方法

方法名描述add(E e)确保此 collection 包含指定的元素(可选操作)。clear()移除此 collection 中的所有元素(可选操作)。contains(Object o)如果此 collection 包含指定的元素,则返回trueequals(Object o)比较此 collection 与指定对象是否相等isEmpty()如果此 collection 不包含元素,则返回true。iterator()返回在此 collection 的元素上进行迭代的迭代器。remove(Object o)从此 collection 中移除指定元素的单个实例,如果存在的话。size()返回此 collection 中的元素数。toArray()返回包含此 collection 中所有元素的数组。

1、List集合有序,可重复)

ArrayList: 和 LinkedList:

①ArrayList: 底层数据结构是数组,查询快,增删慢。

②LinkedList: 底层数据结构是链表,查询慢,增删快。

两者共同缺点: 线程不安全,效率高

Vector:

①优点: 底层数据结构是数组,查询快,增删慢。

②缺点: 线程安全,效率低

小结:底层数据结构特点决定其性能特性

2、Set集合—(无序,唯一)

Set接口是Collection的子接口,表示元素无序且不可重复的集合。

在这里插入图片描述 (1)HashSet:

底层数据结构是哈希表。(无序,唯一)

如何来保证元素唯一性?

1、依赖两个方法:hashCode()和equals() 2、HashSet底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。

具体实现唯一性的比较过程:

1.存储元素时首先会使用hash()算法函数生成一个int类型hashCode散列值,然后已经的所存储的元素的hashCode值比较,如果hashCode不相等,肯定是不同的对象。 2.hashCode值相同,再比较equals方法。 3.equals相同,对象相同。(则无需储存)

(2)LinkedHashSet:

底层数据结构是链表和哈希表 (FIFO插入有序,唯一) 1.由链表保证元素有序 2.由哈希表保证元素唯一 LinkedHashSet底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。

(3)TreeSet:

底层数据结构是红黑树。(唯一,有序)

如何保证元素排序的呢?

1、自然排序

2、比较器排序

如何保证元素唯一性的呢?

1、根据比较的返回值是否是0来决定

2、TreeSet底层数据结构采用红黑树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造)

3、自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;

4、比较器排序要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;

TreeSet实践案例

①在元素类中定义排序规则

import java.util.TreeSet; //创建学生类实践 public class Student implements Comparable { private String stuNum; private String stuName; private String stuSex; private int stuAge; public Student(String stuNum, String stuName, String stuSex, int stuAge) { this.stuNum = stuNum; this.stuName = stuName; this.stuSex = stuSex; this.stuAge = stuAge; } public String getStuNum() { return stuNum; } public void setStuNum(String stuNum) { this.stuNum = stuNum; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuSex() { return stuSex; } public void setStuSex(String stuSex) { this.stuSex = stuSex; } public int getStuAge() { return stuAge; } public void setStuAge(int stuAge) { this.stuAge = stuAge; } @Override public String toString() { return "Student{" + "编号'" + stuNum + '\'' + ", 姓名='" + stuName + '\'' + ", 性别='" + stuSex + '\'' + ", 年龄=" + stuAge + '}'; } //重写里面的compareTo()方法 @Override public int compareTo(Student o) { // compareTo 的参数o表示集合中已经存在的元素 return this.stuAge - o.stuAge; } //案例 public static void main(String[] args) { //TreeSet ts = new TreeSet(); TreeSet ts =new TreeSet(); Student s1 = new Student("10001", "Lilei", "M", 20); Student s2 = new Student("10002", "HanMeimei", "F", 19); Student s3 = new Student("10003", "Lily", "F", 21); Student s4 = new Student("10004", "Tom", "M", 22); ts.add(s1); // [s1] ts.add(s2); // [s2,s1] ts.add(s3); // [s2,s1,s3] ts.add(s4); // [s2,s1,s3,s4] System.out.println(ts); } } 比较器中我们按年龄排序,输出结果也是按年龄排序 [Student{编号'10002', 姓名='HanMeimei', 性别='F', 年龄=19}, Student{编号'10001', 姓名='Lilei', 性别='M', 年龄=20}, Student{编号'10003', 姓名='Lily', 性别='F', 年龄=21}, Student{编号'10004', 姓名='Tom', 性别='M', 年龄=22}]

给TreeSet集合指定比较器(未继承接口)

import java.util.Comparator; import java.util.TreeSet; public class Student { private String stuNum; private String stuName; private String stuSex; private int stuAge; public Student(String stuNum, String stuName, String stuSex, int stuAge) { this.stuNum = stuNum; this.stuName = stuName; this.stuSex = stuSex; this.stuAge = stuAge; } public String getStuNum() { return stuNum; } public void setStuNum(String stuNum) { this.stuNum = stuNum; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuSex() { return stuSex; } public void setStuSex(String stuSex) { this.stuSex = stuSex; } public int getStuAge() { return stuAge; } public void setStuAge(int stuAge) { this.stuAge = stuAge; } @Override public String toString() { return "Student{" + "编号'" + stuNum + '\'' + ", 姓名='" + stuName + '\'' + ", 性别='" + stuSex + '\'' + ", 年龄=" + stuAge + '}'; } //案例 public static void main(String[] args) { //切记这里是Comparator Comparator cptr = new Comparator() { //o1表示向集合中新增的元素,o2表示集合中已经存在的元素 public int compare(Student o1, Student o2) { int i = o1.getStuAge() - o2.getStuAge(); return i; } }; TreeSet ts = new TreeSet(cptr); Student s1 = new Student("10001", "Lilei", "M", 20); Student s2 = new Student("10002", "HanMeimei", "F", 19); Student s3 = new Student("10003", "Lily", "F", 21); Student s4 = new Student("10004", "Tom", "M", 22); ts.add(s1); // [s1] ts.add(s2); // [s2,s1] ts.add(s3); // [s2,s1,s3] ts.add(s4); // [s2,s1,s3,s4] System.out.println(ts); } } 输出结果 [Student{编号'10002', 姓名='HanMeimei', 性别='F', 年龄=19}, Student{编号'10001', 姓名='Lilei', 性别='M', 年龄=20}, Student{编号'10003', 姓名='Lily', 性别='F', 年龄=21}, Student{编号'10004', 姓名='Tom', 性别='M', 年龄=22}]

注意:小编我在编辑过程将上例中Comparator打错成Comparable导致自定义程序无法出结果,希望大家用比较器也多注意。

补充:Comparable和Comparator区别

①对于Comparable接口来说,被比较对象所属的类需要直接实现Comparable接口,实现该接口的类被赋予一个自然顺序,而且该自然顺序只有一个,而Comparator是一个比较器接口,被比较对象所属的类不需要直接实现该接口,可以单独写一个比较器类实现该接口,作为比较对象的一个比较器,对于一个类来说,可以实现多个比较器。②Comparator可以选择对null进行比较,而Comparable不可以。主要是因为Comparator的比较对象都是compare方法的参数,而Comparable的比较方法compareTo方法需要对象来调用,而对象为null时(null.compareTo(obj)),会出现异常。

Lambda表达式

是JDK1.8新增的表达式语法,实际上就是一个语法糖,用于对接口中的方法进行实现。

代码修改对比

//切记这里是Comparator Comparator cptr = new Comparator() { //o1表示向集合中新增的元素,o2表示集合中已经存在的元素 public int compare(Student o1, Student o2) { int i = o1.getStuAge() - o2.getStuAge(); return i; } }; TreeSet ts = new TreeSet(cptr);

Lambda表达式的应用

//Lambda表达式 TreeSet ts2 = new TreeSet((o1,o2)->o1.getStuAge()-o2.getStuAge());

输出结果一样,但是格式更加简洁

May you find the work you are willing to devote to and love it.

非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

2020.03.09 愿你们奔赴在自己的热爱里!



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭