7月22日JavaSE学习笔记

news2024/9/25 7:21:45

Collection接口,还有一个父级接口Iterable可迭代的

Collection继承树

Set 集合

Set的底层是用Map实现(存储在key中,value中是空的Object对象)

有序:取出的顺序和添加的顺序是一样的。

List是有序的,Set是无序的(LinkedHashSet是有序集合,同时维护了一个链表结构)

实例化Set集合:HashSet

        HashSet set = new HashSet();
        set.add("12");
        set.remove("123");
        set.size();
        set.add("12");
        int size = set.size();
        System.out.println(size);//两次添加12算同一个元素

添加元素:Set不能存储相同的数据(使用equals比较是不是同一个元素)

        //Set中不能存储相同的数据
        set.add(456);//456存储的是Integer类型
        set.add(456);
        size = set.size();//用equals比较是否是同一个元素
        System.out.println(size);

HashSet可以存储null值

        set.add(null);//可以存储null
        size = set.size();
        System.out.println(size);
        for(Object item:set){
            System.out.println(item);
        }

TreeSet:以红黑树的形式存储

TreeSet内部使用二叉树,内部节点是可比较的,默认情况下不能存储不同的类型

左子树比根节点小,右子树比根节点大

存入数据:

        TreeSet treeSet = new TreeSet<>();
        //存入数据
        treeSet.add(2);
        treeSet.add(200);
        treeSet.add(3);
        treeSet.add(88);
        treeSet.add(45);
        treeSet.add(72);
        treeSet.add(1);
        treeSet.add(99);

不能存入null,null值无法比较

遍历:按数值大小的顺序输出(TreeSet的遍历顺序是中序遍历

        for(Object item:treeSet){
            System.out.print(item + ",");
        }
        System.out.println();

树的遍历:按访问根节点的顺序

先序遍历:先访问根节点,再访问左子树,再访问右子树

先序遍历

中序遍历:先访问左子树,再访问根节点,再访问右子树

中序遍历

后序遍历:先访问左子树,再访问右子树,最后访问根节点

后序遍历

对于自定义的类型,想要用TreeSet存储需要实现Comparable接口

class Student implements Comparable{
    int score;
    @Override
    public String toString() {
        return "学生的成绩是" + score;
    }
    @Override
    public int compareTo(Object o){
        if(o instanceof Student){
            Student item = (Student)o;
            if(this.score== item.score){
                return 0;
            }
            return this.score> item.score?1:-1;
        }else {
            //如果o对象不是Student就无法比较   这是程序运行时出现的特殊情况
            //这种特殊情况叫做异常    我们的方法处理不了这种业务,就要抛出一个异常对象
            //告知调用此方法的代码
            throw new RuntimeException("传入对象不可比较");
        }
    }
}

或者传入一个比较器Comparator

        //比较器
        Comparator<Student> com=(a,b)->{
            if(a.score == b.score){
                return 0;
            }
            return a.score>b.score?1:-1;
        };

用TreeSet存储Student类型:

        TreeSet<Student> stuTreeSet = new TreeSet<>(com);
        Student stu1= new Student();stu1.score=89;
        Student stu2 = new Student();stu2.score=79;
        Student stu3 = new Student();stu3.score=69;
        stuTreeSet.add(stu1);
        stuTreeSet.add(stu2);
        stuTreeSet.add(stu3);
        for(Student item:stuTreeSet){
            System.out.println(item);
        }

LinkedHashSet:在集合结构的基础上,同时维护了一个链表结构用于存储前后节点,从而实现有序存储。


Map 映射

Map存储的是键值对:键(key),就是名字;值(value),存储的对象。

key是无序且唯一的,value可重复

实例化:HashMap

存储数据:

        Map map = new HashMap();
        //存储数据
        map.put("A1","张三");
        map.put("A2","李四");
        map.put("A3","王五");
        map.put("A4","赵六");

通过key获取存入的对象value

        //可以通过存入的key获取存入的对象value
        Object obj=map.get("A1");
        System.out.println(obj);

通过key删除键值对

        //通过key删除键值对
        //传入key,返回删除的value值
        Object rem_obj = map.remove("A1");
        System.out.println("删除的value值:"+rem_obj);
        //同时传入key和对应的value,返回boolean,不匹配删不掉
        boolean bool = map.remove("A2","李四");

是否包含key

        //是否包含key
        map.containsKey("A1");

是否包含value

        //是否包含value
        map.containsValue("张三");

获取所有的key

        Set setKey = map.keySet();
        System.out.println(setKey);

获取所有的value

        Collection con = map.values();
        System.out.println(con);

TreeMap:key应该是可以比较的,不可以是null

Hashtable:是一种历史遗留的类型,没有使用驼峰命名法

        1. Hashtable的key和value都不能是null;

        2. Hashtable是线程安全的,和Vector一样性能较差

        Hashtable ht=new Hashtable();//历史遗留
        ht.put("t1","张三");

LinkedHashMap:有序的

        LinkedHashMap lMap=new LinkedHashMap();
        lMap.put("01","小明");

ConcurrentHashMap:线程安全的,效率较高

线程安全的Map有两个:Hashtable、ConcurrentHashMap(性能优异,锁的颗粒度比较小)


HashMap的底层实现:数组+链表

        1. HashMap 数组的默认容量16 ,每次扩容 2倍

        2. 扩容阈值 0.75 超过16*0.75=12就要扩容

        3. 为加快检索效率可能会树化 最小树化阈值 8,即一个链上的元素超过8就对该链进行树化

        4. 一支树上的元素低于6个,这个树就会退化成链

        5. 最小树化容量阈值 64,数组容量要达到64才能树化

        6. 如果数组的长度没有达到64,优先扩容,重新分配存储的位置

存入过程:

先计算hash值跟数组长度按位与运算得到数组长度之内的下标,找到对应位置;如果为空就存入该位置,不为空就先判断链表上所有元素的key值是否有一致的,有一致更新对应key的value值;都不一致就存入以数组内对应位置的对象为起始点的链表的最后;当数组内元素的个数超过当前数组容量*扩容阈值0.75,或者单个链的长度超过最小树化阈值8而数组长度没有达到64,优先扩容2倍,同时重新分配元素的存储位置;一个链的元素超过8,数组容量达到64,对这个链进行树化;一支树的元素低于6个,这个树就会退化


泛型

泛型:广泛的数据类型,确保类型安全的一种途径

类型不安全:类型转换失败

        List list=new ArrayList();
        list.add("123");
        //list.add(new Object());

        for(Object object:list){
            //类型转换时没有明确对象的数据类型,进行强制数据类型转换
            //会抛出 ClassCastException(类型转换异常)
            //类型不安全
            String str = (String)object;
            System.out.println(str);
        }

确保类型转换成功(类型安全)的方式:

        1.使用泛型

        2. instanceof 检查类型是否一致        a.getClass()==b.getClass()

定义泛型:在类或方法上定义

public class EasyGenericity<J,M,N,Y,E,T,K,V,Easy> {

    private M m;

    public void test(M m,N n){}

    public <E> E test(E e){ //就近原则,E是方法定义的泛型
        //表明返回的类型和传入的类型是相同的
        //在方法上定义泛型,在方法返回值前面加尖括号
        return e;
    }
}

定义上限:要继承自某类

    public static void main(String[] args) {
        testA(new ArrayList<>());
        //testA(new HashSet<>());//没有继承自List
        //类型安全
    }

    public static <J extends List> J testA(J j){//表明泛型J要继承自List,定义上限
        return j;
    }

定义下限:是某类的超类(包括本身)

public class EasyGenericity<J,M,N,Y,E,T,K,V,Easy> {

    public static void main(String[] args) {
        List<A> list1=new ArrayList<>();
        List<B> list2=new ArrayList<>();
        List<C> list3=new ArrayList<>();

        testAA( list2,new B());//根据第二个参数的类型约束第一个参数必须是B的超类
        //list1、list2可以,list3不行

    }
    //定义下限
    public static <A> void testAA(List<? super A> a,A p){
    }
}
class A{}
class B extends A{}
class C extends B{}

泛型的使用:

        //泛型的使用
        List<String> listA = new ArrayList<>();//只能存储String类型
        //泛型的检查在声明上,后面空的可以不写(即Object,只起传递作用)
        //在编译的时候起作用,在运行的时候不起作用
        listA.add("123");

        Map<String,Object> map = new HashMap<>();
        //存入123是存封装类型,有一个装箱的操作

子类向父类传递泛型

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

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

相关文章

Idea2024 创建Meaven项目没有src文件夹

1、直接创建 新建maven项目&#xff0c;发现没有src/main/java 直接新建文件夹&#xff1a;右击项目名->new->Directory 可以看到idea给出了快捷创建文件夹的选项&#xff0c;可以根据需要创建&#xff0c;这里点击src/main/java 回车&#xff0c;可以看到文件夹已经创建…

搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)

目录 搭建本地私有知识问答系统:MaxKB、Ollama 和 Llama3 实现指南引言MaxKB+Ollama+Llama 3 Start buildingMaxKB 简介:1.1、docker部署 MaxKB(方法一)1.1.1、启用wls或是开启Hyper使用 WSL 2 的优势1.1.2、安装docker1.1.3、docker部署 MaxKB (Max Knowledge Base)MaxKB …

解决Windows 11更新错误0x800f081f的详细指南

在尝试更新Windows 11时&#xff0c;用户可能会遇到各种错误代码&#xff0c;其中之一是0x800f081f。这个错误通常与Windows更新组件或系统文件的损坏有关。本文将提供解决这一特定错误的详细步骤&#xff0c;并解释可能的原因。 错误代码0x800f081f概述 错误代码0x800f081f指…

【LLM】-08-搭建问答系统-语言模型,提问范式与 Token

目录 1、语言模型 1.1、训练过程&#xff1a; 1..2、大型语言模型分类&#xff1a; 1.3、指令微调模型训练过程&#xff1a; 2、Tokens 3、Helper function辅助函数 (提问范式) 4、计算token数量 1、语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词…

【数据结构】搜索二叉树

二叉搜索树 二叉树的博客 在之前的数据结构的文章中已经基本对二叉树有一定的了解&#xff0c;二叉搜索树也是一种数据结构&#xff0c;下面将对二叉搜索树进行讲解。 二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有下面性…

汇凯金业:区块链技术包括哪些技术

区块链&#xff0c;作为一项颠覆性的技术&#xff0c;其应用场景日益广泛。然而&#xff0c;很多人对于区块链技术的组成部分却知之甚少。本文将深入探讨区块链技术所包含的各种技术组件&#xff0c;揭示其背后的工作原理&#xff0c;帮助读者更全面地理解区块链。 区块链技术…

最优化大模型效果之 RAG(一):Naive RAG

Hi&#xff0c;我是 Hyde&#xff0c;今天的话题是 RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;一种用于优化大模型效果的方法&#xff0c;翻译成中文就是检索增强生成。 在之前的文章《最优化大模型效果的方向和思考》中&#xff0c;我们提到当前…

Google Test 学习笔记(简称GTest)

文章目录 一、介绍1.1 介绍1.2 教程 二、使用2.1 基本使用2.1.1 安装GTest &#xff08;下载和编译&#xff09;2.1.2 编写测试2.1.3 运行测试2.1.4 高级特性2.1.5 调试和分析 2.2 源码自带测试用例2.3 TEST 使用2.3.1 TestCase的介绍2.3.2 TEST宏demo1demo2 2.3.3 TEST_F宏2.3…

2-45 基于matlab的递归最小二乘法(RLS)对声音信号去噪

基于matlab的递归最小二乘法&#xff08;RLS&#xff09;对声音信号去噪,并对消噪前后的信号进行FFT分析&#xff0c;对比消噪前后的效果。可替换自己的声音信号进行分析。程序已调通&#xff0c;可直接运行。 2-45 递归最小二乘法&#xff08;RLS&#xff09; FFT分析 - 小红书…

聘请TPM管理咨询公司如何赢得员工认可?

聘请TPM管理咨询公司是一个重要的决策&#xff0c;它不仅能提升企业的运营效率和质量管理水平&#xff0c;而且需要得到员工的广泛认可才能确保改革的顺利实施。然而&#xff0c;赢得员工的认可并非易事&#xff0c;需要公司管理层和咨询公司共同努力&#xff0c;采取一系列措施…

崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB》&#xff08;作者&#xff1a;小草&#xff09;&#xff0c;满满…

C++ | Leetcode C++题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution { public:int hIndex(vector<int>& citations) {int n citations.size();int left 0, right n - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > n - mid) {right m…

C++ primer plus 第16章string 类和标准模板库, 函数符概念

C primer plus 第16章string 类和标准模板库, 函数符概念 C primer plus 第16章string 类和标准模板库, 函数符概念 文章目录 C primer plus 第16章string 类和标准模板库, 函数符概念16.5.1 函数符概念程序清单16.15 functor.cpp 16.5.1 函数符概念 正如 STL定义了容器和迭代…

【AOP实战】掌握Spring Boot AOP:重构代码,提升效率

文章目录 Spring Boot AOP - 面向切面编程AOP到底有什么不同AOP中的编程术语和常用注解定义切面环绕通知通知方法传参总结 Spring Boot AOP - 面向切面编程 AOP&#xff0c;即面向切面编程&#xff0c;其核心思想就是把业务分为核心业务和非核心业务两大部分。例如一个论坛系统…

ESP32和mDNS学习

目录 mDNS的作用mDNS涉及到的标准文件组播地址IPv4 多播地址IPv6 多播地址预先定义好的组播地址 mDNS调试工具例程mDNS如何开发和使用注册服务查询服务 mDNS的作用 mDNS 是一种组播 UDP 服务&#xff0c;用来提供本地网络服务和主机发现。 你要和设备通信&#xff0c;需要记住…

PHP基础语法-Part1

脚本格式 PHP脚本以<?php开头&#xff0c;以?>结尾&#xff1b; PHP语句以分号结尾&#xff08;;&#xff09; PHP是解释型语言&#xff1b; 输入和输出 获取用户的输入&#xff1a; $input readline("input:"); echo $input; echo "input:";…

EEtrade:区块链是什么

区块链&#xff0c;这个近年来频繁出现在我们视野中的术语&#xff0c;已经从一个技术小众圈的词汇&#xff0c;逐渐演变为全球关注的焦点。从比特币的诞生&#xff0c;到如今在金融、供应链、物联网等领域的广泛应用&#xff0c;区块链技术正在深刻地改变着我们的生活。那么&a…

将YOLOv8模型从PyTorch的.pt格式转换为TensorRT的.engine格式

TensorRT是由NVIDIA开发的一款高级软件开发套件(SDK)&#xff0c;专为高速深度学习推理而设计。它非常适合目标检测等实时应用。该工具包可针对NVIDIA GPU优化深度学习模型&#xff0c;从而实现更快、更高效的运行。TensorRT模型经过TensorRT优化&#xff0c;包括层融合(layer …

ARCGIS PRO DSK GraphicsLayer创建文本要素

一、判断GraphicsLayer层【地块注记】是否存在&#xff0c;如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十六章 设备驱动IO控制

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…