自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

山禾说

胸中有沟壑,眼里存山禾

  • 博客(79)
  • 收藏
  • 关注

原创 一份让你效率翻倍的年终总结

呕心沥血历时两周 共计七千五百字 三十张图 只为让你效率翻倍

2020-01-02 08:28:57 7457 50

原创 面试官:五年经验,我不问问反射说不过去吧?

1. 反射是什么?反射是一种机制,是一种能力,是指JVM在运行过程中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意方法和属性。2. 反射的原理?如果你对 JVM 的类加载机制有所了解(这里不了解也没关系),就会知道,类在编译的时候,会生成一个 .class 文件,当类被使用的时候,这个 class 文件就会被读取并被载入到虚拟机中,生成对应类型的 Class 对象,这个被创建出的 Class 对象中就包含了我们原本的类中一切信息,通过这个对象,我们就可以去获取

2020-11-13 09:27:41 358

原创 面试官:注解五问你怕了吗?

1. 注解是什么首先,我们先来康康注解在百度百科上的解释而在 Java 中,简单通俗的讲,就是一个标签,对类、方法、变量的一个解释说明,在早些年,我们通常使用 xml 去对我们的代码进行增强的解释,但是格式繁杂,代码可读性差,维护起来很困难,在 Java SE 5.0 以后,注解的出现为这种情况得到了改善,越来越多的开源项目开始使用注解,抛弃了 xml 。xml 就像一段代码的补充解释和说明,是一段单独的文档,比如我们 Spring 项目中使用 xml 配置 Bean 的作用域,而注解是写在代码旁边

2020-11-03 09:39:31 284

原创 面试官:对象可能会迟到,但它永远不会缺席

问题一:简单聊一下关于你对Object的理解在 Java 中,只有基本数据类型不是对象,比如,数值,布尔和字符类型的值都不是对象。而其余的数据类型都是继承自一个名为Object的类,这个类是所有类的始祖,每个类都是由Object类扩展而来。如果一个类继承自Object类,我们可以将extends Object给省略掉,如果在一个类的定义中没有明确的指出哪个是它的父类,那么Object类就认为是这个类的父类。=问题二:Object类中有一个registerNatives方法,对此你了解多少?从方法的

2020-08-17 09:01:51 262

原创 「山禾说成长」:手把手教你搭建一个完全属于自己的技术博客

搭建前的准备在我们正式开始搭建一个完全属于我们自己的博客之前,我们首先要做好一些事前的准备(当然,如果你没有做好准备也没有关系,下面会一步一步的教你搞定这些)服务器一台 or github 账号一个(二选一)域名一个(可选)node.js(建议10.0以上版本)git域名和服务器的购买我这里就不在文章中进行讲解了,各大云厂商都还不错,大家可以自行搜索进行购买~基础架构这里我选用的博客方案是较为成熟的 Hexo 静态博客进行操作的下面来讲解一下上面需要准备的东西都有什么用,分别是三种部署

2020-07-08 18:23:26 545

原创 【两万字】面试官:听说你很懂集合源码,接我二十道问题!

【高能预警】:两万字长文,建议先收藏再看,深度源码分析,二十个问题带你一网打尽集合面试。

2020-06-28 08:40:56 13046 13

原创 面试官:十问泛型,你能扛住吗?

问题一:为什么需要泛型?答:使用泛型机制编写的代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性,也就是说使用泛型机制编写的代码可以被很多不同类型的对象所重用。问题二:从ArrayList的角度说一下为什么要用泛型?答:在Java增加泛型机制之前就已经有一个ArrayList类,这个ArrayList类的泛型概念是使用继承来实现的。public class ArrayList {   &nbs

2020-06-22 08:27:35 6278 6

原创 面试官:面向对象都不会?收拾收拾回去吧

2020年6月13日 多云转暴雨⛈️I'm sad,tired,negative,powerless,miss,lonely fine :)那你回去等通知吧面试官:我看你简历上说,你的主要编程语言是Java,偶尔也用Python,那么你可以说一下这两个的相同点在什么地方吗?山禾:它们都是高级程序设计语言,都是面向对象的语言。面试官:那你讲讲你是怎么理解面向对象的吧。山禾:emmm。。封装,继承,多态是面向对象的三大特征。面试官:还有其他要补充的吗?山禾:没了面试官:那你回去等通知吧。

2020-06-15 08:35:42 1207 9

原创 「山禾说成长」:写作?写作!

写作是什么?写作,分为写和作,《说文解字》中分别对这两个字做出了解释。“写,置物也“ ——《说文解字》”作,起也“。——《说文解字》写是体力劳动,作是脑力劳动,接受过一定文化水平的人,一般都可以做到写,比如日记,一则简单的故事,但是作却不是所有人都可以做到的事情,需要经过大量的思考和提炼,看到的事务背后的本质,所谓词不达意,或许就是描述写手和作家的最大区别。为什么要写作?学习作为一个IT行业的从事者,终身学习显得格外的重要,在一个日新月异、高速发展的环境中,不学习就意味着面临被社会淘汰。

2020-05-25 09:05:49 2198

原创 《给产品经理讲JVM》:垃圾收集器

前言在上篇中,我们把 JVM 中的垃圾收集算法有了一个大概的了解,又是一个阴雨连绵的周末,宅在家里的我们又开始了新一轮的学习:产品大大:上周末我们说了垃圾收集算法,下面是不是要讲一下这些算法的应用呢?我:当然,如果说垃圾收集算法是打狗棒法,那么垃圾收集器就是历届的丐帮帮主们,不同的帮主领悟到的自然也就不同,我先对这些帮主进行一个简单的介绍,看图!我:我从回收的区域去对垃圾收集器进行了一个...

2020-04-21 08:57:53 629

原创 「给产品经理讲JVM」:垃圾收集算法

纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了。从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经了三个选题,最终定下来了这个。这个名字的由来,且听我给你慢慢道来,从学习知识的角度上来说,最深入的方法就是把知识讲给别人听,那么为什么我要讲给程序员的天敌——产品经理呢?那么问题的答案很简单,因为...

2020-04-13 08:19:07 447

原创 「 Offer收割机之JVM」:生存还是毁灭

这两天,广州的天气又开始热了起来,又到了小动物交配的季节,啊呸,又到了一个收割 offer 的季节。年底将至,又到了面试的高峰期,JVM 作为Java 程序员面试绕不过的一道坎儿,它又来了,你准备好了吗?说说引用面试官 A:小伙几,上篇我们说到了 JVM 收集的两种算法 —— 引用记数法和可达性分析算法,你对这两种算法的理解很清晰,那么这两种算法有一个很重要的点,就是『引用』,其实无论是引用...

2020-03-27 06:51:41 358

原创 「每日五分钟,玩转JVM」:两种算法

前言上篇文章,我们了解了GC 的相关概念,这篇文章我们通过两个算法来了解如何去确定堆中的对象实例哪些是我们需要去回收的垃圾对象。引用计数算法引用计数法的原理很简单,就是在对象中维护一个计数器,当有一个对象引用它的时候,该计数器的值就会加一,当这个引用失效的时候,计数器的值就会减少一,当计数器的值为零的时候,就意味着这个对象是一个垃圾对象,需要被 GC 回收,这个算法是一个比较高效的算法,但...

2020-03-26 09:53:55 233

原创 「每天五分钟,玩转 JVM」:对象访问定位

前言在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做类型指针的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。但是,并不是所有的虚拟机都是这么去做的。不同的虚拟机关于这点有不同的实现,目前主流的方式可以分为句柄和直接指针句柄由图中我们可以看到,在我们的堆中被划分出了一块单独的部分,叫做句柄池,句柄池的作用就像一个中转站,我们要查询位于堆内存中的...

2020-03-25 14:19:38 200

原创 「每日五分钟,玩转JVM」:对象内存布局

概览一个对象根据不同情况可以被划分成两种情况,当对象是一个非数组对象的时候,对象头,实例数据,对齐填充在内存中三分天下,而数组对象中在对象头中多了一个用于描述数组对象长度的部分对象头对象头分为两部分,第一部分称之为**“Mark Word”,第二部分是用于获取该对象类型的类型指针**,如果是数组对象还包括记录数组长度的数据。在不同的操作系统中,这些区域所占的内存也不同,在32位的系统中,...

2020-03-24 08:49:05 162

原创 「每天五分钟,玩转 JVM」:对象访问定位

面向对象众所周知,Java是一门面向对象的高级编程语言,那么现在问题来了,对象从哪来呢?有些人会说通过new关键字来创建一个对象,说的很好,本篇我们就来解密在new一个对象的过程中,JVM都给我们做了什么工作。走哪来,到哪去一个对象的诞生必定有一个类,通常我们都是通过new关键字实例化一个类来获取该类的一个对象,类在加载的过程中会经历一系列的检查,解析,初始化等一系列的过程,我们会在后面详细...

2020-03-23 08:52:36 175

原创 Java 基础(六):循环

循环老生常谈的一个控制流程了,我们在是使用数组和集合的时候,遍历元素的时候经常会用到循环的结构,Java具有非常灵活的三种循环机制:根据是否知道循环的次数可以为分为while循环,do…while循环和for循环,下面我们单独来了解一下:while循环当我们不知道循环的具体次数时,可以使用while循环进行操作,下面是while循环的伪代码定义初始变量 while (控制条件) {...

2020-03-20 08:24:42 272

原创 Java基础(五):数组

数组,一种应用非常广泛的数据结构,简单地来说就是一组类型相同且无序的元素的存储在固定长度且有序的内存空间。创建一个数组在Java中,我们可以通过[]去声明一个指定类型的数组int[] a; // 写法一int a[]; // 写法二当然,一般情况下我们更喜欢使用第一种方式来声明一个数组,因为它将类型与变量名分开,优化了代码的可读性。刚刚我们只是声明了一个数组 a ,但是并没有将 ...

2020-03-19 08:38:42 241

原创 Java 基础(四):从面试题看String

数组,一种应用非常广泛的数据结构,简单地来说就是一组类型相同且无序的元素的存储在固定长度且有序的内存空间。创建一个数组在Java中,我们可以通过[]去声明一个指定类型的数组int[] a; // 写法一int a[]; // 写法二当然,一般情况下我们更喜欢使用第一种方式来声明一个数组,因为它将类型与变量名分开,优化了代码的可读性。刚刚我们只是声明了一个数组 a ,但是并没有将 ...

2020-03-18 06:50:45 185

原创 Java Grammar(三):修饰符

简介修饰符是用于限定类型以及类型成员申明的一种符号,从修饰对象上可以分为类修饰符,方法修饰符,变量修饰符;从功能上可以划分为访问控制修饰符和非访问修饰符。访问修饰符控制访问权限,不同的访问修饰符有不同的权限范围,而非访问修饰符则是提供一些特有功能。下面我们从功能的角度分别讲解修饰符访问修饰符访问修饰符有四种:public,private,protected,default。这里需要注意,...

2020-03-17 08:32:23 266

原创 Java Grammar(二):运算符

运算符简介计算机自打诞生以来,用作最多的就是进行计算,而计算离不开运算符,所以运算符在我们的Java语言中的地位举足轻重,我们现在就来了解一下Java给我们提供的运算符。从运算的元素的个数来区分,可以分为一元运算符,二元运算符,三元运算符。其中一元运算符包括:+(正数)-(负数)++(自增1)—(自减1)~(按位取反)!(逻辑取反)其实自增和自减也可以看成是特殊的二元运算...

2020-03-16 08:22:50 581

原创 「每日五分钟,玩转JVM」:指针压缩

64位JVM和32位JVM 最初的时候,JVM是32位的,但是随着64位系统的兴起,JVM也迎来了从32位到64位的转换,32位的JVM对比64位的内存容量比较有限,但是我们使用64位虚拟机的同时,也带来了一个问题,64位下的JVM中的对象会比32位中的对象多占用1.5倍的内存空间,这是我们不想看到的(又要马儿跑,又要马儿不吃草可还行?),但是机智的程序员不会屈服,所以在JDK 1.6的版本后,...

2020-01-07 06:51:20 785

原创 「每日五分钟,玩转 JVM」:GC概览

前言GC(Garbage Collection)是我们在学习 JVM 的过程中不可避免的一道坎,接下来,我们就来系统的学习一下 GC。做一件事情之前,我们一定要去知道我们为什么要去做,这里不仅仅指 GC,更适用我们日常的学习和生活,知其然,知其所以然,方能百战不殆。下面我们先去了解为什么要有 GC,以及 GC 在 JVM 中扮演了一个什么样的角色,起到了什么的作用?为什么要有 GC用过...

2019-11-15 09:16:07 798

原创 「每日五分钟,玩转JVM」:线程共享区

前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区(...

2019-08-27 07:00:00 506

原创 每日五分钟,玩转JVM(三):线程独占区

前言 如果我们对计算机组成有所了解,那么我们一定会知道在计算机中有一块儿特殊的区域,称之为寄存器,寄存器包括了指令寄存器和程序计数器,这两样位于CPU中,作为程序运行的大...

2019-08-20 07:00:00 533

原创 Java Grammar:数据类型

Java的数据类型我们知道,Java是一种 强类型 语言,类型对于Java语言来说非常的重要不言而喻,在Java中,分为 基础数据类型 和 引用数据类型 ,其中基础数据类型分为了 四类八种:下面,我们来分别说一下这四类八种整型首先,需要说明一点,在Java的整形中不存在 unsigned 类型的数值,也就是说Java的整形都是有符号的可为正,可为负...

2019-08-06 07:00:00 701

原创 JVM(二):画骨

概述 我们首先来认识一下JVM的运行时数据区域,如果说JVM是一个人,那么运行时数据区域就是这个人的骨架,它支撑着JVM的运行,所以我们先来学习一下运行时数据区域的分类和...

2019-08-05 07:00:00 620 2

原创 JVM(一):久识你名,初居我心

聊聊JVM JVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别...

2019-07-26 07:00:00 431

原创 Spring Boot 2.x(十八):一文打尽邮件服务

前景介绍在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。大致思路我们要做的其实就是把Java程序作为一个客户端,然后通过配置SMTP协议去连接我们所使用的发送邮箱(from)对应的SMTP服务器,然后通过SMTP协议,将邮件转投到目标邮箱(to)对应的SMTP服务器,最后将该邮件分发到目标邮箱Spring Bo...

2019-07-22 22:47:50 671 1

原创 一道面试题引发的思考

背景介绍这里给大家分享一道很有趣的面试题。面试过程面试官:redis我看你有使用过,说一下redis的基本类型吧?A:String,Hash,Set,List,Zset。面试官:redis中string类型的实现有没有了解过?A:(喵喵喵?)面试官:回家等通知吧。面试反思作为一个爱学习的好孩子,遇到不会的当然要努力学习了,于是查阅了良多资料,算是把这个问题给搞明白了,下面且听我慢...

2019-07-09 08:55:05 248

原创 Spring Boot 2.x(十七):Elastic search快速入门

Elasticsearch是什么? Elasticsearch是一个基于Lucene的搜索服务器,Elasticsearch也是使用Java编写的,它的内部使用Lucen...

2019-05-20 07:30:00 270

原创 Spring Boot 2.x(十六):玩转Vue文件上传

为什么使用Vue-Simple-Uploader最近用到了Vue + Spring Boot来完成文件上传的操作,踩了一些坑,对比了一些Vue的组件,发现了一个很好用的组件——Vue-Simple-Uploader,先附上gayhub的,再说说为什么选用这个组件,对比vue-ant-design和element-ui的上传组件,它能做到更多的事情,比如:可暂停、继续上传上传队列管理,支持...

2019-05-10 20:56:54 571 1

原创 Spring Boot 2.x(十五):Dubbo + Zookeeper + 新版Dubbo Admin

Dubbo 简介Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。它提供了三大核心能力:面向接口的远程方法调用智能容错和负载均衡服务自动注册和发现。可以看出图中存在着五种角色:Provider:服务提供者Consumer:服务消费者Registry:服务注册中心Monitor:服...

2019-03-29 09:27:58 331

原创 Spring Boot 2.x(十四):整合redis看这一篇就够了

Redis简介Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。Redis的应用会话缓存(高效的读取)消息队列 (发布,订阅)统计系统(原子性)Redis的数据类型String: 字符串Hash: 散列List: 列表Set: 集合Sor...

2019-03-22 14:40:13 327

原创 Spring Boot 2.x(十三):你不知道的PageHelper

PageHelper说起PageHelper,使用过Mybatis的朋友可能不是很陌生,作为一款国人开发的分页插件,它基本上满足了我们的日常需求。但是,我想去官方文档看看这个东西配合Spring Boot进行使用的时候,发现了这个:所以花了一个晚上的时间,研究了一下合理的怎么玩这个。快速入门如果你想在一个Spring Boot项目中快速进行一次分页操作,只需要两步即可:导入Maven...

2019-03-15 09:11:56 375

原创 Spring Boot 2.x(十二):Swagger2的正确玩法

Swagger2简介简单的来说,Swagger2的诞生就是为了解决前后端开发人员进行交流的时候API文档难以维护的痛点,它可以和我们的Java程序完美的结合在一起,并且可以与我们的另一开发利器Spring Boot来配合使用。开始使用第一步:导入POM文件 <dependency> <groupId>io.springfox</gr...

2019-03-08 08:59:11 717

原创 Spring Boot 2.x(十一):打印接口日志

接口日志有啥用在我们日常的开发过程中,我们可以通过接口日志去查看这个接口的一些详细信息。比如客户端的IP,客户端的类型,响应的时间,请求的类型,请求的接口方法等等,我们可以对这些数据进行统计分析,提取出我们想要的信息。怎么拿到接口日志这里,我们使用的是Spring的两大杀器之AOP,通过在Controller层定义切点,然后对请求对象进行分析获取接口信息,同时开启一个ThreadLocal来...

2019-02-22 07:15:27 2124 2

原创 Spring Boot 2.x(十):构建优雅的RESTful接口

RESTful相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢?REST(Representational State Transfer)表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HT...

2019-01-25 15:50:14 445

原创 Spring Boot 2.x(九):遇到跨域不在慌

什么是跨域首先,我们需要了解一下一个URL是怎么组成的:// 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址http://www.baidu.com:8080/只要协议,子域名,主域名,端口号这四项组成部分中有一项不同,就可以认为是不同的域,不同的域之间互相访问资源,就被称之为跨域。随着前后端分离开发的越来越普及,会经常遇到跨域的问题,当我们在浏览器中看到这样的错误时...

2019-01-18 09:27:42 1357

原创 Spring Boot 2.x(八):日志框架的使用

我们为啥要用日志?最初我们开始接触Java的时候,我们通常会使用System.out.println()将我们想要知道的信息打印到控制台。但是,如果在服务器上我们去运行我们的Java程序,这个时候就凸显了日志对于一个系统来说的重要性,查找异常信息、分析系统运行情况等都需要用到日志。为什么是SLF4J?默认情况下,Spring Boot会用SLF4J + Logback来记录日志,并用INF...

2019-01-11 18:07:21 540

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除