
JAVA基础总结
文章平均质量分 86
Young丶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java注解编译期处理AbstractProcessor详解
我们接触的注解主要分为以下两类运行时注解:通过反射在运行时动态处理注解的逻辑编译时注解:通过注解处理器在编译期动态处理相关逻辑平时我们接触的框架大部分都是运行时注解,比如:@Autowire @Resoure @Bean 等等。那么我们平时有接触过哪些编译期注解呢,@Lombok等等像这些编译时注解的作用都是自动生成代码,一是为了提高编码的效率,二是避免在运行期大量使用反射,通过在编译期利用反射生成辅助类和方法以供运行时使用。那这些编译器注解都是如何运行的呢?又是怎么自动生成代码的呢?转载 2023-05-30 08:57:40 · 33749 阅读 · 0 评论 -
java8 中的 Collectors 全解析
相关的文章中提到了 。相信很多同学对这个比较感兴趣,那我们今天就来研究一下 。 是 Java 8 加入的操作类,位于 包下。它会根据不同的策略将元素收集归纳起来,比如最简单常用的是将元素装入、、 等可变容器中。特别对于 Java 8 Stream Api 来说非常有用。它提供了 方法来对 流进行终结操作派生出基于各种策略的结果集。我们就借助于 来熟悉一下 吧。我们依然用昨天的例子:3. Java 8 中 Collectors 的方法 提供了一系列的静态方法供我们使用,通常情况我们静态导入即可原创 2022-07-02 07:45:00 · 16364 阅读 · 0 评论 -
Java8 Stream API 详细使用指南
Java 8 引入的一个重要的特性无疑是 Stream API。Stream 翻译过来是“流”,突然想到的是大数据处理有个流式计算的概念,数据通过管道经过一个个处理器(Handler)进行筛选,聚合,而且流都具有向量性,强调的是对数据的计算处理,而集合强调的是数据集。Stream可以看做是一个可操作的数据集序列,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。有点类似于数据库中的增删改查操作。十分高效而且易于使用。从不同的数据源创建流有很多方式。 被创建的流并不能改变数据源。原创 2022-07-02 06:45:00 · 12132 阅读 · 0 评论 -
Java 的这12个语法糖,有点甜
我们在日常开发中经常会使用到诸如泛型、自动拆箱和装箱、内部类、增强 for 循环、try-with-resources 语法、lambda 表达式等,我们只觉得用的很爽,因为这些特性能够帮助我们减轻开发工作量;但我们未曾认真研究过这些特性的本质是什么,那么这篇文章,cxuan 就来为你揭开这些特性背后的真相。在聊之前我们需要先了解一下 的概念:,也叫做糖衣语法,是英国科学家发明的一个术语,通常来说使用语法糖能够增加程序的,从而减少程序代码出错的机会,真是又香又甜。语法糖指的是计算机语言中添加的某种语法,这原创 2022-06-23 10:05:26 · 18804 阅读 · 4 评论 -
【高并发基石】多线程、守护线程、线程安全、线程同步、互斥锁
很久之前就听过互联网架构中有三高,高可用、高并发、高性能,多线程是处理高并发问题的基石,起步阶段一定要对线程有一个系统深刻的印象,为以后做准备。转载 2022-08-04 04:45:00 · 21562 阅读 · 0 评论 -
聊聊 Java SPI 机制
Java SPI 是基于接口的编程+策略模式+约定配置文件组合实现的动态加载机制,能够很方便的为某个接口寻找服务实现的机制。今天这篇文章就来深入聊一下SPI。什么是SPI?SPI 全称:Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了原创 2022-05-09 12:38:50 · 2461 阅读 · 0 评论 -
5道面试题,拿捏String底层原理
第1题,奇怪的 nullnull下面这段代码最终会打印什么?public class Test1 { private static String s1; private static String s2; public static void main(String[] args) { String s= s1+s2; System.out.println(s); }}JAVA 复制 全屏揭晓答案,看一下运行结果,打印了nulln原创 2022-03-18 17:31:02 · 1818 阅读 · 0 评论 -
JAVA 反射知识点总汇
从代码角度,关于反射的用法总结一、概念1.1 概念简单说,JAVA反射机制是指在运行态可直接操作任意类或对象的所有属性和方法的功能,无论他是私有还是public。1.2 反射的用途在运行时获取任意对象所属的类Class<?> clazz = Class.forName(String className);在运行时构造任意类的对象Object obj = clazz.newInstance();在运行时获取任意类所具有的成员变量和方法field.set(Object ob.原创 2021-10-21 13:44:21 · 1501 阅读 · 0 评论 -
Java后端线上问题排查常用命令收藏
内存瓶颈freefree是查看内存使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。free -h -s 3表示每隔三秒输出一次内存情况,命令如下[1014154@cc69dd4c5-4tdb5 ~]$ free total used free shared buff/cache availableMem: 119623656 43052220 45611364 4313760原创 2021-03-22 23:41:58 · 783 阅读 · 0 评论 -
java基础值java 运行参数,及jvm调优
java启动参数共分为三类其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;标准参数中比较有用的:verbose-verbose:class输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。-verbose:gc输出每次GC原创 2021-01-06 00:33:08 · 2657 阅读 · 0 评论 -
Tomcat(三):tomcat处理连接的详细过程
tomcat可以处理静态资源的请求,也可以通过servlet处理动态资源的请求。处理jsp动态资源时,先通过jasper组件(具体的是JspServlet)将jsp翻译成java源代码并编译成class后运行。需要知道的是,静态资源也一样是通过servlet处理的,只不过它使用的servlet是定义在$catalina_home/conf/web.xml中默认的servlet。本文将详细分析tomcat如何处理客户端请求(并发)以及如何处理动、静态资源。1.Tomcat组件体系结构如下两图:上面的图是t原创 2020-12-03 14:08:10 · 2011 阅读 · 0 评论 -
Tomcat(二):tomcat配置文件server.xml详解和部署简介
1. 入门示例:虚拟主机提供web服务该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改CATALINAHOME/conf/server.xml文件为如下内容即可,本文的tomcat安装在/usr/local/tomcat下,因此‘CATALINA_HOME/conf/server.xml文件为如下内容即可,本文的tomcat安装在/usr/local/tomcat下,因此`CATALINAHOME/conf/server.xml文件为如下内容即可,本文的tomcat安装原创 2020-12-02 19:18:43 · 7254 阅读 · 0 评论 -
Tomcat(一):背景知识和安装tomcat
1. 基础背景知识1.1 java和jdk概念无论是何种程序,要能在计算机上运行,必须能转换为二进制的机器语言才能和硬件进行交互,在机器语言的上层是汇编语言,再上层是C/C++这样较底层的语言,由于它们严重依赖于平台架构,所有一般只能运行在程序源代码已编译的机器上,可移植性比较差。Java是一种面向对象的语言,它的层次比C更高一点,层次指的是离硬件更远一点。它将写好的程序文件(.java)通过java编译器javac编译成字节码类型的class文件(.class),在编译过程中涉及词法分析、语法分析、原创 2020-12-01 17:01:00 · 1672 阅读 · 0 评论 -
Java 常用设计模式 -- Builder模式
Builder模式是在Java中最流行的模式之一。它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例。模式的流畅变体示例:public class User { private final String firstName; private final String lastName; User(String firstName, String lastName) { this.firstName原创 2020-10-22 10:43:30 · 1480 阅读 · 0 评论 -
万字详解,JDK1.8新特性的Lambda、Stream和日期的使用详解
前言Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。新特性Java8 新增了非常多的特性,我们主要讨论以下几个:Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象原创 2020-10-21 13:51:20 · 874 阅读 · 0 评论 -
Java 四种引用类型:强引用、软引用、弱引用、虚引用
以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践、去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝知此事要躬行。Java中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。Java设计这四种引用的主原创 2020-09-03 10:05:35 · 1470 阅读 · 0 评论 -
SpringBoot如何使用策略模式干掉if else
场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不同,下面我们写一个简单Demo来实现该的场景。解决思路1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。public abstract class GeneralChannelRule { public abstract void process();}2、编写一个腾讯的规则类,定义具体对于腾原创 2020-08-19 10:17:01 · 2862 阅读 · 1 评论 -
你分析过@Annotation注解的实现原理吗?
什么是注解?对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。 Java注解是附加在原创 2020-08-05 10:10:44 · 1304 阅读 · 0 评论 -
对象拷贝 Apache BeanUtils与Spring BeanUtils性能比较
前言在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。这种转换最原始的方式就是手动编写大量的 get/set代码,当然这是我们开发过程不愿意去做的,因为它确实显得很繁琐。为了解决这一痛点,就诞生了一些方便的类库,常用的有 apache的 BeanUtil原创 2020-08-03 09:34:49 · 2849 阅读 · 0 评论 -
来看看如何使用策略模式干掉讨厌的 if else
干掉if else常用策略模式!其实就是抽取一个抽象类,然后根据类型指定不同的实现类执行方法。你学废了吗?需求这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。订单实体:service接口:传统实现根据订单类型写一堆的if else:策略模式实现利用策略模式,只需要两行即可实现业务逻辑:可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会讲解。我们从中获取一.原创 2020-07-03 17:11:09 · 1785 阅读 · 0 评论 -
讲透彻什么是Linux零拷贝?
本文探讨 Linux 中主要的几种零拷贝技术以及零拷贝技术的适用场景。为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入。在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能。**这时候服务端的任务是:**将服务端主机磁盘中的文件不做修改地从已连接的 Socket 发出去。我们通常用下面的代码完成:while((n = read(diskfd, buf, BUF_SIZE)) > 0) write(sockfd, buf , n);基本操作就是循环原创 2020-06-29 15:26:07 · 1292 阅读 · 0 评论 -
聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
前言Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型带来的好处在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一原创 2020-06-27 18:34:01 · 1515 阅读 · 0 评论 -
面试官:BigDecimal一定不会丢失精度吗?
都知道Double会丢失精度,BigDecimal就不会么?希望你会正确使用!我们基本已经形成了常识,需要用到金钱的地方要用 BigDecimal 而不是其他,而我们也都知道浮点型变量在进行计算的时候会出现丢失精度的问题。那么,你知道其实 BigDecimal 也会丢失精度吗?而使用 BigDecimal 的背后又有什么值得去探究的地方吗?今天,告诉你,知其然,也知其所以然。如下一段代码:System.out.println(0.05 + 0.01); System.out.println(1原创 2020-06-27 17:10:17 · 1257 阅读 · 0 评论 -
JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下:从图中可以看出:①每个线程都有一个自己的本地内存空间–线程栈空间???线程执行时,先把变量从主内存读取到线程自己的本地内存空间,然后再对该变量进行操作②对该变量操作完后,在某个时间再把变量刷新回主内存关于JAVA内存模型,更详细的可参考: 深入理解Java内存模型(一)——基础因此,就存在内存可见性问题,看一个示例程序:(摘自书上) 1 public class原创 2020-06-16 17:51:55 · 547 阅读 · 0 评论 -
分布式主键解决方案----Twitter 雪花算法的原理(Java 版)
SnowFlake 雪花算法对于分布式系统环境,主键ID的设计很关键,什么自增intID那些是绝对不用的,比较早的时候,大部分系统都用UUID/GUID来作为主键,优点是方便又能解决问题,缺点是插入时因为UUID/GUID的不规则导致每插入一条数据就需要重新排列一次,性能低下;也有人提出用UUID/GUID转long的方式,可以很明确的告诉你,这种方式long不能保证唯一,大并发下会有重复long出现,所以也不可取,这个主键设计问题曾经是很多公司系统设计的一个头疼点,所以大部分公司愿意牺牲一部分性能而直接原创 2020-06-16 10:43:40 · 1066 阅读 · 0 评论 -
强烈推荐16 款牛逼的 IDEA 插件,让你开发速度飞起来!
当前最新版IDEA版本是2020.1。随着IDEA版本的升级,有些插件不再支持,而有些插件变成了收费插件,这些插件将不再推荐。以下列举的,都是亲测可以在2020.1版本的IDEA中使用的插件。google-java-format 代码自动格式化简介google-java-format插件可以帮助我们不通过对应的快捷键就可以实现特定方式下自动格式化代码。使用具体使用方法参考Translation简介翻译插件,支持google翻译、百度翻译、有道翻译。使用快捷键Ctrl + Shift转载 2020-05-29 16:55:46 · 8169 阅读 · 1 评论 -
应用缓存的基本概念,香(Redis)
缓存的使用,是一个逐渐演进的过程。问一下你自己,最直接的使用缓存的原因是什么?无它,唯快而已!追溯一下自己最开始使用缓存的场景,一些数据库里存储的不变的配置信息,服务启动时,直接加载到本地公共模块,方便其它功能模块共享使用。这便是最基本,最简单的本地缓存应用。一、服务与缓存所谓的服务,简而言之,一层应用 + 一层数据,应用从数据层获取数据然后加工输出。数据层,通常我们指的是持久化介质上的持久化存储。它有多种形式的,可以是文件,或者数据库。数据存储在持久化介质上,而应用运行与内存中。内存和持久化原创 2020-05-25 18:18:25 · 2001 阅读 · 0 评论 -
Java IO基础原理你该知道这些
Java IO 也称为IO流,IO = 流,它的核心就是对文件的操作,对于 字节 、字符类型的输入和输出流。IO是指对数据流的输入和输出,也称为IO流,IO流主要分为两大类,字节流和字符流。字节流可以处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据。IO流的本质是数据传输,并且流是单向的。常用的字节流IO分阻塞型IO和非阻塞型IO(NIO)阻塞型IO在读取数据时,如果数据未到达,会一直阻塞到读取到数据为止,所以称为阻塞型IO,在高并发的环境下性能不佳。NIO不是使用 “流” 来原创 2020-05-25 17:30:34 · 623 阅读 · 0 评论 -
Java8 详解Lambda表达式
1. 引言在 Java 8 以前,若我们想要把某些功能传递给某些方法,总要去写匿名类。以前注册事件监听器的写法与下面的示例代码就很像:manager.addScheduleListener(new ScheduleListener() { @Override public void onSchedule(ScheduleEvent e) { // Event listener implementation goes here... }});这原创 2020-05-20 18:11:19 · 1683 阅读 · 0 评论 -
Spring Boot 关于 @EnableConfigurationProperties 注解 —— 使用 @ConfigurationProperties 注解的类生效。
先说作用:@EnableConfigurationProperties注解的作用是:使用 @ConfigurationProperties 注解的类生效。说明:如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。测试发现原创 2020-05-20 13:52:12 · 1741 阅读 · 0 评论 -
Spring Boot实战:异步编程指南
通过本文你可以了解到下面这些知识点:Future 模式介绍以及核心思想核心线程数、最大线程数的区别,队列容量代表什么;ThreadPoolTaskExecutor 饱和策略;SpringBoot 异步编程实战,搞懂代码的执行逻辑。Future 模式异步编程在处理耗时操作以及多任务处理的场景下非常有用,我们可以更好的让我们的系统利用好机器的 CPU 和 内存,提高它们的利用率。多线程设计模式有很多种,Future模式是多线程开发中非常常见的一种设计模式,本文也是基于这种模式来说明 Spring原创 2020-05-18 10:24:44 · 554 阅读 · 0 评论 -
一手好 SQL 是如何炼成的?
目录MySQL性能最大数据量最大并发数查询耗时0.5秒实施原则数据表设计数据类型避免空值text类型索引优化索引分类优化原则SQL优化分批处理不做列运算避免Select *操作符<>优化OR优化IN优化LIKE优化JOIN优化LIMIT优化其他数据库博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。原创 2020-05-09 14:04:59 · 428 阅读 · 0 评论 -
一看就知道的Java8日期处理全方位实践
Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。示例1:Java 8中获取今天的日期Java 8 中的 LocalDate 用于表示当天日期。和java.util.Date不同,它.原创 2020-05-09 09:54:32 · 385 阅读 · 0 评论 -
史上最全的Java命名规范!告别编码5分钟,命名2小时?
每个公司都有不同的标准,目的是为了保持统一,减少沟通成本,提升团队研发效能。所以本文中是笔者结合阿里巴巴开发规范,以及工作中的见闻针对 Java 领域相关命名进行整理和总结,仅供参考。一,Java 中的命名规范好的命名能体现出代码的特征,含义或者是用途,让阅读者可以根据名称的含义快速厘清程序的脉络。不同语言中采用的命名形式大相径庭,Java 中常用到的命名形式共有三种,既首字母大写的 Uppe...原创 2020-04-18 15:36:26 · 3020 阅读 · 0 评论 -
面试官问你 SpringMVC 的工作原理,你还不知道吗?
SpringMVC的工作原理图:SpringMVC流程1、 用户发送请求至前端控制器DispatcherServlet。2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、 ...原创 2020-04-07 10:13:09 · 3129 阅读 · 1 评论 -
最通俗易懂的SpringBoot经典学习笔记讲解
导读:课程概览1. Spring Boot是什么我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准,但是随着技术的发展,Java EE使用 Spring 逐渐变得笨重起来,大量的 XML 文件存在于项目之中。繁琐的配置,整合第三方框架的配置问题,导致了开发和部署效率的降低。20...原创 2020-04-03 09:45:15 · 4355 阅读 · 1 评论 -
Jvm 系列(一):Java 类的加载机制
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。原创 2020-02-05 15:59:55 · 563 阅读 · 1 评论 -
Maven详解
一.前言 以前做过的项目中,没有真正的使用过Maven,只知道其名声很大,其作用是用来管理jar 包的。最近一段时间在项目过程中使用Maven,用Maven构建的web项目,其项目结构只停留在了解阶段,没有深入的使用与理解,刚好最近看了一篇关于Maven的详解;就开始深入学习一下Maven的具体应用。二.Maven的作用在开发中,为了保证编译通过,我们会到处去寻找ja原创 2017-04-19 13:08:12 · 352 阅读 · 0 评论 -
eclipse 创建maven web项目
1.新建Maven项目 1.1 File -> New -> Other1.2 选择Maven Project ,单击Next1.3 保持默认即可,单击Next1.4 选择Archetype为 web app,单击Next1.5 输入一些必要信息,单击Finish1.6 项目结构如下图:原创 2017-04-19 16:21:21 · 3798 阅读 · 2 评论 -
jdk、jre、jvm有什么区别?
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。 JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你的电脑有两套J转载 2017-02-16 00:06:05 · 1161 阅读 · 0 评论