学习mybatis源码疑惑一

Mybatis 源码学习(十二) —— binding 包 MapperRegistry、MapperProxyFactory、MapperProxy、MapperMethod、MethodSignature、SqlCommand、ParamMap的区别和作用详解。 Mybatis 动态代理的实现详解 Mybatis 如何实现接口和 SQL 的关系绑定 Mybatis 底层实现原理 阅读详情

一、背景

在学习mybatis源码时,在类org.apache.ibatis.datasource.pooled.PooledConnection 中发现一些程序片段


其中:变量CLOSE定义为 private static final String CLOSE = "close"; 

变量methodName也为String类型

二、疑惑描述

mybatis的作者在比较字符串时,为什么要先调用hashCode()进行比较,再调用equals方法?

三、猜测

因为jdk规范要求如果两个对象的equals()为true,那么它们的hashcode()的值必相等。mybatis的作者先用字符串的hashcode()进行比较,可以提高字符串的比较效率。

但是,如果先比较hashcode值可以提高字符串比较效率,为什么String.equals()方法中,没有先比较hashcode值呢?

四、验证

用junit写了个单元测试用例进行验证,代码如下:

package com.apex.mq.rabbitmq.interotc.client;

import static org.junit.Assert.*;

import java.util.Arrays;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class StringTest {
	private static final String CLOSE = "close";

	private String name;
	private boolean expected;

	@Parameters(name = "test compare consume time: {index}: when ({0})={1}")
	public static Iterable<Object[]> data1() {
		return Arrays.asList(new Object[][] { { "close", true },
				{ "equals", true }, { "toString", true }, { "hashcode", true },
				{ "getClass", true }, { "clone", true }, { "notify", true },
				{ "notifyAll", true }, { "wait", true } });
	}

	public StringTest(String name, boolean expected) {
		this.name = name;
		this.expected = expected;
	}

	@Test
	public void testConsumeTime() {
		assertEquals(expected, testHashCode() < testEquals());
	}

	private long testHashCode() {
		long beforeTimeMillis = System.currentTimeMillis();
		for (int i = 0; i < 1000000; i++) {
			boolean result = CLOSE.hashCode() == name.hashCode();
			result = false;
		}
		long endTimeMillis = System.currentTimeMillis();
		long consumeTime = endTimeMillis - beforeTimeMillis;
		System.out.println("Method: hashCode() consume time: " + consumeTime
				+ " when the string is " + name);
		return consumeTime;
	}

	private long testEquals() {
		long beforeTimeMillis = System.currentTimeMillis();
		for (int i = 0; i < 1000000; i++) {
			boolean result = CLOSE.equals(name);
			result = false;
		}
		long endTimeMillis = System.currentTimeMillis();
		long consumeTime = endTimeMillis - beforeTimeMillis;
		System.out.println("Method: equals() consume time: " + consumeTime
				+ " when the string is " + name);
		System.out.println();
		return endTimeMillis - beforeTimeMillis;
	}

}
执行结果出乎意料,hashcode()并没有equals()效率高,如下图:





五、结论(欢迎拍砖)

1、通过单元测试发现,hashcode()并没有equals()效率高,所以mybatis作者的这种写法,可能只是下意识认为这样效率高。


六、后续疑问

这种写法,会不会在大量、相似、很长的字符串比较中效率高?


分数间隔均衡器的基本原理及应用(使用Matlab) 通过对接收信号进行加权求和,分数间隔均衡器可以抵消信号在传输过程中受到的频率响应失真。Matlab提供了丰富的工具和函数,可以方便地实现分数间隔均衡器,并进行性能评估。分数间隔均衡器(Fractional Interval Equalizer)是一种数字信号处理技术,用于均衡带通信道中的信号失真。分数间隔均衡器的基本原理是通过对接收信号进行加权求和,以抵消信号在传输过程中受到的频率响应失真。分数间隔均衡器在通信系统中具有广泛的应用。最后,我们通过比较均衡后的信号和发送数据的阈值来进行解调,并计算误码率。 阅读详情

相关推荐

【技术解析】Point-NeRF:如何通过点云优化加速神经辐射场渲染

本文深入解析了Point-NeRF技术,它通过引入3D点云作为几何先验,有效解决了传统神经辐射场渲染速度慢的痛点。该方法利用神经点云构建局部辐射场,结合点剪枝与生长策略进行动态优化,在保证高渲染质量的同时,实现了高达30倍的训练加速,为高效3D场景重建提供了新范式。

weixin_29159127的博客 268

mybatis源码过程学习梳理

一、mybatis配置文件详情 在Spring中,是使用xml的配置文件或使用java代码对mybatis的连接属性,环境等进行配置的,我们先看一下mybatis中对配置文件中节点的要求。 通过mybatis官方网站中XML配置一栏,可以得出相应需求: properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environmen

hongbochen1223的专栏 1727

Openwork 入门指南:开源 AI 桌面助手快速上手

Openwork是一款开源的AI桌面代理工具,提供类似Claude Cowork的免费替代方案。它支持本地运行,确保隐私安全,并能高效处理文件整理、文档读写等任务。支持多种AI模型,通过MIT许可完全免费。安装简单,仅需运行命令行或下载桌面版,需配置API Key后即可使用。操作直观,支持多步骤规划和权限控制,适合自动化重复工作。目前主要支持macOS,未来将扩展至Windows/Linux。建议从简单任务入手,逐步掌握这一高效的数字助手工具。

3802

mybatis源码学习——开篇

mybatis源码学习——开篇

qq_41683000的博客 405

飞腾X100芯片GPU状态查询

本文档对在linux系统下查看X100芯片GPU状态信息进行说明,可以帮助大家了解芯片的实时工作状态。

乌拉大喵喵 2815

【无人机对抗】基于matlab无人机红蓝对抗仿真【含Matlab源码 4436期】

无人机红蓝对抗仿真 完整代码,包运行;可提供运行操作视频!适合小白!

Matlab3024528700的博客 1379

Mybatis源码深入学习

本文由个人学习源码所记,便于框架流程学习和加深理解

TianH_legend的博客 623

Vivado IP核综合失败别慌:除了打补丁,这个TCL命令也能救急(以Video Frame Buffer为例)

本文详细解析了Vivado IP核综合失败的排查方法,特别是针对Video Frame Buffer Read IP的常见问题。从补丁安装到深入分析DCP文件生成机制,再到使用强大的TCL命令`foreach ip_in_proj [get_ips] {compile_c [get_ips $ip_in_proj]}`强制重编译,提供了一套完整的解决方案。帮助开发者快速定位并解决IP核综合失败问题,确保项目顺利进行。

weixin_30892889的博客 424

MyBatis源码阅读——通过debug解析MyBatis运行流程

最近在阅读MyBatis框架的源码。发现它其实是一个非常值得阅读的框架。它灵活得运用了常见的设计模式去设计。值得我们去学习。我还是比较喜欢以debug阅读MyBatis的源码。

yyf的博客 1万+

React 源码解析 | Reconcile协调过程

上篇讲了React的工作流程,这篇详细的讲一下render过程中的beginWork函数,也就是深度优先创建Fiber树中"递"的过程。beginWork函数传入当前已经创建好的Fiber节点,返回创建/复用的第一个子FIber节点,也就是wip.child在renderRoot中,在开始创建整棵FIber树之前,会先调用prepareRefreshStack创建/复用一个新的HostRootFiber。

weixin_40710412的博客 1220

yolov26改进 | Neck篇 | 利用Gold-YOLO改进yolov26对小目标检测能力(全网独家首发)

本文介绍利用Gold-YOLO的Neck改进YOLOv26,通过信息聚集—分发机制GD,先全局汇聚不同层级特征,再将融合后的全局信息重新注入各尺度分支,增强浅层细节与深层语义之间的交互,减少传统Neck逐层传递造成的信息损失。该结构虽然融合路径更长,但能够在不过度增加延迟的前提下提升多尺度目标检测能力,尤其适合大小目标并存、尺度变化明显和复杂背景场景。本文将讲解GD机制、Neck替换、模块注册与配置方法,并提供完整代码、配置文件及Codex修改思路,方便直接复现、实验对比和二次创新。

Snu77的博客 293

Mybatis学习与问题

Mybatis学习与问题 遇到的问题 theType interface com.ahdeer.UserDao is not known to the MapperRegistry: 答:我自己是因为在 UserDao.xml 这个针对UserDao接口的配置写错了,我把mapper标签中的UserDao路径写错了。 关于使用代理对象执行dao接口的方法 步骤: 1、//读取配置文件 2、//创建SqlSessionFactory工厂 3、//使用工厂生产对象 4、//使用SqlSession创建Us

qq_41868117的博客 365

Linux内存从0到1学习笔记(10.1 BugsShooter之cma配置过小导致页迁移繁忙而内存申请失败)

通过向武神讨教,顺便记录cma内存有空间但页繁忙(页正被访问,无法迁移)迁移不了导致cma内存分配失败的排查过程。

从0到1,突破自己 1万+

SqlSessionTemplate使用SqlSessionFactoryBean实例化之谜(以及xml配置信息迁移到java的方法)

最近在学习mybatis源码时,发现了一个问题。 首先,在xml配置文件中配置了SqlSessionTemplate与SqlSessionFactoryBean。 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLoc

BHSZZY的博客 1204

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何优雅地本地化构建Mybatis源码

目录一.环境准备二. 源码构建2.1 parent 一.环境准备 不耽误各位想提升技术的热血沸腾的心情,不想啰嗦半天鸡汤废话,直接进入正题。 要想构建源码,大家都知道第一步干什么?github走起。 下载mybatis源码:https://github.com/mybatis/mybatis-3 下载mybatis依赖项目parent:https://github.com/mybatis/parent 二. 源码构建 上面环境准备,大家会存在一个疑问,构建Mybatis源码为什么要下载parent项目

增量星球 6415

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

为什么想要去探究Mybatis源码?(1)

为什么想要去探究Mybatis源码?(1) 关于Mybatis源码探究的专栏。 其我的专业是软件技术这个方向的,mybatis 许久以前就学了,但是心里一直存在一些疑惑。也上网查了,看过各种大佬的博客,对 于Mybatis的理解始终感觉不足。最后还是决定要来肝它。 文字功底一般,请谅解。 若有不足,还望能够指正。 喜欢一句话: “八小时以内谋生存,八小时以外谋发展”。 好奇: 你有没有好奇过,mybatis-config.xml是如何被加载的? mybatis-config.xml 中每个标签就是

北 135

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

mybatis源码_如何优雅地本地化构建Mybatis源码?

一.环境准备不耽误各位想提升技术的热血沸腾的心情,不想啰嗦半天鸡汤废话,直接进入正题。要想构建源码,大家都知道第一步干什么?github走起。下载mybatis源码:https://github.com/mybatis/mybatis-3下载mybatis依赖项目parent:https://github.com/mybatis/parent二. 源码构建上面环境准备,大家会存在一个疑问,构建My...

weixin_39802132的博客 194

mybatis疑惑--Mapper接口如何实例化

这几天在学习mybatis的时候,在通过mapper映射来处理的时候,发现Mapper的接口竟然可以实例化,但是在我们学习java的时候曾经说过因为接口没有具体的方法实现,不能够被实例化,主要作用就是被类来多继承,但是我所看到的的确实是接口被实例化了,如下所示: 而这相比于其他的普通java测试里面来说,多了一个会话工厂,所以刚开始猜测可以是会话工厂的底层中有猫腻。 开始分析mybat...

moxiaolin的博客 1万+

mybatis 不等于空字符串_Mybatis还有这种操作?浅析为什么要看源码

专注于Java领域优质技术,欢迎关注作者:肥朝前言很多人都有一个疑惑,为什么面试都喜欢问原理,问源码.但是实际工作根本用不上,也就是大家常说的,面试造火箭,进去拧螺丝.我身边也有不少朋友问过我,我给他们的回答是.如果不看源码,不懂原理,出了问题你怎么解决?他们给我的答复基本都是两个字:"搜索"。也确实,工作中大部分问题通过复制错误信息搜索都能解决,加上现在框架越来越多,拼积木式的编程方式加上搜索引...

weixin_39886238的博客 1225

Mybatis还有这种操作?浅析为什么要看源码

  很多人都有一个疑惑,为什么面试都喜欢问原理,问源码.但是实际工作根本用不上,也就是大家常说的,面试造火箭,进去拧螺丝.我身边也有不少朋友问过我,我给他们的回答是.如果不看源码,不懂原理,出了问题你怎么解决?他们给我的答复基本都是两个字:"搜索"。   也确实,工作中大部分问题通过复制错误信息搜索都能解决,加上现在框架越来越多,拼积木式的编程方式加上搜索引擎,让越来越多人产生了开发是件很容易的事的错觉.我也一直想举一个搜索几乎搜不到,要看源码才能弄懂其中缘由的例子.      正巧这件事发生在了

woliuqiangdong的博客 1644

源码感悟

最近一段时间在看各种源码,Spring,SpringMVC,nacos,Mybatis 感觉看源码一定要耐的住寂寞,烦躁、疑惑是很正常的,多看、多查、多问 加油,敬正在奋斗中的自己!! 转载于:https://www.cnblogs.com/longxok/p/10881581.html...

weixin_30646505的博客 98

Mybatis从创建SQLSessionFactory到获取Mapper源码分析

目录1.写在前面2.获取SqlSessionFactory对象3.获取SqlSession对象4.获取Mapper 1.写在前面 (1).InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); (2).SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); (3).SqlSession sqlSession = sqlS

shangshanzixu的博客 1276

Spring源码速成,原来学习源码能这么容易

前言 一定不要放弃阅读源码 “源码”这两个字想必大家一看到是有人爱有人恨。后者在于:费时费力还复杂太考验耐心!但优秀的源码中有着多年积淀下来的精华,可以说阅读源码小到对源码所提供的功能上的使用更加熟练,大到使我们的程序设计更加完美优秀。身为程序员的我们为了不被时代淘汰,为了在同级中脱颖而出,肯定是不能停止学习的!为什么我们就不能做到通读源码?让多数人的短处成为我们的长处! 如何学? 想要掌握阅读源码的方法,看书站在巨人的肩膀上学习肯定是很好的一个途径,但光看书肯定枯燥无味,看书结合视频才是快速掌握阅

wdjnb的博客 423

mybatis的执行流程

mybatis的执行流程如下代码: 第一步:通过Resources加载配置好的mybatis.xml配置文件。 Resources是ibatis.io包下面的类,也就是一个io流,用于读写文件,通过getResourceAsStream把xml文件加载进来,把配置文件解析为一个流。   第二步:然后看第二句话,这句话是关键。我们首先new了一个SqlSessionFactoryBuil...

落叶飘零z的博客 4万+

Mybatis还有这种操作?浅析为什么要看源码

很多人都有一个疑惑,为什么面试都喜欢问原理,问源码.但是实际工作根本用不上,也就是大家常说的,面试造火箭,进去拧螺丝.我身边也有不少朋友问过我,我给他们的回答是.如果不看源码,不懂原理,出了问题你怎么解决?他们给我的答复基本都是两个字:"搜索"。 也确实,工作中大部分问题通过复制错误信息搜索都能解决,加上现在框架越来越多,拼积木式的编程方式加上搜索引擎,让越来越多人产生了开发是件很容易的事的错觉...

weixin_30770783的博客 142

Mybatis-Spring源码分析(一) MapperScan

说到Mybatis想必大家都很熟悉,作为和Spring结合的非常紧密的一个数据库插件,其提供的便利性非常值得我们去学习。研读Mybatis-Spring的第一步就是要明白Mybatis是怎么把Mapper接口转化为MapperFactoryBean的,如果不了解这一步,基本上读源码也会读的知其然不知所以然。由于网上很多讲解MapperScan注解的都已经过时了,而Mybati-Spring的新版本已经对代码做了重大的修改,所以笔者根据比较新的mybatis-spring:2.0.5版本进行一个重新的解读,和

Smallc0de的博客 757
上一篇: SMTP协议分析
下一篇: 使用反射和动态代理实现mybaits的mapping.xml热部署
拓-拓
博客等级 码龄12年 10粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值