java基础 之 集合与栈的使用(二)

news2024/11/15 18:13:30

文章目录

        • List 和 Set的比较
        • Set接口
          • 对于set的无序该怎么理解?
          • (一)实现类:HashSet
          • (二)实现类:LinkedHashSet
            • 【代码部分】HashSet 和 LinkedHashSet
            • 浅谈HashSet 和 LinkedHashSet的打印结果
          • (三)实现类: TreeSet
          • 总结

上文介绍了List接口的实现类,本文来介绍Set和Map
点击这里跳转到上一篇,java基础 之 集合与栈的使用(一)

在这里插入图片描述

List 和 Set的比较
ListSet
有序性保证按插入顺序排序存储和取出顺序不一致
唯一性可以重复元素唯一
获取元素可以根据索引值操作或者获取元素不能根据索引值操作
Set接口
对于set的无序该怎么理解?
  • 无序是指读取数据的顺序不一定和插入数据的顺序一样
(一)实现类:HashSet
  • 特点

    • HashSet底层使用的是HashMap
    • 不保证元素的顺序,
    • 数据不能有重复的
    • 元素值允许有NULL
    • 线程不安全
  • HashSet集合的一些方法

import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;

public class TestHashSet {
    public static void main(String[] args) {
        HashSet set = new HashSet<>();
        Random random = new Random();
        for(int i=0;i<20;i++){
            // add(Object o):向Set集合中添加元素,不允许添加重复数据。
            System.out.print(set.add(random.nextInt(15))+" ");
        }
        // size():返回Set集合中的元素个数
        System.out.println(set.size());
        //.contains(Object o):判断集合中是否包含obj元素。
        System.out.println(set.contains(23));
        //.remove(Object o): 删除Set集合中的obj对象,删除成功返回true,否则返回false。
        System.out.println(set.remove(23));
        //.isEmpty():如果Set不包含元素,则返回 true。
        System.out.println(set.isEmpty());

        // 打印set中内容,方法一:迭代法
        Iterator<Integer> iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next()+"-- ");
        }
        // 打印set中内容看,方法二:foreach
        for (Object o : set) {
            System.out.print(o+" ");
        }
        // .clear(): 移除此Set中的所有元素。返回类型为void
        set.clear();

    }
}
(二)实现类:LinkedHashSet
  • LinkedHashSet 特点

    • 继承了HashSet,是在HashSet的基础上维护了元素添加顺序的功能
    • LinkedHashSet是List接口的一个实现类
    • 底层使用的是HashSet,同时使用链表维护元素的插入顺序
    • 元素有序且唯一,因为链表保证了元素有序,哈希表保证元素唯一
    • LinkedHashSet线程不安全
  • LinkedList集合的一些方法

    LinkedHashSet继承于HashSet,它的源码很少,只有几个构造函数,基本上都是调用父类HashSet的构造函数。
    方法同HashSet,这里就不写了。

【代码部分】HashSet 和 LinkedHashSet
	import java.util.HashSet;
	import java.util.Iterator;
	import java.util.LinkedHashSet;
	import java.util.Random;
	
	public class TestLinkedHashSet {
	    public static void main(String[] args) {
	        HashSet hashSet = new HashSet();
	        LinkedHashSet linkedHashSet = new LinkedHashSet();
	
	        Random random = new Random(1);
	        System.out.println("添加的数字内容:");
	        for(int i=0;i<20;i++){
	            int element = random.nextInt(15);
	            System.out.print(element+" ");
	            hashSet.add(element);
	            linkedHashSet.add(element);
	        }
	        System.out.println();
	
	        Iterator hash = hashSet.iterator();
	        System.out.println("set集合打印:");
	        while(hash.hasNext()){
	            System.out.print(hash.next()+" ");
	        }
	        System.out.println();
	        System.out.println("linkedSet集合打印:");
	        Iterator linked = linkedHashSet.iterator();
	        while (linked.hasNext()){
	            System.out.print(linked.next()+" ");
	        }
	        System.out.println();
	        System.out.println("---------------------------------");
	        HashSet<String> setString = new HashSet();
	        LinkedHashSet<String> linkedString= new LinkedHashSet();
	
	        System.out.println("添加的字母内容:");
	        for(int i=0;i<20;i++){
	            char letter = (char) ('a'+random.nextInt(26));
	            System.out.print(letter+" ");
	            setString.add(String.valueOf(letter));
	            linkedString.add(String.valueOf(letter));
	        }
	        Iterator s_setString = setString.iterator();
	        System.out.println();
	        System.out.println("set集合打印:");
	        while(s_setString.hasNext()){
	            System.out.print(s_setString.next()+" ");
	        }
	        System.out.println();
	        System.out.println("linkedSet集合打印:");
	        Iterator linked_setString = linkedString.iterator();
	        while (linked_setString.hasNext()){
	            System.out.print(linked_setString.next()+" ");
	        }
	    }
	}

在这里插入图片描述

代码的运行结果是否跟自己想象中的一样?
不一样的话,知道是怎么回事不?

浅谈HashSet 和 LinkedHashSet的打印结果
  • 疑问一:set的无序是怎么回事?

    集合所说的序,是指元素存入集合的顺序,当元素存储顺序和取出顺序一致时就是有序,否则就是无序。

  • 疑问二:为什么HashSet打印的值是有序的?

    HashSet真实的情况是有序的,只不过它是通过内部HashCode方法计算hash值后自动进行了排序,所以读取的是经过内部排序后的数据,且此数据每次结果都是一样的顺序。

  • 疑问三:HashSet打印的值一直是有序的吗?

    如果添加的是Integer类型的,打印出来一直是有序的,因为Integer类型hashCode()的返回值就是其int值本身
    如果添加的不是Integer类型的,当数组长度小于16时,打印出来是无序的,大于等于16就是有序的,与扩容机制有关。
    (点击这里了解为啥16是分界线)Java遍历HashSet为什么输出是有序的?

(三)实现类: TreeSet
  • 特点

    • TreeSet内部使用的是TreeMap,TreeMap是基于红黑树实现的
    • 插入数据内部有两种排序方法:自然排序 和 定制排序
    • TreeSet会对插入的数据排序,所以输入和输出顺序不一致
    • 值唯一,但是不可以为null
    • 线程不安全
  • TreeSet集合的使用

    • 输出时排序是按照字典序排序的方式

      public class TestTreeSet {
          public static void main(String[] args) {
              TreeSet ts=new TreeSet();
              ts.add("hello");
              ts.add("world");
              ts.add("abc");
              Iterator it=ts.iterator();
      
              // 输出 : 按照字典序排序的方式进行排序
              while(it.hasNext()) {
                  System.out.print(it.next());    // 输出结果:abd hello world
              }
          }
      }
      

      ‌字典序排序是一种按照字母表的顺序对字符串进行排序的方法。 其基本原理是在比较两个字符串时,从左到右逐个字符进行比较。如果某个位置的字符不同,则较小的字符排在前面;如果所有字符都相同,则较短的字符串排在前面。‌

    • 如果插入的是自定义对象 需要让类实现 Comparable 接口并且必须要重写compareTo

      /***创建一个Person类
      */
      public class Person implements Comparable{
          String name;
          int age;
          Person(String name,int age)
          {
              this.name=name;
              this.age=age;
          }
          @Override
          public int compareTo(Object o) {
              Person p=(Person)o;
              //先对姓名字典序比较 如果相同 比较年龄
              if(this.name.compareTo(p.name)!=0) {
                  return this.name.compareTo(p.name);
              }
              else
              {
                  if(this.age>p.age) return 1;
                  else if(this.age<p.age) return -1;
              }
              return 0;
          }
      }
      
      import java.util.Iterator;
      import java.util.TreeSet;
      
      public class TestTreeSet {
          public static void main(String[] args) {
              TreeSet treeSet=new TreeSet();
              treeSet.add(new Person("hello",21));
              treeSet.add(new Person("world",12));
              treeSet.add(new Person("abc",8));
              treeSet.add(new Person("Abc",12));
              Iterator it=treeSet.iterator();
              while(it.hasNext())
              {
                  Person p=(Person)it.next();
                  System.out.println(p.name+":"+p.age);
              }
          }
      }
      ----------------运行结果-----------------
      Abc:12
      abc:8
      hello:21
      world:12
      
总结

1、HashSet:HashSet的性能基本上比LinkedHashSet和TreeSet要好,特别是添加和查询,这也是用的最多的两个操作
2、LinkedHashSet的查询稍慢一些,但是他可以维持元素的添加顺序。所以只有要求当插入顺序和取出顺序一致的时候 才使用LinkedHashSet。
3、TreeSet只有在需要对元素进行排序时使用

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

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

相关文章

MYSQL-初级-事务篇

目录 概述为什么有事务&#xff1f; 事务操作事务的四大特性&#xff08;AICD&#xff09;原子性&#xff08;Atomicity&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;Durability&#xff09; 并发事务问题…

为虚幻引擎C++项目设置VS开发环境

为虚幻引擎C项目设置VS开发环境 虚幻引擎&#xff08;简称UE&#xff09; 能与 Visual Studio&#xff08;简称VS&#xff09; 完美结合&#xff0c;使你能够快速、简单地改写项目代码&#xff0c;并能即刻查看编译结果。设置Visual Studio以使用虚幻引擎能提高开发者对虚幻引…

rust 桌面 sip 软电话(基于tauri 、pjsip库)

本文尝试下rust 的tauri 桌面运用 原因在于体积小 1、pjsip 提供了rust 接口官方的 rust demo 没编译出来 在git找了个sip-phone-rs-master https://github.com/Charles-Schleich/sip-phone-rs 可以自己编译下pjsip lib库替换该项目的lib 2、创建一个tauri demo 引用 [depe…

操作系统(4)——文件系统

目录 小程一言文件系统管理基础概念&功能基本概念文件的结构和属性文件的操作文件的安全性和权限控制文件系统的实现和分配方式 问题&解答1、文件系统在操作系统中起到什么作用&#xff1f;2、文件的逻辑结构和物理结构有何区别&#xff1f;3、如何理解文件权限控制在操…

时间序列异常值检验替换——基于Hampel滤波器

Hampel滤波器作为一种强大的时间序列异常值处理工具&#xff0c;在数据清洗和分析中发挥着重要作用。本文将深入研究Hampel滤波器的原理和数学推导&#xff0c;并通过实际代码演示其在异常值处理中的应用 1. Hampel滤波器简介 1.1 什么是Hampel滤波器&#xff1f; Hampel滤波…

【达梦数据库】通过线程pid定位会话SQL

【达梦数据库】通过线程pid定位会话SQL 1、查找数据库进程 ps -ef|grep dmserver2、通过进程pid去找对应的线程 top -H -p $pid -------------------- top命令经常用来监控linux的系统状况&#xff0c;是常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用…

Signac包-1.Analyzing PBMC scATAC-seq

–https://stuartlab.org/signac/articles/pbmc_vignette 好的&#xff0c;开始学习scATAC-seq的数据是怎么玩的了&#xff0c;先跑完Signac的教程&#xff0c;边跑边思考怎么跟自己的课题相结合。 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 数据和R…

Qt安卓开发的一些概念

目录 1、Android 版本和 API 的对应关系&#xff1f; 2、ABI是什么 2.1、x86_64 2.2、x86 2.3、arm64-v8a 2.4、armeabi-v7a 3、不同架构的特点 3.1、32位 ARM 架构 (ARMv7) 3.2、64位 ARM 架构 (ARMv8-A) 3.3、32位 Intel 架构 (x86) 3.4、64位 Intel 架构 (x86-64…

vue+element-ui的列表查询条件/筛选条件太多以下拉选择方式动态添加条件(支持全选、反选、清空)

1、此功能已集成到TQueryCondition组件中 2、最终效果 3、具体源码(新增moreChoose.vue) <template><el-popoverpopper-class"t_query_condition_more":bind"popoverAttrsBind"ref"popover"v-if"allcheckList.length>0"…

本地VSCode连接远程linux环境服务器的docker

目录 1、安装远程SSH 2、连接远程主机 3、远程中安装docker 4、查看容器 &#xff08;1&#xff09;直接查看容器和镜像 &#xff08;2&#xff09;使用命令查看 最近在新服务器中执行程序&#xff0c;要用到远程的docker。但是命令行环境下查看代码非常不方便&#xff0…

upload-labs 1-19关 攻略 附带项目下载地址 小白也能看会

本文章提供的工具、教程、学习路线等均为原创或互联网收集&#xff0c;旨在提高网络安全技术水平为目的&#xff0c;只做技术研究&#xff0c;谨遵守国家相关法律法规&#xff0c;请勿用于违法用途&#xff0c;如有侵权请联系小编处理。 环境准备&#xff1a; 1.靶场搭建 下…

Nsight System and Nsight Compute 性能分析工具

Nsight System 系统级别去分析性能&#xff0c;也就是宏观方向。 Achieved Accupacy低&#xff1a;在Nsight System pipline可以直接看出来 kernel launch 延迟&#xff1a;cpu发起gpu执行kernel过程中&#xff0c;有个kernel launch环节&#xff0c;grid block。优化方法&a…

ScrollView(滚动条)

1.滚动到底部&#xff1a; 我们可以直接利用ScrollView给我们提供的:fullScroll()方法&#xff1a; scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部 scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部 另外用这玩意的时候要小心异步的玩意&#xff0c;就是a…

iOS 18:照片应用添加“恢复”相册,可恢复数据库损坏所丢失照片!

小伙伴们可能在使用 iPhone 拍摄时遇到“明明拍下了&#xff0c;但是相册中却根本没有相关照片”的问题&#xff0c;而在 iOS 18 / macOS 15 中&#xff0c;苹果公司悄悄为“照片”应用引入了一项“恢复”功能以解决相关 Bug。 按照苹果的描述&#xff0c;照片、视频丢失可能是…

XXE漏洞复现

XML外部实体注入(XML Extenrnal Entity Injection)&#xff0c;简称XXE漏洞。引发XXE漏洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用&#xff0c;导致服务端在解析用户提交的XML信息时未作处理直接进行解析&#xff0c;导致加载恶意的外部文件和代码&#xff…

一文剖析高可用向量数据库的本质

面对因电力故障、网络问题或人为操作失误等导致的服务中断&#xff0c;数据库系统高可用能够保证系统在这些情况下仍然不间断地提供服务。如果数据库系统不具备高可用性&#xff0c;那么系统就需要承担停机和数据丢失等重大风险&#xff0c;而这些风险极有可能造成用户流失&…

SpringBoot通过3种方式实现AOP切面

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

实战内测-某内测项目站点FUZZ到Sql注入

0x1 前言 下面给师傅们分享的案例呢是前段时间实战的一个站点&#xff0c;也是我朋友前段时间让我测的一个站点。整体的测试流程也还算ok&#xff0c;然后里面有些细节要是对师傅们有帮助可以收藏下&#xff0c;后面主要是利用FUZZ打了一个sql注入漏洞上去。 0x2 fuzz和sql结…

MAC安装acl

在编译前&#xff0c;需要先从 github https://github.com/acl-dev/acl 下载源码&#xff0c;国内用户可以选择从 gitee https://gitee.com/acl-dev/acl 下载源码。 3.1、Linux/Unix 平台上编译安装 在 Linux/Unix 平台上的编译非常简单&#xff0c;可以选择使用 make 方式或 …

【高校科研前沿】马里兰大学地理科学系在环境科学Top期刊发文:美国本土湿地因不透水面而损失的热点区域

1.文章简介 论文名称&#xff1a;Hotspots of wetland loss to impervious surfaces in the conterminous United States&#xff08;美国本土湿地因不透水面而损失的热点区域&#xff09; 第一作者及单位&#xff1a;Zhenhua Zou&#xff08;马里兰大学(美国)|助理研究教授&a…