集合的介绍与比较器的应用

1.集合:

是一种容器,一种变量类型,跟数组很像
数组的缺点:
A.数组的空间长度固定,一旦确定不可以更改。多了浪费,少了报错。
B.使用数组 操作数据的时候,【删除,增加】效率比较低。
C.没办法获得数组中存储的真实元素个数。
D.数组没办法满足,无序,不可重复的数据满足不了。

以上集合都可以满足。

2.集合的分类:

根据存储数据的方式:

Collection(一个一个存储元素,无序 不唯一)
list(不唯一,有序)
set(无序,唯一)

Collection
List
Set
ArrayList
Vector
LinkedList
HashSet
TreeSet

最后一排为实现类,上两排为接口,不能new 接口,但可以new 它的实现类

map(一对一对存储元素 key 无序唯一 -value 无序不唯一)

map
HashMap
HashTable
TreeMap

HashMap和TreeMap为类,是实现Map接口的类,HashTable是老版本,更安全,但效率更低

3.介绍Collection接口:

Collection 接口:不唯一 无序的元素。
> 添加:add(23);addAll(c);
> 删除:remove(23);removeAll(c1);clear();
> 判断:contains(“张三”);isEmpty();
> 查找:size();iterator();
> 转换:toArray();

4.介绍Iterator接口:

迭代器:“Iterator就是为循环遍历集合而生的”

Iterator iterator = c.iterator();//c对象调用方法,获得一个能遍历自己的迭代器。while(iterator.hasNext()){//System.out.println(iterator.next());}

针对不同的对象,设计不同的遍历器,比如这里是c,如创建了d,则使用d.iterator()方法

5.介绍List接口:

    List 有序 不唯一的元素:* 添加: add(0,"bb");addAll(0,list);* 删除:remove(2);* 修改:set(0,"cc");* 判断:* 查找:get(0);indexOf("张三");* 转换:* 排序:sort();【排序】

ArrayList和LinkedList的区别在于底层原理不同:一个是数组,一个是链表

6.介绍ArrayList实现类

【没有自己特有的方法】

  1. ArrayList 底层就是Object[]数组,数组空间大小初始值是10
  2. 以1.5倍的空间大小扩增。
  3. 优势:随机访问,和遍历的效率高!缺点:删除 和 添加的效率低!
  4. Vector VS ArrayList
    A.语法上一样的。
    B.区别:
    Vector jdk版本1.5之前
    ArrayList jdk版本1.5之后
    Vector 线程安全的,速度慢,效率低。
    ArrayList 线程不安全的,速度块,效率高。
    Vector 底层数组以2倍速度扩充空间大小;
    ArrayList 底层数组以1.5倍速度扩充空间大小;

7.介绍LinkedList实现类:

存储(下标) 有序 不唯一的元素

LinkedList:底层是Linked链表结构。

优点:擅长做 删除,添加操作
缺点:查找,随机访问效率低。

LinkedList 有序 不唯一的元素:
* 添加: addFirst(12D);addLast(90.9);
* 删除:removeFirst();removeLast();

8.介绍Set接口:

无序 唯一的元素
没有自己特有的方法。只有Collection父接口里的方法

9.介绍HashSet实现类:

无序 唯一的元素
介绍HashSet去重原理:借助元素对象的两个方法,HashCode(),equals().

  • 首先使用HashCode()获得要存入元素的hash值
  • 依次比较集合中已有的元素hash值
  • 如果hash值不同,直接将该元素存入集合。
  • 如何hash值相同的,再使用equals() 继续进行两个hash值相同的对象的属性比较。
  • 如果属性都相同,拒绝存入集合中。
  • 如果属性不相同,可以存入集合中。

hashSet集合存储的元素,
要对HashCode() 和 equals() 进行重写。
改为关注属性是否相同而不是内存地址。

10.介绍TreeSet实现:

有序(排序) 唯一的元素
介绍TreeSet去重原理:利用比较器的比较方法。

将要存入的元素与以存入的元素依次比较。
如果比较的结果为0,则认为是相同元素,拒绝存入。
如果比较的结构是1,则认为是不同元素,可以存入,并且位置靠前
如果比较的结构是==-1==,则认为是不同元素,可以存入,并且位置靠后

示例

TreeSet<String> set2=new TreeSet();  
set2.add("asd");  
set2.add("asdf");  
set2.add("abc");  
set2.add("bc");  
set2.add("aaaaaaaa");  
set2.add("bc");  
System.out.println(set2);

结果如图:
在这里插入图片描述

引用型变量的比较

TreeSet<Student> stus=new TreeSet<>();  
stus.add(new Student(1, "张三c", 23, "男"));  
stus.add(new Student(2, "李四w", 24, "女"));  
stus.add(new Student(4, "张三c", 23, "男"));  
stus.add(new Student(3, "张三", 23, "男"));  
stus.add(new Student(2, "李四s", 24, "女"));  
stus.add(new Student(5, "张三d", 23, "男"));  System.out.println(stus.size());

在这里插入图片描述

报错:不具有比较能力

【如何让自定义类对象,拥有比较的能力?使该类实现Comparable接口,重写比较方法】
在这里插入图片描述

@Override  
public int compareTo(Student o) {  if(stuId>o.stuId){  return 1;  } else if (stuId < o.stuId) {  return -1;  }else{  return 0;  }  
}

如果要按照姓名来比较呢?上面的函数里直接返回

return stuName.compareTo(o.stuName);

字符串类型已经重写了compareTo方法,因此可以直接用。

11.介绍比较器:

比较器对象分为两种:内部比较器:实现Comparable接口,重写compareTo()方法。

  • 缺点:
    1.每次更改比较规则的时候,都要修改源码。
    2.只有实现了内部比较器接口的对象,才可以存入TreeSet集合里。

外部比较器:

外部比较器 Comparator 方法:compare
内部比较器 comparable 方法:compareTo
使用步骤:
a.创建一个比较器类
b.重写compare()方法

import java.util.Comparator;  /**  * 创建一个外部比较器类:  * 比较规则:按照年龄进行排序和去重  */  
public class AgeComparator implements Comparator<Student> {  @Override  public int compare(Student o1, Student o2) {  return Integer.compare(o1.getAge(), o2.getAge());  }  
}

外部比较器的使用

public class TreeSetTest {  public static void main(String[] args) {  AgeComparator age=new AgeComparator();  TreeSet<Student> stus = new TreeSet<>(age);  //意思是按照age来去重  stus.add(new Student(1, "张三c", 23, "男"));  stus.add(new Student(2, "李四w", 24, "女"));  stus.add(new Student(4, "张三c", 23, "男"));  stus.add(new Student(3, "张三", 23, "男"));  stus.add(new Student(2, "李四s", 24, "女"));  stus.add(new Student(5, "张三d", 23, "男"));  System.out.println(stus.size());  System.out.println(stus);  }  
}

注意:外部比较器使用的时候需要传参,如:
TreeSet<Student> stus = new TreeSet<>(age);
内部比较器则不需要。

12.介绍Map接口:

Map 一对一对,以键值对key-value形式进行元素存储。
key 无序唯一的
value 无序不唯一的

解释:键值对形式更符合网络发展的适用场合。

public class HashMapTest {  public static void main(String[] args) {  Map<Integer,Student> map=new HashMap<>();  //只管key重复  Student stu1 = new Student(1, "张三c", 23, "男");  Student stu2 = new Student(2, "李四w", 24, "女");  Student stu3 = new Student(1, "张三c", 23, "男");  Student stu4 = new Student(4, "张三", 23, "男");  Student stu5 = new Student(5, "李四s", 24, "女");  Student stu6 = new Student(6, "张三d", 23, "男");  map.put(stu1.getStuId(), stu1);  //调用一次put方法,比较一次key值  map.put(stu2.getStuId(), stu2);    map.put(stu3.getStuId(), stu3);  map.put(stu4.getStuId(), stu4);  map.put(stu5.getStuId(), stu5);  map.put(stu6.getStuId(), stu6);  System.out.println(map);  }  
}

不需要再重写hashCode和equals了,因为比较的key,key可以是String ,int …一定都已经重写了。

Student student = map.get(3);  
student.setStuName("学生三");

put:存数据
get根据key取value

后存入的相同key值的数会将原有的值覆盖掉

Student stu6 = new Student(6, "张三d", 23, "男");  
Student stu7 = new Student(6, "菲菲", 23, "男");
map.put(stu6.getStuId(), stu6);  
map.put(stu6.getStuId(), stu7);

``

遍历Map集合的四种方式

第一种

System.out.println("第一种遍历Map集合的方式:");
Collection<Student> values = map.values();  
//所有value值进行汇总存到valuse里  
Iterator<Student> iterator=values.iterator();  
while (iterator.hasNext()) {  Student stu=iterator.next();  System.out.println(stu);  
}

第二种

System.out.println("第二种遍历Map集合的方式");  
Set<Integer> integers = map.keySet();  
//方法:汇总Map中所有的key值,形成集合  
Iterator<Integer> iterator1=integers.iterator();  
while (iterator1.hasNext()) { //判断迭代器指针下面是否还有元素  Integer key = iterator1.next();//如果有元素,那么向下取值,该值就是key值  Student stu = map.get(key);//通过get方法,,通过key值获得value值  System.out.println(stu);  //输出value(底层调用toString)  
}

第三种

System.out.println("第三种遍历Map集合的方式");  
Set<Map.Entry<Integer, Student>> entries = map.entrySet();  
//汇总键值对  
Iterator<Map.Entry<Integer, Student>> iterator2 = entries.iterator();  
while (iterator2.hasNext()) {  Map.Entry<Integer, Student> entry = iterator2.next();  Student stu = entry.getValue();  System.out.println(stu);  
}

第四种

System.out.println("第四种遍历Map集合的方式");  
Collection<Student> values2 = map.values();  
for (Student stu : values2) {   //增强型for循环  System.out.println(stu);  
}
  • 普通的for循环:必须要知道下标。
  • 增强型for循环:可以在不知道下标的情况下,遍历集合/数组
for(集合中元素的类型 代号 :要遍历的那个集合/数组){  操作代号----操作对象  }  

13.介绍HashMap

HashMap 是无序的,key不可重复
HashMap 如果put两个相同的key的键值对,后一个执行的会覆盖前一个
HashMap的键和值都可以为null
保证key值唯一的原理是:key类型要求重写hashCode()+equals()

14.介绍HashTable 和HashMap

a.HashTable 继承于Dictionary类;HashMap继承于 AbstractMap类
b.HashMap是线程不安全的,操作速度块,效率高, jdk新版本
Hashtable是线程安全的,操作速度慢,效率低 jdk老版本
c.对键值的要求不同,HashMap允许为空,Hashtable不允许为空
d.默认初始容量不同:Hashtable是11,HashMap是16

15.介绍TreeMap 实现类 和 HashMap的区别:

a.key值去重的原理不同
b.底层存储数据的实现不同,hash表(数组+list集合) ,红黑数
c.TreeMap 的key是可以去重+排序的,HashMap的key 不能排序,只能去重。

16.介绍Properties类

“万事万物皆对象”
Java中有一种配置文件是以properties拓展名结尾的,
properties配置文件是以键值对形式存在的。
Java为这种配置文件提供了一个处理的类,
Properties类就是用来处理properties文件的。
它是Hashtable的子类,Hashtable中的方法可以用
但是因为它有自己独立的含义,所以大多数情况都不会用Hashtable中的方法,用它自己的方法。

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

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

相关文章

动态规划---解决多段图问题

ok 小伙伴们&#xff0c;我现在有点小小的红温&#xff0c;有点毛躁。 怎么解决多段图问题呢&#xff1f;求取最短路径有多种方法可取。 家人们&#xff0c;毫无思绪可言……………………………… 要实现动态规划&#xff0c;条件&#xff1a;子问题重叠度较高&#xff0c;并…

基于Spring Boot的在线性格测试系统设计与实现(源码+定制+开发)智能性格测试与用户个性分析平台、在线心理测评系统的开发、性格测试与个性数据管理系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

cMake编译github中源码

https://github.com/gflags/gflags 记录一下防止遗忘&#xff0c;本次编译为gflags库 1.下载CMake-gui https://cmake.org/ 安装时&#xff0c;选择自动创建环境变量&#xff0c;安装完输入&#xff0c;查看是否安装成功 cmake --version 2.下载源码&#xff0c;解压打开文…

web——upload-labs——第四关——.htaccess文件绕过

先尝试直接上传一个普通的一句话木马 显示此文件不允许上传&#xff0c;这道题并没有提示不允许上传什么后缀的文件&#xff0c;经过尝试&#xff0c;基本上所有后缀能够被解析为php语句执行的文件都不能成功上传。试试正常的图片能不能上传&#xff1a; 我们再来试试图片马能不…

Gitcode文件历史记录查看和还原

文件历史记录 文件历史记录用于记录代码文件的更改历史&#xff0c;它允许用户查看文件的不同版本&#xff0c;了解每个版本的修改内容、作者和提交消息。这对于跟踪文件演进、恢复错误更改、审查代码以及了解项目进展都非常有用。 文件历史记录功能提供了以下核心功能&#…

前端神经网络入门(二):如何利用 WebGPU 进行数值计算,实现大规模数据的计算加速?- 边读边按下F12跑代码吧

在 Web 应用开发中&#xff0c;JavaScript 是前端开发者们最常用的语言。然而&#xff0c;当面对大规模数据处理和计算任务时&#xff0c;JavaScript 在浏览器中的执行往往会受到诸多性能瓶颈的限制。幸运的是&#xff0c;WebGPU 的出现&#xff0c;为我们提供了在前端实现高性…

新手教学系列——善用 VSCode 工作区,让开发更高效

引言 作为一名开发者,你是否曾经在项目中频繁地切换不同文件夹,打开无数个 VSCode 窗口?特别是当你同时参与多个项目或者处理多个模块时,这种情况更是家常便饭。很快,你的任务栏上挤满了 VSCode 的小图标,切换起来手忙脚乱,工作效率直线下降。这时候,你可能会问:“有…

Oracle故障处理:ora-12514 与 ora-28547

目录 项目场景 问题分析 问题总结 项目场景 现场同事求助说&#xff1a;有个刚刚部署在Windows上的Oracle11gR2数据库&#xff08;单机单实例&#xff09;&#xff0c;使用PLSQL工具连接不上。帮忙查看后&#xff0c;发现未装Oracle client&#xff0c;指导其安装完Oracle客…

【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

26-ES集群搭建、身份认证配置

虚机搭建 添加es用户 elasticsearch 默认不允许root用户启动&#xff0c;所以需要创建es用户 useradd elasticsearch passwd elasticsearch 解压安装包 #解压es tar -xvzf elasticsearch-7.14.2-linux-x86_64.tar.gz 将文件夹赋予es用户权限 #将文件夹赋予es用户权限 sud…

OpenHarmony的公共事件

OpenHarmony的公共事件 公共事件简介 CES&#xff08;Common Event Service&#xff0c;公共事件服务&#xff09;为应用程序提供订阅、发布、退订公共事件的能力。 公共事件分类 公共事件从系统角度可分为&#xff1a;系统公共事件和自定义公共事件。 系统公共事件&#…

【AlphaFold3】开源本地的安装及使用

文章目录 安装安装DockerInstalling Docker on Host启用Rootless Docker 安装 GPU 支持安装 NVIDIA 驱动程序安装 NVIDIA 对 Docker 的支持 获取 AlphaFold 3 源代码获取基因数据库获取模型参数构建将运行 AlphaFold 3 的 Docker 容器 参考 AlphaFold3: https://github.com/goo…

npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)

您提供的命令 npm list -g --depth0 是在 Node Package Manager (npm) 的上下文中使用的&#xff0c;用来列出全局安装的所有 npm 软件包而不显示它们的依赖项。 这是它的运作方式&#xff1a; npm list -g --depth0-g: 指定列表应包括全局安装的软件包。--depth0: 限制树形结…

Spring Boot框架:电商系统的技术革新

4 系统设计 网上商城系统的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计阶段没有经过全…

【数据分享】中国对外投资合作发展报告(2013-2023)

数据介绍 绪 论............................................................................................................................. 1 对外投资合作高质量发展迈出新步伐................................................................... 2 第一篇 发…

【深度学习】LSTM、BiLSTM详解

文章目录 1. LSTM简介&#xff1a;2. LSTM结构图&#xff1a;3. 单层LSTM详解4. 双层LSTM详解5. BiLSTM6. Pytorch实现LSTM示例7. nn.LSTM参数详解 1. LSTM简介&#xff1a; LSTM是一种循环神经网络&#xff0c;它可以处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM通…

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

【Hadoop】【hdfs】【大数据技术基础】实验三 HDFS 基础编程实验

实验三&#xff1a; HDFS Java API编程实践 实验题目 HDFS Java API编程实践 实验目的 熟悉HDFS操作常用的Java API。 实验平台 操作系统&#xff1a;Linux Hadoop版本&#xff1a;2.6.0或以上版本 JDK版本&#xff1a;1.6或以上版本 Java IDE&#xff1a;Eclipse 实验…

ssm114基于SSM框架的网上拍卖系统的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;商品拍卖当然也不能排除在外&#xff0c;随着商品拍卖管理的不断成熟&#xff0c;它彻底改变了过去传统的经营管理方式&#xff0c;不仅使商品…

Transformer中的算子:其中Q,K,V就是算子

目录 Transformer中的算子 其中Q,K,V就是算子 一、数学中的算子 二、计算机科学中的算子 三、深度学习中的算子 四、称呼的由来 Transformer中的算子 其中Q,K,V就是算子 “算子”这一称呼源于其在数学、计算机科学以及深度学习等多个领域中的广泛应用和特定功能。以下是…