深入Java中间件:编程设计精粹

个人主页: 进朱者赤

阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名

引言

在Java中间件和框架里蕴藏着数不尽的编程设计精粹。这些设计不仅值得我们在日常编码中借鉴使用,更是深入学习Java编程的宝贵资源。今天,让我们一起深挖几处精妙的设计,看看它们是如何优雅和高效的解决问题。

HashMap的优化技巧

Java的HashMap是一个典型的哈希表实现,其设计上的一些技巧使它成为一个非常高效的数据结构。以下是其精彩设计部分的解读。

散列值的重新分布

在HashMap中,键的散列值是通过hashCode()方法生成的,为了使得生成的散列值更加分散,减少碰撞的可能,HashMap使用了一种高低位异或的方式来重新分布散列值。

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

索引计算的位操作

而在计算键值存储索引的时候,HashMap采用了(length-1) & hash的方式,而非普遍的取模操作hash % length。这是因为当length是2的整数幂时,这样的位操作等同于取模操作,但效率更高。

String的intern技巧

在String类的设计中,intern()方法的实现使用了一个字符串常量池。每当我们在代码中创建一个字符串字面量,JVM就会检查字符串常量池,如果已经存在相同内容的字符串,就会返回常量池内的实例引用,这样做节省了内存,提高了性能。

NIO Buffer的设计亮点

在Java的NIO包中,Buffer类有一系列的设计亮点,让其在进行IO操作时具有更高的效率和更好的可控性。

直接和非直接Buffer
解决数据在Java堆和原生内存转移时存在的效率问题,NIO引入了直接Buffer(即直接内存),其使用操作系统的内存,减少了Java堆和原生内存的中转,提高了效率。

mark()reset()方法
Buffer类提供了mark()reset()方法,这些方法为我们在Buffer中的数据操作提供了书签(bookmarking)功能。

只读Buffer
通过调用asReadOnlyBuffer()方法可以获得一个只读的Buffer视图。这是一个很好的防护性编程技巧,可以防止数据被修改。

Stream的中间操作和终端操作

Java 8的Stream API引入了新的操作模式,允许我们使用声明式的方式处理集合,并利用多核架构。这种方法中最为精妙的设计包括中间操作和终端操作。

中间操作的惰性求值

中间操作如filter、map等是惰性的,这意味着它们不会立即进行计算。这一设计使Stream可以在一个管道链中组合多个操作,而不需要创建多个中间集合。

终端操作和流的关闭

终端操作如forEach、collect触发流的实际计算,这种设计提供了一个清晰的操作结束标记,并且允许资源在计算结束后被自动关闭。

Spring AOP的多继承模拟

Spring AOP通过代理模式提供了面向切面编程的能力。其Proxy设计旨在不改变原有类结构的情况下,允许我们插入额外的功能。

代理模式的设计精妙
代理类可以决定是否将后续的操作转发给目标对象,这种模式实际上实现了一种运行时的多继承关系,在许多其他语言中是困难或不可能实现的。

Netty中的零拷贝技术

Netty是一个高性能、异步的网络应用框架,它内部使用了零拷贝技术来提高数据传输的效率。零拷贝技术是一种避免不必要的数据拷贝的技术,它直接在内核缓冲区与用户缓冲区之间进行数据传输,减少了数据的移动次数。

在Netty中,我们可以使用FileRegion接口来实现零拷贝的文件传输。FileRegion封装了文件描述符和文件传输的起始位置及长度信息,当Netty进行文件传输时,它会直接利用这些信息将文件数据从内核缓冲区发送到网络,避免了数据的拷贝过程。

小结

通过深入研究Java中间件和框架的源码和设计模式,我们可以学习到许多高效和优雅的编程技巧。这些技巧不仅带给我们编程上的方便,更帮助我们理解面向对象编程的哲学以及设计原则,如单一职责、开闭原则、里氏替换等。通过实际应用这些原则,我们可以编写出更高质量的代码,让我们的应用稳定且易于维护。

欢迎一键三连(关注+点赞+收藏),技术的路上一起加油!!!代码改变世界

  • 关于我:阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️欢迎关注下面的公众号:进朱者赤,认识不一样的技术人。⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️

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

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

相关文章

2024.4.16

三个按键的中断 do_irq.c #include "mykey.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取中断号unsigned int irqno (GICC->IAR&0x3ff);switch (irqno){case 99://中断处理逻辑printf("KEY1_INTC\n&q…

jenkins构建微信小程序并展示二维码

测试小程序的过程中,很多都是在回头和前端开发说一句,兄弟帮我打一个测试版本的测试码,开发有时间的情况下还好,就直接协助了,但是很多时候他们只修复了其中几个bug,其他需要修复的bug代码正在编写&#xf…

健身管理小程序|基于微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)

健身管理小程序目录 基于微信开发健身管理小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 小程序端: 后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码…

策略模式(知识点)——设计模式学习笔记

文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义:定义一个算法族,并分别封装起来。策略让算法的变化独立于它的客户(这样就可在不修改上下文代码或其他策略的情况下…

八、OOP面向对象程序设计(三)

1、面向对象的内容 1)封装 什么是封装? 封装就是将属性私有化,提供公有的方法访问私有属性。 做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(setter)方法,用于对这些属性的访问。 如:private String name; public …

前端三件套学习笔记(持更)

HTML CSS 1、HTML&#xff0c;CSS&#xff0c;JS区别 HTML--结构 CSS--表现 JavaScript--行为 2、HTML5 中新增 1&#xff09;语义化标签 <header>、<main>页面主要内容、<aside>侧边栏、<footer>、<nav>、<article> 加载页面一块…

Redis 缓存预热、预热数据选取策略、缓存保温、性能边界

缓存预热 热点数据预热&#xff1a;根据业务分析或统计数据&#xff0c;确定热点数据&#xff08;经常被访问的数据&#xff09;&#xff0c;并将其提前加载到Redis缓存中。可以根据访问频率、访问量或其他业务指标来确定热点数据。定时预热&#xff1a;可以设置定时任务&…

灯光3-静态光照烘焙技术

UNITY静态光照烘焙技术是一种用于实现高质量光照效果的技术。它通过在场景中预计算光照信息&#xff0c;并将其存储在纹理或数据结构中&#xff0c;以便在运行时进行渲染。这种技术可以提供更真实的光照效果&#xff0c;并且可以在较低的运行时成本下实现。 在UNITY中&#xf…

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…

纯golang开发的mqtt server

Mochi-MQTT Server github地址&#xff1a;https://github.com/mochi-mqtt/server Mochi-MQTT 是一个完全兼容的、可嵌入的高性能 Go MQTT v5&#xff08;以及 v3.1.1&#xff09;中间件/服务器。 Mochi MQTT 是一个完全兼容 MQTT v5 的可嵌入的中间件/服务器&#xff0c;完…

【C语言】每日一题,快速提升(3)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;杨辉三角 在屏幕上打印杨辉三角。 1 1 1 1 2 1 1 3 3 1 ……......... 解答&#xff1a; 按照题设的场景&#xff0c;能发现数字规律为&#xff1…

Flink学习(六)-容错处理

前言 Flink 是通过状态快照实现容错处理 一、State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。 一种基于 RocksDB 内嵌 key/value 存储将其工作状态保存在磁盘上&#x…

【MogDB】在ORACLE和MogDB中查看存储过程出参游标数据的方式

一、前言 使用ORACLE作为数据库的应用软件中&#xff0c;偶尔会遇到使用游标作为出参的存储过程&#xff0c;这种存储过程迁移到MogDB并不需要进行改造&#xff0c;但是在开发这样的存储过程时&#xff0c;开发人员偶尔会想要在数据库中测试执行一下&#xff0c;看看游标中的数…

向量数据库中的向量是什么?

在向量数据库中&#xff0c;向量通常指的是高维空间中的点或方向&#xff0c;它们由一组数值组成&#xff0c;这些数值表示该点在空间中的位置或方向。在机器学习和人工智能领域&#xff0c;向量经常用于表示各种类型的数据&#xff0c;如文本、图像、音频等。 具体来说&#x…

项目5-博客系统1(准备工作+博客列表+博客详情页)

1.创建项目 导入以下依赖 2.项目介绍 使⽤SSM框架实现⼀个简单的博客系统 共5个页面 2.1 前端页面展示 2.1.1 用户登录 2.1.2 博客发表页 2.1.3 博客编辑页 2.1.4 博客列表页 2.1.5博客详情页 2.2 功能描述: ⽤⼾登录成功后, 可以查看所有⼈的博客. 点击 <<查看全⽂…

Big Data and Cognitive Computing (IF=3.7) 计算机/大数据/人工智能期刊投稿

Special Issue: Artificial Cognitive Systems for Computer Vision 欢迎计算机/大数据/人工智能/计算机视觉相关工作的投稿&#xff01; 影响因子3.7&#xff0c;截止时间2024年12月31日 投稿咨询&#xff1a;lqyan18fudan.edu.cn 投稿网址&#xff1a;https://www.mdpi.com/j…

2024 计算机毕业设计之SpringBoot+Vue项目合集(源码+L文+PPT)

各位朋友大家好&#xff0c;有幸与屏幕前你们相识&#xff0c;博主现已经搬砖9年&#xff0c;趁着头发还充裕&#xff0c;希望给大家提供一些编程领域的帮助&#xff0c;深知计算机毕业生这个阶段的崩溃与闹心&#xff0c;让我们共同交流进步。 博主给大家列举了项目合集&#…

如何在PPT中获得网页般的互动效果

如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了&#xff0c;获得网页般的互动效果&#xff0c;最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢&#xff1f; 接下来为你讲解如何获得&#xff08;此方法在 PowerPoint中行得通&#…

coredump-x: sanitizer编译出现segmentfault

https://bugzilla.redhat.com/show_bug.cgi?id=1669117 https://github.com/dmlc/xgboost/pull/8878 从上面两个链接,看着已经解决了,需要使用新版本的gcc。 https://github.com/dmlc/xgboost/issues/8863 Using only ubsan works. Using only thread sanitizer works. (wi…