标签: Java

晚风 | 2024-06-18 | Java后端相关

盘点历届 Java 语言的关键字,一定有你不认识的

在 Java 编程语言中,关键字是具有特殊含义的保留字,它们用于表示语言中的特定功能和操作。 了解和正确使用这些关键字对于编写高效、可靠的 Java 程序至关重要。 今天通过这篇文章,我们一起来了解一下相关的关键字以及含义。 一、关键字汇总 二、访问控制 ✓表示可以访问,x表示不能访问 2.1、private(私有化) private 关键字是访问控制修饰符,可以应用于内部类、方法或类的变量字段。只能在声明 private(内部)类、方法或字段的类中引用这些类、方法或字段。在类的外部或者对于子类而言,它们是不可见的。 2.2、default(缺省) default:关键字是可以应用于类、方法或类的变量字段的访问控制修饰符。当没有指定类的访问权限的时...

 368 |  0 |  0 Java后端相关

渣渣辉 | 2024-06-07 | Java后端相关

Java 泛型编程所说的类型擦除到底是什么?

什么是泛型 在 Java 中,不会泛型,寸步难行。泛型可能是一个 Java 初学者需要攻克的第一个难点。随便跟着一门教程或 任何一本《Java入门到精通》,前面关于变量、关键字、语法(if、while、for等等)这些基本上是一看就懂,而当内容来到泛型的时候,大部分人可能就突然感觉没那么轻松了。 如果没有编程经验的话,可能需要练习一段时间才能完全掌握泛型编程概念和技巧,这么说吧,有些人写了好几年代码,碰到泛型的时候可能还是不太熟练。 说到Java泛型,最明显的标志就是 < 。 泛型是什么呢?通俗的说就是一个类型是没有固定类型的,即可以是Integer 也可以是 Long,还可能是你自定义的类。 “泛型使类型(类和接口)能够在定义类、接口和方法时成为参数。与方法声明中使用的更熟悉的 形式参数 非常相似,类型参数为您提供了一种通过不同输入重复使用相同代码的方法。区别在于形式参数的输入是值,而类型参数的输入是类型。 ” 例如在类定义中使用泛型,最常见的 ArrayList public class ArrayList<E  extends

 273 |  0 |  0 Java后端相关

雨馨 | 2024-06-06 | Java后端相关

Java线程池的实现原理及其在业务中的最佳实践

一、线程池简介 1.什么是线程池? 线程池是一种用于管理和复用线程的机制。 线程池的核心思想是预先创建一定数量的线程,并把它们保存在线程池中,当有任务需要执行时,线程池会从空闲线程中取出一个线程来执行该任务。任务执行完毕后,线程不是被销毁,而是返还给线程池,可以立即或稍后被再次用来执行其他任务。这种机制可以避免因频繁创建和销毁线程而带来的性能开销,同时也能控制同时运行的线程数量,从而提高系统的性能和资源利用率。 线程池的主要组成部分包括工作线程、任务队列、线程管理器等。线程池的设计有助于优化多线程程序的性能和资源利用,同时简化了线程的管理和复用的复杂性。 2.线程池有什么好处? 减少线程创建和销毁的开销,线程的创建和销毁需要消耗系统资源,线程池通过复用线程,避免了对资源的频繁操作,从而提高系统性能; 控制和优化系统资源利用,线程池通过控制线程的数量,可以尽可能地压榨机器性能,提高系统资源利用率; 提高响应速度,线程池可以预先创建线程且通过多线程并发处理任务,提升任务的响应速度及系统的并发性能; 二、Java...

 255 |  0 |  0 Java后端相关

雪千寻 | 2024-06-05 | Java后端相关

中厂Java后端15连问!

前言 最近去面试一个中厂,Java后端。他说,好几道题答不上来,于是我整理了一波答案 1. G1收集器 2. JVM内存划分 3. 对象进入老年代标志 4. 你在项目中用到的是哪种收集器,怎么调优的 5. new对象的内存分布 6. 局部变量的内存分布 7. Synchronized和Lock的区别 8. Synchronized原理 9. 可重入是如何知道当前锁的拥有着的 10. Spring用到的设计模式 11. 说说SPI 12. 排行榜怎么设计 13. SpringBoot 中注解实现缓存用过没?实现原理是什么。 14. 深分页优化 15. Redis分布式锁如何进一步提升性能 1. 说说G1收集器 G1(Garbage-First)收集器是 Java 虚拟机中的一种垃圾收集器。它于 JDK 7 中首次引入,并在后续版本中不断改进优化。 可以使用 -XX:+UseG1GC 开启它。这个选项告诉 JVM 在运行时使用 G1 垃圾收集器来管理堆内存。 G1(Garbage-First)收集器的核心原则之一就是 “首先收集尽可能多的垃圾” ,即优...

 227 |  0 |  0 Java后端相关

念旧。 | 2024-05-20 | Spring 全家桶Java后端相关

阿里一面:说一说Java、Spring、Dubbo三者SPI机制的原理和区别

今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。 其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是简单地介绍了一下Java、Spring的SPI机制,并没有进行深入,所以本篇就来深入聊一聊这三者的原理和区别。 什么是SPI SPI全称为 Service Provider Interface ,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。 简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。 Java SPI机制--ServiceLoader ServiceLoader是Java提供的一种简单的SPI机制的实现,Java的SPI实现约定了以下两件事: 文件必须放在 META-INF/services/ 目录底下 文件名必须为接口的全限定名,内容为接口实现的全限定名 这样就能够通过Service...

 237 |  0 |  0 Spring 全家桶Java

青木 | 2024-05-07 | Java算法

架构设计中如何应对接口级故障?

在实际业务运行过程中,有一种故障影响可能没有那么大,但发生的概率较高,这就是今天聊的接口级的故障。 接口级故障的典型表现就是,系统并没有宕机、网络也没有中断,但业务却出现问题了,例如业务响应缓慢、大量访问超时和大量访问出现异常(给用户弹出提示“无法连接数据库”)。 这类问题的主要原因在于系统压力太大、负载太高,导致无法快速处理业务请求,由此引发更多的后续问题。最常见的情况就是,数据库慢查询将数据库的服务器资源耗尽,导致读写超时,业务读写数据库时要么无法连接数据库、要么超时,最终用户看到的现象就是访问很慢,一会儿访问抛出异常,一会儿访问又是正常结果。 如果进一步探究,导致接口级故障的原因可以分为两大类: 1. 内部原因 :包括程序bug导致死循环,某个接口导致数据库慢查询,程序逻辑不完善导致耗尽内存等。 2. 外部原因 :包括黑客攻击,促销或者抢购引入了超出平时几倍甚至几十倍的用户,第三方系统大量请求,第三方系统响应缓慢等。 解决接口级故障的核心思想和异地多活基本类似,都是 优先保证核心业务 和 优先保证绝大部分用户 。常见的应对方法有四种,降级、...

 334 |  0 |  0 Java算法

花小染 | 2024-04-29 | Java后端相关

如何使用 Java 读取 Excel、docx、pdf 和 txt 文件?

如何使用 Java 读取 Excel、"doc"、"docx"、"pdf" 和 "txt" 文件。 在 Java 开发中,我们经常需要读取不同类型的文件,包括 Excel 表格文件、"doc" 和 "docx" 文档文件、PDF 文件以及纯文本文件。 其中最常用的是 Apache POI 库。Apache POI 是一个流行的 Java 库,提供了许多 API 来读取和写入 Microsoft Office 文档,包括 Excel、Word 和 PowerPoint 等。 本文将介绍如何使用 Java 读取这些不同类型的文件。(本文的方法可供参考,还有其它方法读者自行查阅。) 1.举个栗子 以下是本人在开发过程中,读取"doc"、"docx"、"pdf" 和 "txt" 文件的代码例子,后面将详细解释。 txt文件读取不多说,用流读取。 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apach

 270 |  0 |  0 Java后端相关

流苏 | 2024-04-18 | Spring 全家桶Java后端相关

利用 Java 反射机制提高 SpringBoot 的代码质量

保持好的代码质量和遵守编码标准是开发可维护和健壮软件的重要方面。在 Spring Boot 应用程序中,确保始终遵循命名约定、代码结构和其他质量标准是一项艰巨的任务,尤其是当项目的复杂性和规模不断扩大时更是如此。 “在本文中,我们将探讨如何使用 Java 反射来提高 Spring Boot 应用程序的代码质量和可维护性。 代码质量的重要性 代码质量不仅仅是个人喜好的问题;它直接影响项目的可维护性、可扩展性和健壮性。代码质量的一致性对于基于团队的开发至关重要,因为它可以促进协作、减少混乱,并使得随着时间的推移更容易管理和发展代码库。 Spring Boot 项目中的痛点问题 Spring Boot 以其强大的功能和灵活性,使开发人员能够构建广泛的应用程序。然而,Spring Boot 极具吸引力的灵活性也可能导致代码质量不一致。开发人员可能会无意中偏离既定的命名约定、项目结构和编码标准。 使用 Java 反射来提高质量 为了解决这些代码质量带来的风险,我们可以利用 Java强大的反射功能来扫描和验证我们的代码库。Java 反射允许我们在运行时检查和操...

 315 |  0 |  0 Spring 全家桶Java

柚香 | 2024-04-17 | Java后端相关

常见 Java 代码缺陷及规避方式

问题列表 空指针异常 NPE 或许是编程语言中最常见的问题,被 Null 的发明者托尼·霍尔(Tony Hoare)称之为十亿美元的错误。在 Java 中并没有内置的处理 Null 值的语法,但仍然存在一些相对优雅的方式能够帮助我们的规避 NPE。 使用 JSR-305/jetbrain 等注解 1. NotNull 2. Nullable 通过在方法参数、返回值、字段等位置显式标记值是否可能为 Null,配合代码检查工具,能够在编码阶段规避绝大部分的 NPE 问题,建议至少在常用方法或者对外 API 中使用该注解,能够对调用方提供显著的帮助。 用 Optional 处理链式调用 Optional 源于 Guava 中的 Optional 类,后 Java 8 内置到 JDK 中。Optional 一般作为函数的返回值,强制提醒调用者返回值可能不存在,并且能够通过链式调用优雅的处理空值。...

 250 |  0 |  0 Java后端相关

追风少年 | 2024-04-15 | Java后端相关

常见 Java 代码缺陷及规避方式

问题列表 空指针异常 NPE 或许是编程语言中最常见的问题,被 Null 的发明者托尼·霍尔(Tony Hoare)称之为十亿美元的错误。在 Java 中并没有内置的处理 Null 值的语法,但仍然存在一些相对优雅的方式能够帮助我们的规避 NPE。 使用 JSR-305/jetbrain 等注解 1. NotNull 2. Nullable 通过在方法参数、返回值、字段等位置显式标记值是否可能为 Null,配合代码检查工具,能够在编码阶段规避绝大部分的 NPE 问题,建议至少在常用方法或者对外 API 中使用该注解,能够对调用方提供显著的帮助。 用 Optional 处理链式调用 Optional 源于 Guava 中的 Optional 类,后 Java 8 内置到 JDK 中。Optional 一般作为函数的返回值,强制提醒调用者返回值可能不存在,并且能够通过链式调用优雅的处理...

 295 |  0 |  0 Java后端相关

女王范 | 2024-04-09 | Java后端相关

聊聊Java中代码优化的30个小技巧

前言 我之前写过两篇关于优化相关的问题:《[聊聊sql优化的15个小技巧](https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ &mid=2247490473&idx=1&sn=ba07d64aa8c89054bd263efd660d3a3f&chksm=c0ebc341f79c4a579a6f41465df0459a696ab8ef0499a5f6fd76269af1064fde0286afdb027d&token=751314179&lang=zh_CN&scene=21 wechat_redirect)》和《[聊聊接口性能优化的11个小技巧](https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ &mid=2247490731&idx=1&sn=29ed0295c7990157a3a56ba33cf7f8be&chksm=c0ebc443f79c4d55a2bac81744992c96f97737e5d0717ec99231f4d08f57a7f0220eafdac9c9&token

 261 |  0 |  0 Java后端相关

追风少年 | 2024-04-02 | Java后端相关

Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态

本文我们分析了 什么 是 “流”,对比了 Java 上几种常见的 “流”库,引入和详细介绍了 Java 22 中的 Stream Gather API 。同时也简单分享了利用 虚拟线程 如何简化 Stream <span mapConcurrent</span 操作符的实现。 01背景 Java Stream 自从 Java 1.8 引入以来,迅速成为了各位开发者手中信手拈来的工具,大家日常在工作中谈论起来也是如数家珍。但由于 Java Stream 的操作符不足够的丰富,经常会遇到捉襟见肘的情况。对于此,大家可能会继而采用操作符更加丰富的库来作为替代。作为 Java 标准库的一部分,Oracle 的 Java 架构师们也一直以来都在探索如何更好的适应日益增长的用户需求和语言的可维护性,随着 Stream Gather API 的到来,这个情况得到了极大的改善,下面让我结合自身经验,和大家分享 Java Stream Gather API。 02 什么 是 Stream ? 在编程语言生态中,Stream 是一个抽象的概念,代表了一组连...

 609 |  0 |  0 Java后端相关

一纸荒年 | 2024-04-01 | Java后端相关

Java线程池中线程异常后:是销毁还是复用?

“一个线程池中的线程异常了,那么线程池会怎么处理这个线程? 需要说明,本文的线程池都是 java.util.concurrent.ExecutorService 线程池,本文将围绕验证,阅读源码俩方面来解析这个问题。 代码验证 验证execute提交线程池中 测试代码: public class ThreadPoolExecutorDeadTest {     public static void main(String[] args) throws InterruptedException {         ExecutorService executorService = buildThreadPoolExecutor();         executorService.execute(()   exeTask("execute"));         executorService.execute(()   exeTask("execute"));         executorService.execute(()   exeT

 303 |  0 |  0 Java后端相关

心如止水 | 2024-03-29 | Java后端相关

万字详解,带你彻底掌握 WebSocket 用法(至尊典藏版)

一、 简介 1.1 什么是WebSocket WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2011年成为标准。 1.2 WebSocket的优势和劣势 WebSocket的优势包括: 实时性: 由于WebSocket的持久化连接,它可以实现实时的数据传输,避免了Web应用程序需要不断地发送请求以获取最新数据的情况。 双向通信: WebSocket协议支持双向通信,这意味着服务器可以主动向客户端发送数据,而不需要客户端发送请求。 减少网络负载: 由于WebSocket的持久化连接,它可以减少HTTP请求的数量,从而减少了网络负载。 WebSocket的劣势包括: 需要浏览器和服务器都支持: WebSocket是一种相对新的技术,需要浏览器和服务器都支持。一些旧的浏览器和服务器可能不支持WebSocket。 ...

 600 |  0 |  0 Java后端相关

OOM | 2024-03-27 | Java

实现一款高可用的 TCP 数据传输服务器(Java版)

1.netty能做什么 首先netty是一款高性能、封装性良好且灵活、基于NIO(真·非阻塞IO)的开源框架。可以用来手写web服务器、TCP服务器等,支持的协议丰富,如:常用的HTTP/HTTPS/WEBSOCKET,并且提供的大量的方法,十分灵活,可以根据自己的需求量身DIV一款服务器。 用netty编写TCP的服务器/客户端 1.可以自己设计数据传输协议如下面这样: 图片 2.可以自定义编码规则和解码规则 3.可以自定义客户端与服务端的数据交互细节,处理socket流攻击、TCP的粘包和拆包问题 2.Quick Start 创建一个普通的maven项目,不依赖任何的三方web服务器,用main方法执行即可。 图片 加入POM依赖 <!--net

 274 |  1 |  1 Java