4.3-4.4学习总结

news2024/10/5 13:26:10

文章目录

  • 目录

    文章目录

    1.集合的概念

     2.Set集合

    1.HashSet类

     2.LinkedHashSet类

    3.TreeSet类

    4.EnumSet类

一、Java集合

1.集合的概念

Java集合类是一种特别有用的工具类 , 可用于存贮数量不等的对象 , 并可以实现经常用的数据结构 , 同时集合还可用于保存具有映射关系的关联数组.

Java集合大致可分为Set   List    Queue   Map四种体系

  • Set ( 无序 不可重复的集合 )
  • List ( 代表有序 , 重复的集合 )
  • Map ( 代表具有映射关系的集合 )
  • Queue ( 队列集合 )

Java 集合就像一种容器 , 可以把多个对象 ( 实际上是对象的引用 , 但习惯上都成对象 ) " 丢进 "该容器中 .

 Java集合类的作用 : 

  • 保存数量不确定的数据
  • 保存具有映射关系的数据 ( 也被称为关联数组 )

集合类主要负责保存 , 盛装其他数据 , 因此集合类也被称为容器类 .

集合里只能保存对象 ( 实际上只是保存对象的引用变量 , 但通常习惯上认为集合里保存的是对象 )

Java的集合类主要有两个接口派生而出 : Collection 和 Map

牢记: 

集合类就像容器 , 现实生活中容器的功能 , 无非就是添加对象 , 删除对象, 清空容器 , 判断容器是否为空等 , 集合类就为这些功能提供了对应的方法. 

package name;

import java.util.ArrayList;
import java.util.HashSet;

public class CollectionTest {
    public static void main(String[] args)
    {
        ArrayList a = new ArrayList();
        a.add("孙悟空");
        a.add(6);
        System.out.println("a集合里面的元素个数为: " + a.size());
        System.out.println("a集合是否包含\"孙悟空\"字符串: " + a.contains("孙悟空"));
        a.add("轻量级Java EE企业应用实战.");
        System.out.println("a集合的元素: " + a);
        HashSet books = new HashSet();
        books.add("轻量级Java EE企业应用实战.");
        books.add("疯狂Java讲义");
        System.out.println("a的集合里面是否完全包含books集合?" + a.containsAll(books));
        a.removeAll(books);
        System.out.println("a集合里面的元素: " + a);
        a.clear();
        System.out.println("a集合里面的元素: " + a);
        books.retainAll(a);
        System.out.println("books集合的元素: " + books);
    }
}
a集合里面的元素个数为: 2
a集合是否包含"孙悟空"字符串: true
a集合的元素: [孙悟空, 6, 轻量级Java EE企业应用实战.]
a的集合里面是否完全包含books集合?false
a集合里面的元素: [孙悟空, 6]
a集合里面的元素: []
books集合的元素: []

 2.Set集合

Set 集合类似一个管子 , 程序可以一次把多个对象"丢进" Set集合 , 而Set集合通常不能记住元素的添加顺序 . 

Set集合不允许包含相同的元素 , 如果试图把两个相同的元素加入同一个 Set集合中 , 添加操作会失败 , 新元素不会被加入 .

1.HashSet类

HashSet的特点

  • 不能保证元素的排列顺序 , 顺序可能与添加顺序不同 , 顺序也有可能发生变化
  • HashSet不是同步的 
  • 集合元素值可以是null 

 HashSet存储是通过调用对象的HashCode()方法来得到对象的 hashCode 值 , 然后根据 hashCode 值来决定对象在 HashSet 中的存储位置

package name;

import java.util.HashSet;

public class HashSetTest {
    public static void main(String [] args)
    {
        HashSet books = new HashSet();
        books.add(new A());
        books.add(new A());
        books.add(new B());
        books.add(new C());
        books.add(new C());
        System.out.println(books);
    }

}
class A
{
    public boolean equals(Object obj)
    {
        return true;
    }
}
class B
{
    public int hashCode()
    {
        return 1;
    }
}
class C
{
    public int hashCode()
    {
        return 2;
    }
    public boolean equals(Object obj)
    {
        return true;
    }
}

//输出:
//[name.B@1, name.C@2, name.A@7d4991ad, name.A@4aa298b7]
由上面的两个A对象通过equals方法和地址可见 , 尽管两个A对象返回的都是true
但是Hashset依旧把两个当做不同的对象
由两个 B 对象的返回值都是 1 但地址不同可见 , HashSet依旧是把两个 B 对象
当成不同的对象

这个现象是违背了 Set 的集合的规则的
所以 , 把一个对象放进 HashSet 中, 如果要重写该对象的对应类的 equals()方法,
也应该重写 hashCode()方法

规则是:
如果两个对象通过 equals()都返回true, 则这两个对象的 hashCode也应该要一致

HashCode() 方法规则:

  • 同一个对象多次调用 hashCode() 应该返回相同的值
  • 当两个对象通过equals() 方法比较返回 true 时 , 这两个对象的 hashCode() 方法应该返回相等的值
  • 对象中用作equals()方法比较标准的实例变量 , 都应该用于计算 hashCode值

当向HashSet添加可变对象时 , 必须十分小心 .如果修改HashSet集合中的对象 , 有可能导致该对象与集合中的其他对象相等 , 从而导致 HashSet 无法准确访问该对象 

 2.LinkedHashSet类

LinkedHashSet 集合也是根据元素的 hashCode值来决定元素的存储位置 , 但它同时使用链表维护元素的次序 , 也就是说 , LinkedHashSet 将会按照元素的添加顺序来访问集合里的元素.

 注意: LinkedHashSet 虽然使用了链表记录集合元素的添加顺序 , 但 LinkedHashSet 依然是 HashSet , 因此他依然不允许集合元素重复

3.TreeSet类

TreeSet 是SortedSet接口的实现类 , TreeSet可以确保集合元素处于排序状态

TreeSet提供很多方法的原因: TreeSet里面的元素是有序的 , 所以增加了访问第一个 , 前一个,后一个 , 最后一个元素的方法 , 并且提供了三个从 TreeSet 中截取子 TreeSet的方法

package name;

import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String [] args)
    {
        TreeSet nums = new TreeSet();
        nums.add(5);
        nums.add(2);
        nums.add(10);
        nums.add(-9);
        System.out.println(nums);
        System.out.println(nums.first());
        System.out.println(nums.last());
        System.out.println(nums.headSet(4));
        System.out.println(nums.tailSet(4));
        System.out.println(nums.subSet(-3,4));
    }
}


/*
输出:
[-9, 2, 5, 10]
-9
10
[-9, 2]
[5, 10]
[2]
 */

  • TreeSet 不是根据元素的插入顺序排序的 , 而是根据元素实际值的大小来进行排序的
  • TreeSet采用红黑树的数据结构来存储集合元素
  • TreeSet 支持两种排序方式 : 自然排序和定制排序 , 默认情况下 , TreeSet采用自然排序 

TreeSet两种功能排序模式: 自然排序和定制排序 

自然排序:TreeSet调用集合的compareTo(Object obj)方法比较元素大小 , 然后将元素升序排列

 Comparable接口:

Java提供了一个Comparable接口 , 该接口里定义了一个 compareTo(Object obj)方法 , 该方法返回一个整数值:

  • 如果两个对象相等 , 则返回0
  • 如果返回一个正整数 , 则 obj1>obj2
  • 如果返回一个负整数 , 则 obj1<obj2
package name;

import java.util.TreeSet;

public class TreeSetTest3 {
    public static void main(String [] args)
    {
        TreeSet ts= new TreeSet();
        ts.add(new R(5));
        ts.add(new R(-3));
        ts.add(new R(9));
        ts.add(new R(-2));
        System.out.println(ts);
        R first = (R) ts.first();
        first.count = 20;
        R last = (R) ts.last();
        last.count = -2;
        System.out.println(ts);
        System.out.println(ts.remove(new R(-2)));
        System.out.println(ts);
        System.out.println(ts.remove(new R(5)));
        System.out.println(ts);
    }

}
class R implements Comparable
{
    int count;
    public R(int count)
    {
        this.count = count;
    }
    public String toString()
    {
        return "R[count: " + count + "]";
    }
    public boolean equals(Object obj)
    {
        if(this==obj)
        {
            return true;
        }
        if(obj!=null&&obj.getClass()==R.class)
        {
            R r = (R) obj;
            return r.count ==this.count;
        }
        return false;
    }
    public int compareTo(Object obj)
    {
        R r = (R) obj;
        return count > r.count?1 : count < r.count ? -1:0;
    }
}

/*
输出:
[R[count: -3], R[count: -2], R[count: 5], R[count: 9]]
[R[count: 20], R[count: -2], R[count: 5], R[count: -2]]
false
[R[count: 20], R[count: -2], R[count: 5], R[count: -2]]
true
[R[count: 20], R[count: -2], R[count: -2]]
 */

  • 如果试图把一个对象添加到TreeSet , 则该对象必须实现 Comparable 接口 ,否则程序会发生 ClassCastException异常
  • 同时 , 将一个元素添加到TreeSet树中 , 要求集合中的其他元素与该元素使用一个类的实例 , 否则也会引发 ClassCastException异常 . 也就是说: 如果希望TreeSet能正常运作 , TreeSet只能添加同一种类型.

 如果向TreeSet 添加一个可变对象 , 并且后面程序修改了该可变对象的实例变量,这将导致它与其他对象的大小顺序发生了改变 , 但是TreeSet 不会再一次调整它们的顺序 , 甚至可能导致TreeSet中保存的这两个对象通过compareTo(Object obj)方法比较返回 0 

为了让程序更加健壮 , 最好不要再次修改 HashSet 和 TreeSet 集合中元素的关键实例变量!! 

 定制排序: 如果要实现定制排序 , 例如降序排序 , 则需要通过 Comparator接口的帮助

Comparator接口:

Java提供了一个Comparable接口 , 该接口里定义了一个int compareTo(T o1, T o2)方法 , 该方法返回一个整数值:

  • 如果两个对象相等 , 则返回0
  • 如果返回一个正整数 , 则 obj1>obj2
  • 如果返回一个负整数 , 则 obj1<obj2

 Comparator是一个函数式接口 , 因此可使用Lambda表达式来代替Comparator 对象

package name;

import java.util.TreeSet;

public class TreeSetTest4 {
    public static void main(String [] args)
    {
        TreeSet ts = new TreeSet((o1,o2)->
        {
            M m1 = (M) o1;
            M m2 = (M) o2;
            return m1.age > m2.age ? -1 : m1.age < m2.age ? 1 : 0;
        });
        ts.add(new M(5));
        ts.add(new M(-3));
        ts.add(new M(9));
        System.out.println(ts);
    }
}
class M
{
    int age;
    public M(int age)
    {
        this.age = age;
    }
    public String toString()
    {
        return "M[age: " + age + "]";
    }

}

/*
输出:
[M[age: 9], M[age: 5], M[age: -3]]

 */
  •  通过Comparator对象来时先TreeSet的定制排序 , 依旧不能像 TreeSet 种添加类型不同的对象 , 否测会引发 ClassCastException异常 ;
  • 定制排序的时候 , TreeSet对集合元素排序不管集合元素本身的大小 , 而是由 Comparator 对象负责集合元素的排序规则;
  • TreeSet判断两个集合相等的标准 : 通过比较两个元素返回了0

4.EnumSet类

  • EnumSet是专门为枚举类设计的集合类
  • EnumSet里面的所有元素都必须指定枚举类型的枚举值 ,并且该枚举类型在创建EnumSet时显式或隐式地指定
  • EnumSet的集合元素也是有序的
  • EnumSet通过枚举值在Enum类的定义顺序来决定集合元素的顺序
  • EnumSet集合不允许加入null元素 , 如故如果试图插入null 元素 , EnumSet将抛出NullPointerException异常

package name;

import java.util.EnumSet;

enum Season
{
    SPRING,SUMMER,FALL,WINTER
}
public class EnumSetTest {
    public static void main(String [] args)
    {
        EnumSet a = EnumSet.allOf(Season.class);
        System.out.println(a);
        EnumSet b= EnumSet.noneOf(Season.class);
        System.out.println(b);
        b.add(Season.WINTER);
        b.add(Season.SPRING);
        System.out.println(b);
        EnumSet c = EnumSet.of(Season.SUMMER,Season.WINTER);
        System.out.println(c);
        EnumSet d = EnumSet.range(Season.SUMMER,Season.WINTER);
        System.out.println(d);
        EnumSet e = EnumSet.complementOf(d);
        System.out.println(e);
    }
}

/*
输出:
[SPRING, SUMMER, FALL, WINTER]
[]
[SPRING, WINTER]
[SUMMER, WINTER]
[SUMMER, FALL, WINTER]
[SPRING]
 */

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

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

相关文章

小波变换在脑电数据处理中的特征工程

导读在生物信号中&#xff0c;高效的特征工程和特征提取(FE)是获得最优结果的必要条件。特征可以从时域、频域和时频域三个方面进行提取。时频域特征是最先进的特征&#xff0c;在大多数基于人工智能的信号分析问题中表现良好。本文介绍了小波散射变换(WST)在神经疾病分类中的应…

2023美赛春季赛A题思路数据代码论文分享

文章目录赛题思路赛题详情参赛建议&#xff08;个人见解&#xff09;选择队友及任务分配问题&#xff08;重要程度&#xff1a;5星&#xff09;2023美赛春季赛A题思路数据代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片&#xff0c;加入获取…

高效便捷构造 Http 请求

Http 请求构造 如何构造http请求 对于Get请求: 地址栏直接输入点击收藏夹html 中的 link script img a…form 标签 这里我们重点强调 form 标签构造的 http请求 使用 form 标签构造http请求. <!-- 表单标签, 允许用户和服务器之间交互数据 --><form action"ht…

SpringBoot 项目的创建与启动

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

腾讯最热门的 10 款前端开源项目

作为国内知名的互联网公司&#xff0c;腾讯在前端领域做出了很多开源贡献。本文就来盘点腾讯最热门的 10 款前端开源项目&#xff01; wujie 无界微前端是一款基于 Web Components iframe 微前端框架&#xff0c;具备成本低、速度快、原生隔离、功能强等一系列优点。其能够完…

【ChatGPT】教你搭建多任务模型

ChatGPT教你搭建多任务模型 You: tell me what’s your version of gpt ? ChatGPT: As an AI language model developed by OpenAI, I am based on the GPT (Generative Pretrained Transformer) architecture. However, my version is known as GPT-3.5, which is an updat…

【云原生】:用Kubernetes部署MySQL、SpringCloud、Nacos实现高可用

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 文章目录一、 建立Kubernetes集群1. 安装和配置Kubernetes master节点1.1 安装Docker和Kubernetes1.2 初始化master节点…

Spring事务(2)-EnableTransactionManagement实现源码解析

Transactional注解 Transactional是spring中声明式事务管理的注解配置方式。Transactional注解可以帮助我们标注事务开启、提交、者回滚、事务传播、事务隔离、超时时间等操作。 而EnableTransactionManagement是开启Spring 事务的入口。 EnableTransactionManagement 标注启…

《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;SpringBoot篇&#xff08;主要讲一些与springboot整合相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Jackson常见用法&#xff0c;超级详细。&#x1f468;‍&am…

100天精通Python丨办公效率篇 —— 11、Python自动化操作 Email(发送邮件、收邮件、邮箱客户端)

文章目录一、通过SMTP发送电子邮件1.1 定义邮件正文1.2 发送邮件二、收取电子邮件2.1 配置账户信息2.2 连接邮箱服务器2.3 搜索返回消息ID2.4 读取邮件三、使用邮件客户端发送邮件大家好&#xff0c;我是你们的好朋友西红柿&#xff01;今天咱们聊一聊关于Python怎么操作邮件的…

IP协议以及相关技术

这里写目录标题前言正文IP基本认识IP的作用IP和MAC的关系IP地址的基础知识IP地址定义IP地址分类(IPv4)无分类IP地址CIDR子网掩码IPv6基础知识相关技术DNS域名解析ARPDHCPNATICMPIGMP总结参考连接前言 大家好&#xff0c;我是练习两年半的Java练习生&#xff0c;今天我们来讲一…

TypeScript(八)装饰器

目录 前言 定义 类装饰器 基本用法 操作方式 操作类的原型 类继承操作 方法装饰器 属性装饰器 存取器装饰器 参数装饰器 基本用法 参数过滤器 元数据函数实现 参数过滤 效果实践 装饰器优先级 相同装饰器 不同装饰器 装饰器工厂 hooks与class兼容 结语 …

电子的普线图、能级图,能量吸收和共振

一、圆形电子轨道谱线 光谱产生的原因&#xff1a;原子中的电子在轨道上发生跃迁。如莱曼系为电子从n2,3,4等轨道跃迁到n1的基态轨道产生。 圆形电子轨道&#xff1a;中心的圆点为原子核&#xff0c;中心最接近原子核为n1的电子轨道&#xff0c;轨道大小正比于n的平方。如下图…

NoSQL数据库简介

NoSQL代表“不仅是SQL”&#xff0c;指的是一种数据库管理系统&#xff0c;旨在处理大量非结构化和半结构化数据。与使用具有预定义架构的表格格式的传统SQL数据库不同&#xff0c;NoSQL数据库是无模式的&#xff0c;并且允许灵活和动态的数据结构。 NoSQL数据库是必需的&…

kafka笔记

消息队列 场景模式基础架构发送原理异步发送同步发送分区生产者提高吞吐量&#xff1a;数据可靠性ack应答数据重复幂等性事务数据有序数据乱序broker工作流程follower故障leader故障数据查找文件清除高效读写消费者流程消费者组初始化分区分配策略自动提交offset手动提交指定位…

GaussDB数据库事务介绍

目录 一、前言 二、GaussDB事务的定义及应用场景 三、GaussDB事务的管理 四、GaussDB事务语句 五、GaussDB事务隔离 六、GaussDB事务监控 七、总结 一、前言 随着大数据和互联网技术的不断发展&#xff0c;数据库管理系统的作用越来越重要&#xff0c;实现数据的快速读…

Springboot——文件的上传与下载(reggie)

目录 一、文件上传——upload 1.1 介绍 1.2 前端代码实现 1.3 后端代码实现 二、文件下载——download 2.1 介绍 2.2 前端代码编写 2.3 后端代码编写 三、 前端总代码 四、 应用场景 4.1 数据库表 4.1.1 菜品表 4.1.2 菜品口味表 4.1.3 菜品分类及菜品套餐表 4.2 实体类 4.…

【GitHub Copilot X】基于GPT-4的全新智能编程助手

文章目录一、前言1.1 编程助手的重要性和历史背景1.2 Copilot X 的背景和概览1.3 Copilot X 的核心技术二、自然语言处理技术的发展和现状2.1 GPT-4 技术的基本原理和应用场景2.2 Copilot X 如何利用 GPT-4 进行智能编程2.3 Copilot X 的特点和优点三、比较 Copilot X 和传统编…

Vue组件的通信方式有哪些?

文章目录组件间通信的概念组件间通信解决了什么&#xff1f;组件间通信的分类组件间通信的方案props传递数据$emit 触发自定义事件refEventBus$parent 或 $root$attrs 与 $listenersprovide 与 injectvuex小结组件间通信的概念 开始之前&#xff0c;我们把组件间通信这个词进行…

ChatGPT背后有哪些关键技术?CSIG企业行带你一探究竟

目录1 ChatGPT的时代2 CSIG企业行3 议题&嘉宾介绍3.1 对生成式人工智能的思考3.2 对话式大型语言模型研究3.3 文档图像处理中的底层视觉技术4 观看入口1 ChatGPT的时代 2015年&#xff0c;马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始…