HashCode与String大家庭

news2024/9/17 7:19:53

当金钱站起来说话时,所有的真理都保持了沉默;金钱一旦作响,坏话随之戛然而止。
在这里插入图片描述

Hashcode的作用

java的集合有两类,一类是List,还有一类是Set

前者有序可重复,后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会比较慢。

于是有人发明了哈希算法来提高集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域

hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,他就可以直接存储在这个位置上,不用在进行任何比较了;如果这个位置上已经有了元素,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其他的地址,这样一来实际上调用equals方法的次数就大大降低了,几乎只需要一两次。

String、StringBuffer、StringBuilder

String是只读字符串,它并不是基本数据类型,而是一个对象,从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改查。每次对String的操作都会生成新的String对象

private final char value[];

每次+操作:隐式在堆上new了一个跟原字符串相同的StringBuffer对象,在调用append方法拼接+后面的字符

StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder抽象类中我们可以看到

/**
* The value is used for character storage.
*/
char[] value;

他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和StrignBuilder来进行操作

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,

StringBuilder并没有对方法进行加同步锁,所以是线程不安全的。
在这里插入图片描述

二分查找

题目:有序矩阵中第 K 小的元素

难度:🌟🌟🌟

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix

给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。

你必须找到一个内存复杂度优于 O(n2) 的解决方案。

示例 1:

输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
输出:13
解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13

示例 2:

输入:matrix = [[-5]], k = 1
输出:-5

请先思考!!!!

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

答答答答答答答答答答答

案案案案案案案案案案案

往往往往往往往往往往往

下下下下下下下下下下下

翻翻翻翻翻翻翻翻翻翻翻

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        int[] target = new int[matrix.length * matrix[0].length];
        int count = 0;
        for(int i = 0 ; i < matrix.length ; i++){
            for(int j = 0 ; j < matrix[i].length ; j++){
                target[count] = matrix[i][j];
                count++;
            }
        }
        Arrays.sort(target);
        return target[k-1];
    }
}

题解:暴力破解法,思路就是遍历二维数组然后存到一个一维数组中,然后对一维数组进行排序,直接返回下标为k-1的数值就行了

class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        // 先确定范围
        int n = matrix.length;
        int l = matrix[0][0];
        int r = matrix[n-1][n-1];
        while(l < r){
            int midder = l + ((r-l) >> 1);
            if(check(matrix, n, k, midder)){
                r = midder;
            }else {
                l = midder + 1;
            }
        }
        return l;
    }

    public boolean check(int matrix[][], int n, int k, int mid){
        // 先从左下角开始,符合条件就往右,不符合就往上计算数量
        int i = n - 1;
        int j = 0;
        int num = 0;
        while (i >= 0 && j < n) {
            if (matrix[i][j] <= mid) {
                num += i + 1;
                j++;
            } else {
                i--;
            }
        }
        return num >= k;
    }
}

题解:二分查找法,简单理解就是我们要找的目标值就是在二维数组的(0,0)(n-1,n-1)之间,此时我们就可以找这个范围数值的中间值,每找一次中间值就要计算一个小于中间值的个数,如果这个中间值不小于k那么右边的r往左移相反L往右移,最终的L就是我们要找的数值

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

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

相关文章

Vue传参${id}变成$%7Bid%7D

发生缘由 外卖项目在Linux服务器上面运行发送请求乱码 运行环境 电脑系统&#xff1a;win10jdk版本&#xff1a;jdk-8SpringBoot版本&#xff1a;v2.4.5MP版本&#xff1a;3.4.2Vue版本&#xff1a;Vue.js v2.6.12Linux版本&#xff1a;Centos7 报错信息 // 修改页面反查详…

MES系统中的BOM为何如此重要?先进的BOM体系怎么构建?

其实不管有没有数字化&#xff0c;BOM都是制造企业的灵魂纽带&#xff0c;对于产品繁多、流程冗长的工业企业来说&#xff0c;如果BOM管理不规范&#xff0c;必然对生产效率和产品质量带来巨大的隐患&#xff0c;因此在工业企业的数字化转型之路中&#xff0c;建立科学规范的BO…

Blender 建模练习-锁链

目录 1.1.1 贝塞尔圆1.2 阵列修改器1.3 阵列修改器 物体偏移1.4 添加贝塞尔曲线1.5 曲线修改器 1. 本次练习主要使用到阵列修改器、贝塞尔曲线、空物体 1.1 贝塞尔圆 把贝塞尔圆进行缩放&#xff0c;然后在物体数据属性|几何数据|倒角|设置倒角深度为0.05 1.2 阵列修改器 …

【数据结构】二叉树(详细)

二叉树 1.树1.1定义1.2基本术语1.3树形结构和线性结构1.4树的存储结构1.4.1双亲表示法1.4.2孩子兄弟表示法 2.二叉树2.1定义2.2特殊二叉树2.3性质2.4存储结构2.4.1顺序存储2.4.2链式存储结构 3.二叉树的基本操作3.1前序遍历&#xff08;先序遍历&#xff09;3.2中序遍历3.3后序…

开放原子训练营(第三季)inBuilder低代码开发实验室---报销单录入系统

作为一名低代码初学者&#xff0c;我使用inBuilder系统设计了一款报销单录入系统&#xff0c;实现了报销单录入与显示报销单列表的功能&#xff08;如图1与图2所示&#xff09;&#xff0c;并获得了很多开发心得。从inBuilder系统的优点、缺点以及开发过程三方面出发&#xff0…

go继承nacos配置中心并读取配置信息

配置中心 为什么需要配置中心 平时我们写一个demo的时候&#xff0c;或者说一个单体的应用&#xff0c;都会有一个配置文件&#xff0c;不管是 json文件或者yaml文件&#xff0c;里面包含了redis,mysql,es等信息&#xff0c;如果我们修改了配置文件&#xff0c;往往我们需要重…

和Ai一起学习CMake(一)

和Ai一起学习CMake 现在人工智能爆火&#xff0c;ChatGPT、new bing等层出不穷。我们借助Ai来学习一下CMake。下面是我与Ai的问答&#xff0c;这个学习主要是通过Ai来学习&#xff0c;但是防止Ai乱说话&#xff0c;我会结合自身的知识和实际操作给出相应的补充。 我的环境如下…

玄子Share - Tomcat 9 安装配置教程(含安装包)

玄子Share - Tomcat 9 安装配置教程&#xff08;含安装包&#xff09; 下载 下载链接 官网 https://tomcat.apache.org/ 下载教程 进入 Tomcat 官网&#xff0c;点击左侧导航栏&#xff0c;选择需要的版本下载。这里按照课程要求选择tomcat 9的版本 Mirrors&#xff1a;选…

为什么越来越多的企业开始选择云计算?

一、前言 随着数字化时代的到来&#xff0c;企业对于数据的需求越来越大&#xff0c;而传统的数据存储方式已经无法满足企业的需求。云计算作为一种新兴的技术&#xff0c;可以为企业提供更加灵活、高效、安全的数据存储和处理方式&#xff0c;因此越来越多的企业开始选择云计算…

element ui el-calendar日历组件使用总结

el-calendar日历组件使用总结 1. 需求说明2. 基础实现3. 只展示当月数据4. 动态切换日历里的数据实现5. 顺便把快捷方式隐藏了&#xff0c;不让用户选择上一个月下一个月 1. 需求说明 按月显示&#xff0c;每次只显示一个月的日期&#xff0c;其余隐藏 日历组件的显示时间随着…

数值分析-牛顿插值公式

目录 一、引言 二、牛顿插值公式的基本概念 1.插值问题 2.插值多项式 3.牛顿插值公式 三、牛顿插值公式的推导过程 四、牛顿插值公式的应用 1.图像处理 2.信号处理 五、牛顿插值公式的优缺点 1. 优点 2. 缺点 六、总结 一、引言 在数值分析中&#xff0c;插值是一…

干掉复杂的Java工具类,Hutool 工具库确实香~

Hutool 大家已经比较熟悉了&#xff0c;这是一个超全的 Java 工具库&#xff0c;深受国内开发者的喜爱。 我之前其实是不太喜欢使用这种功能太多的工具类的&#xff0c;也比较担心稳定性和安全性&#xff0c;后面慢慢接受了就感觉其实也还好。而且&#xff0c;我们还可以按需只…

如何优雅地停掉线程?

很久很久以前&#xff0c;在一个名为“Springboot”的村庄中&#xff0c;住着一群热爱编程的程序员。他们喜欢探索新技术、优化自己的代码&#xff0c;为了打造更好的软件而不断努力着。 在这个村庄中&#xff0c;有一个名叫小明的程序员&#xff0c;他是村庄中最优秀的程序员…

等概率随机函数设计技巧

文章目录 1. 关于Math.random()函数2. 用1 ~ 5的随机函数加工出1 ~ 7的随机函数3. LeetCode 470. 用 Rand7() 实现 Rand10()4. 把不等概率随机函数变成等概率随机函数5. 用a ~ b的随机函数加工出c ~ d的随机函数 1. 关于Math.random()函数 Java 中 Math.random() 函数是等概率…

微服务和领域驱动

一、微服务 1.1 什么是微服务 微服务就是一些协同工作的小而自治的服务。 关键词&#xff1a; 小而自治 -- 小 “小”这个概念&#xff0c;一方面体现在微服务的内聚性上。 内聚性也可以称之为单一职责原则&#xff1a;“把因相同原因而变化的东西聚合到一起&#xff0c;…

python能成为编程届的网红么?

Python本身就是编程语言届的网红&#xff0c;Python&#xff0c;年龄可能比很多读者都要大&#xff0c;但是它在更新快速的编程界却一直表现出色&#xff0c;甚至有人把它比作是编程界的《葵花宝典》&#xff0c;只是Python的速成之法相较《葵花宝典》有过之而无不及。 但是能…

短视频矩阵系统.代码实时分享

短视频矩阵系统核心技术研发是为满足现代社交网络时代用户对视频分享和观看的需求而推出的一项技术。它旨在提供高质量的视频传输、智能推荐算法、实时互动等功能。短视频矩阵系统设计上考虑了多个关键技术&#xff0c;包括多媒体编解码技术、网络通讯技术、机器学习算法等。通…

[pgrx开发postgresql数据库扩展]附.更新开发环境安装脚本

pgrx更新到0.83之后&#xff0c;我本来还没感觉&#xff0c;但是我五一放假一来&#xff0c;发现我的WSL环境居然就挂了…… 果然是非稳定版本就是不靠谱了…… 所以我干脆搞了个虚拟机&#xff0c;重新安装了一套&#xff0c;还别说&#xff0c;更新到了0.83之后&#xff0c;安…

(十一)地理数据库创建——创建新的地理数据库

地理数据库创建——创建新的地理数据库 目录 地理数据库创建——创建新的地理数据库 1.地理数据库概述2.地理数据库建立一般过程2.1地理数据库设计2.2地理数据库建立2.2.1从头开始建立一个新的地理数据库2.2.2移植已经存在数据到地理数据库2.2.3用CASE工具建立地理数据库 2.3建…

学习HCIP的day.04

目录 七、关于OSPF的不规则区域问题 1、通过隧道链路&#xff08;Tunnel&#xff09; 2、OSPF的虚链路配置 3、多进程双向重发布 八、OSPF的数据库表 九、OSPF优化 1、汇总 2、特殊区域 --- 用于减少各个非骨干区域的LSA数量 七、关于OSPF的不规则区域问题 分为两种情…