自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 问答 (1)
  • 收藏
  • 关注

原创 浅谈 JVM 的内存划分、类加载、垃圾回收机制

java程序在运行之前需要先编译(将 .java文件变成 .class文件(二进制字节码文件))java程序运行时,java进程(即 JVM)就会读取对应的 .class 文件,并且解析内容,在内存中构造出类对象,并进行初始化…类对象:描述了这个类是什么样的,类里包含哪些属性,这些属性的名字、类型,被什么修饰词修饰;类里包含哪些方法,这些方法的名字、类型是什么;还描述了这些类继承自哪个父类,实现了哪些接口。因此类对象也是创建实例的具体依据。类加载就是:将类从文件加载到内存中。

2024-07-26 18:50:13 364

原创 面向字节流传输数据

当提到“传输数据面向字节流”,这是指在网络通信中,数据被视作一连串的无结构字节,而不是按照特定的数据块或记录进行传输。这种传输方式是面向传输层协议(如TCP)的一个特性,它允许数据以连续的字节流形式在网络中传输,而不关心数据的含义或边界。

2024-07-09 22:52:32 176

原创 浅谈如何在linux上准备java环境并成功部署项目

但是由于我的云服务器使用的版本是 centos7,比较老版,所以没有tomcat8.x系列,一般新版的服务器都会有的。而 openjdk 是开源社区维护的开源版本,所以虽然 oracle 官方的 jdk 和开源社区的 jdk 不是同一个东西,但是他们相差不大,并且功能相互兼容。当我们将自己的项目部署到云服务器上时,首先需要让云服务器上的数据库中含有自己项目对应的数据库、表。因为我们项目之前建的数据库、表是在本地的,项目部署到云服务器上就需要让项目访问的是云服务器上的数据库、表。

2024-06-29 15:38:33 1239 1

原创 浅谈linux(1)

ls:列出当前目录下所有内容ls 后面跟上某个具体路径:可以查看指定目录内容ls -l : 可以以列表形式查看,缩写为 ll3)、pwd查看当前路径对应的绝对路径。就是查看当前位置。/root 就表示在当前根目录下有一个 root 目录,上面我们使用 ll 命令发现有很多目录,也有root目录,这表明我们每次登陆成功,都会默认在root目录下。4)、cd切换当前目录。cd 的效果,就相当于我们在windows上双击文件然后进到文件/目录里一样。cd / :切换到根目录。

2024-06-28 02:57:24 608

原创 浅谈Tomcat

Tomcat 就是一个 HTTP 服务器。前面我们聊了HTTP服务器,像我们在网页输入URL,其实就是在给人家的HTTP服务器发送请求,既然有HTTP服务器,那就肯定有HTTP客户端。HTTP客户端,就是我们日常使用的浏览器。我们自己也可以搭建一个HTTP服务器,其实就是搭建网站的 ”后端部分“,本质上就是写个 TCP socket 服务器。但是会比较麻烦,有许多重复性的工作。

2024-06-27 01:28:31 912

原创 浅谈网络通信(4)

为了反制运营商劫持保护网络上传输的数据安全,http 开始出现加密版本,即 https。加密和解密。1、明文:要传递的原始信息2、密文:对原始信息进行加工后,即使信息落入黑客手里,黑客也不知道是什么意思3、密钥: 进行加密、解密的关键。密文如何还原成明文,还需要靠这个密钥;如何将明文变成密文,也需要依靠密钥。4、加密:使用密钥将明文变成密文。5、解密:使用密钥将密文变成明文。6、对称加密:加密和解密使用同一个密钥7、非对称加密:加密和解密使用不同密钥。

2024-06-26 20:21:54 1002

原创 面试题4:POST 比 GET 安全?

我们知道 GET一般将参数放到URL的查询字符串中,如果是实现登录页面,我们的用户名和密码就直接显示到浏览器的地址栏中了,此时就会轻易的被他人获取账号密码,很不安全。而POST会把参数放到 body 里,不会直接显示在URL上,所以更安全。虽然把用户名密码这些参数放到URL上的确不好,但是放到POST的body里也不见得就是安全,抓个包,就能看到body的信息了。HTTPS具有一定加密功能,但是实践中,主要还是会通过业务上的代码来进行加密。一般我们提到的网络安全,指的是:数据被黑客截获之后。

2024-06-23 16:58:23 445

原创 面试题3:GET 和 POST 有什么区别?

2、发请求时,给服务器传递的数据,GET 一般是放在查询字符串中,但GET 也可以把数据放在 body 里。POST 一般是放在 body 中,但是也可以放在 查询字符串 中,虽然少见,但是浏览器是可以支持的。如果当前GET不是幂等的,就需要通过特殊技巧避免浏览器产生缓存(典型的技巧就是让每次GET请求的URL都不相同:即通过特殊的查询字符串来保证 URL 的不同)。设计服务器时,就需要提供一些接口,接口传入的参数,就视为是输入,接口返回的接口,就视为是输出。幂等:输入结果是确定的,输出结果也是确定的。

2024-06-23 15:50:39 350

原创 面试题2:从浏览器输入一个URL,到最终展示前端页面这一过程,会发生什么?

交换机会把数据分用到数据链路层(更上层的就不用解析了),再重新封装,继续转发。路由器会把数据分用到网络层(更上层的就不用解析了),再重新封装,继续转发,路由器根据数据报中的目的IP在路由表中匹配,找个合适的方向发出去,每次转发,TTL就 - 1。就像 github 的域名是 www.github.com,很好记,但是他的 IP 地址是 20.205.243.166,其实我们在地址栏中输入github的IP地址,也是能够访问到github网站的,但是因为IP地址不好记,所以一般地址栏里输入的都是域名。

2024-06-22 20:53:03 377

原创 面试题1:如何使用UDP来实现可靠传输?

该面试题主要考查的是 TCP,虽然问的是 UDP ,但考察的是TCP。即基于UDP,在应用层实现超时重传机制、确认应答机制、引入序列号…

2024-06-20 14:10:12 123

原创 浅谈网络通信(3)

因为假设单个数据报丢包的概率为10%,那么第一次丢包的概率是0.1,第二次丢包的概率是0.1 * 0.1 = 0.01,因此丢包的概率是逐渐减小的,所以第二次传输,大概可以顺利到达的,所以超时重传的时间是逐渐变大的。那如果第二次传输也没有到达,说明当前网络环境比较糟糕,那单个数据报丢包的概率可能非常大,甚至概率是100%的,断网了,都断网了,再怎么频繁的重传,也没用,所以把超时重传的频率降低一点(时间间隔长一点),至少可以节省主机的开销。主机B的系统内核里,记录了一个数据结构,包含了和他连接的对方信息。

2024-06-15 21:58:37 1055

原创 浅谈网络通信(2)

应用层这一层,有很多现成的协议,也有很多时候,需要我们程序员自己去自定义应用层协议。自定义应用层协议,也是一件很简单的事情。举个例子:此处有一个需求场景:一个外卖软件,需要在用户打开此软件时,给用户显示用户住址附近的商家列表,列表中有很多项,每一项都包含了一些信息:譬如:商家名称、商家图片、商家店铺好评率,商家与用户的距离、商家评分…(其实外卖软件和服务器之间的沟通,有很多种方式,展示商家列表,只是其中之一)客户端(用户…):需要给服务器发起一个请求,服务器收到请求之后,就给客户端返回一个响应。

2024-06-12 11:14:12 1231

原创 浅谈JDBC

JDBC是一种可用于执行SQL语句的JAVA API,是链接数据库和JAVA应用程序的纽带。JDBC一般需要进行3个步骤:与数据库建立一个链接、向数据库发送SQL语句、处理从数据库返回的结果。

2024-06-09 19:04:23 265

原创 浅谈Spring MVC

1、Spring MVC 也叫做 Spring Web MVC,是基于Servlet 构建的,(因此之前在Servlet中的写法在MVC中同样适用,比如Servlet中的常用对象: Request、Response 对象,在MVC中同样可以使用)。2、是一个Web框架(即MVC具备HTTP能力:可以支持HTTP协议,当我们从前端/浏览器通过ajax(ajax底层是HTTP)发起一个请求时,此时这个MVC就可以直接去响应;

2024-06-07 19:50:11 975

原创 浅谈IDEA中项目如何进行热部署

热部署:当代码修改时,IDEA自动帮忙重新加载项目,无需手动加载。

2024-06-03 15:39:25 725

原创 浅谈SpringBoot日志文件

3、日志信息默认打印在控制台上,但控制台的日志信息不能被保存,那怎么永久将日志信息保存下来??

2024-06-02 20:34:27 1007 1

原创 浅谈旧项目如何添加新依赖

点击ok即可添加新的依赖了。

2024-06-02 20:00:50 197

原创 浅谈SpringBoot配置文件

譬如说:有些学校的教务系统不需要去访问第三方智慧树APP来获取学生线上选修课的通过率,他们自己使用自己学校内部开发的APP,那么此时这些学校就不需要在配置文件里配置第三方智慧树APP的秘钥了。因此这个第三方秘钥也可以说是一种用户自定义的配置文件。

2024-06-01 18:58:07 909

原创 浅谈如何解决配置文件.properties 中文乱码问题

properties 配置文件右下角默认是编码 ISO-8859-1。

2024-06-01 14:37:13 630

原创 浅谈网络通信(1)

那么QQ自定义的应用层协议是啥样的?咱们不知道,只有开发者才知道,因此此处QQ自定义的应用层协议我们通过假设进行举例子。假设QQ的应用层协议是这样自定义的:发件人的QQ号、接收人的QQ号、时间、消息内容那么此时就需要将自定义好的应用层协议,

2024-05-26 20:36:42 1156

原创 多线程 —— 锁策略

锁策略,对于需要实现锁的程序员要重点掌握;对于普通的程序员,工作中很少会被要求实现一把锁,但普通的程序员会常常在代码中使用线程进行 “并发编程”,此时就会涉及到多线程,多线程会涉及到线程安全问题,线程安全问题就需要加锁进行解决。因此对于程序员来说,锁策略的知识点也需要掌握好。死锁:即在多线程或者多进程的环境下,两个或多个线程在执行过程中,由于争夺资源而造成的一种相互等待的现象,如果没有外力干涉,这些线程都将无法执行下去。

2024-05-24 11:39:49 658

原创 浅谈如何自我实现一个消息队列服务器(8)——编写客户端部分

6.2、如果响应是针对请求的响应,此时就将响应的payload解析出来,变成 BasicReturns ,根据 BasicReturns 里面的 channelId 在 channelMap里查询对应的 Channel 对象,如果 Channel 对象不存在,说明当前响应对应的客户端并不存在,直接抛异常,如果不为空,就将当前响应存入记录服务器返回响应的哈希表basicReturnsMap里,使用方法 putReturns(basicReturns)处理。(2)、服务器推送给客户端(订阅者)的消息。

2024-05-11 17:16:15 1002 2

原创 浅谈如何自我实现一个消息队列服务器(7)——编写服务器部分

再次拿出这张图,前面我们已经将重要概念:VirtualHost、exchange、msgQueue、message、binding 都实现了,此时就可以开始编写消息队列MQ的本体:BrokerServer (服务器),由于消息队列的服务器是一个基于 TCP 协议进行通信的服务器,因此消息队列的 BrokerServer 也叫做 TCP服务器。构造响应对象,设置好响应对象中的值,然后打印 rid、channelId、响应 type、响应 length。方便后续判断当前是哪个连接,连接中的哪一对请求、响应。

2024-05-10 17:13:48 1030

原创 多线程典型例子(4)——线程池

由于该线程池类 ThreadPoolExecutor 中的线程数并不是一成不变的,而是根据任务的情况动态变化(自适应),如果任务多,该线程池中的线程数就多一些(创建出来),任务少,该线程池中的线程数就少一些(多余的就销毁),但是此处的动态变化也并不是没有限制,因此ThreadPoolExecutor类的构造方法提供了几个不同含义的参数,来对线程池的动态变化产生一定限制。因此可以使用 线程池,提前创建好一些线程放在线程池中,后续需要使用线程时,直接从线程池中随取随用即可,当线程不再使用时,就放回池子里。

2024-05-09 23:39:39 883

原创 多线程典型例子(2)——单例模式——饿汉模式、懒汉模式

详情

2024-05-07 19:29:32 418

原创 浅谈操作系统中的重要概念——线程(3)——设计模式

设计模式就相当于菜谱,有了菜谱/秘籍,就能够根据菜谱上的指引/步骤做出许多从前不会的美食,就算不会下厨的人,拥有了食谱,他的厨艺也能够得到提升和保障。因此设计模式就是程序员的菜谱,设计模式中介绍了许多典型场景,以及针对这些典型场景的处理办法。按照设计模式来写的代码不会很差,在一定的规范范围里。设计模式有很多种,不止23种,今天主要介绍两种常见、常用的:1、单例模式2、工厂模式工厂,顾名思义是用来生产的。那么对应到我们代码上,工厂模式就是用来生产对象的。那么具体是怎么进行生产对象的呢??

2024-05-07 19:26:49 949

原创 多线程典型例子(3)——定时器

定时器:是日常开发中常见的组件,前端/后端都常用到。类似于一个闹钟:等待一定的时间后,执行某个任务。Java中对于定时器的使用提供了标准库中的Timer类(来自于java.util 包下的类 )。/*** 自我实现一个定时器* 实现思路:* 先描述,后组织。* 1、先要能够将一个任务描述出来* 2、使用一定的数据结构将多个任务 TimerTask 组织起来* 创建一个 TimerTask 这样的类表示要执行的任务,类里表示任务执行的内容,以及任务的实际执行时间。

2024-05-05 21:14:07 116

原创 浅谈操作系统中的重要概念——线程(2)

该篇文章继续重点介绍关于线程的使用,对于Java程序员来说,掌握线程的知识是非常必要的,不仅笔试面试中会用到,实际工作中更会用到。

2024-04-29 20:20:57 649 3

原创 浅谈操作系统中的重要概念——线程(1)

最初是尝试在创建进程时,只给进程分配一个简单的PCB,而不去分配后续进程运行时所需的系统资源,此时这类进程称作——轻量级进程(也叫做 线程 Thread),但是这样的尝试还是出现一个问题:线程创建出来,也是为了到cpu上执行,完成相关任务的。刚创建出来的进程,可以视为是一个只包含一个线程的进程(此时创建的过程需要分配资源,因此此时第一个线程创建的开销就可能比较大,后面再在这个进程里创建的线程,直接服用当前进程的资源,开销就比较小)一个进程中的前台线程都结束了,后台线程还没执行完,也会跟着进程的结束而退出。

2024-04-27 21:22:11 933

原创 浅谈在Java代码中创建线程的多种方式

第一种创建线程的方式就是:自定义一个类,并且使该类继承自Java标准库 Thread 类,此时自定义的类需要重写 run() 方法。注意:重写的 run() 方法,要处理异常时,只能 try {} catch (),并不能 throws,这是因为 Thread 类中的 run() 方法并没有throws xxx这样的设定。重写的 run() 方法里书写的逻辑代码就是我们创建出来的新线程,所要执行的任务。

2024-04-27 21:19:57 856 1

原创 浅谈操作系统中的重要概念——进程

以 .exe 为后缀的可执行文件就是一个程序,一般是存储在硬盘上的。上图中,我们可以看到 QQ.exe 就是一个以.exe 为后缀的可执行文件,因此他就是一个程序,应用程序;图中其他以.exe结尾的文件,其类型也是应用程序。程序在没有双击运行时,是静态的存放在硬盘上的,此时并不会消耗系统资源。正在运行的程序就是进程。譬如说:QQ这个程序没有运行时,以 .exe 作为后缀的文件静态的存放在硬盘上,并没有运行。双击运行时,同一个程序,可以产生多个进程。

2024-04-25 21:34:05 888 1

原创 浅谈 操作系统

操作系统 其实就是一个软件(software)。是一个用来进行管理的软件。进行什么样的管理呢?操作系统一般由 内核 + 配套的程序 组成。内核即一个系统最核心的功能:对下,能够管理好各种硬件设备;对上,能够为各种程序提供稳定的运行环境。

2024-04-25 12:26:21 272 1

原创 浅谈如何自我实现一个消息队列服务器(6)—— 网络通信设计

既然是进行网络通信,那必然既会有 请求,也会有 响应。此处我为了简化项目代码,便将请求、响应 的协议格式设成一致。请求格式:响应格式:接下来来简述一下请求、响应里的3部分,分别是什么意思。type:描述当前 请求 和 响应 分别是干什么的。

2024-04-23 18:46:47 1014

原创 浅谈 StringTokenizer 类

最近在编写代码时以及在 牛客、leetcode 上刷题时,有时候会遇到需要对一个字符串进行几部分的截取 这样的需求场景。一般我都是使用 字符串 String 类自带的 split()方法 进行截取字符串,不过由于这个 split()方法 里传入的参数比较特殊,其传入的参数需要是正则表达式。譬如说:当前有个字符串 x = “aaa\tbbb\tccc”,我希望以 \t 为分隔符,将 x 截取,分成好几个字符串子串。

2024-04-21 17:21:26 1070

原创 浅谈 刷算法题时遇到运行超时异常 的解决办法

最近在牛客、leetcode 刷算法题时发现一个奇怪的问题,明明解题思路、所用算法与题解一致,并且在本地IDE运行是通过的,但是在牛客、leetcode 却没办法AC,出现一个叫做 运行超时 的异常。通过查阅资料、反复验证之后,找出了一个有效的解决办法。

2024-04-20 21:09:08 1123

原创 浅谈在 java 中如何从控制台输入一个字符

在 leetcode 上练习算法题时,题目要求输入一个浮点型数值以及一个字符。当我书写Scanner sc = new Scanner(System.in)后,打算通过sc.nextXX实现从控制台输入一个字符时,突然意识到原来Java语法中的Scanner类并没有直接定义读取 char 的方法。由于之前也并没有遇到过需要从控制台输入一个字符的需求场景,因此此时就对如何输入一个字符的问题绞劲脑汁,终于整理出了几种方法,实现从控制台输入字符。

2024-04-19 19:36:42 451

原创 浅谈如何自我实现一个消息队列服务器(5)—— 实现9个核心API中的basicComsume()

1)、自定义一个接口。2)、该接口中只能含有1个方法。3)、该接口必须添加注解 @FunctionInteface 后才能使用此时,我们在 common 包下创建一个 Comsumer 接口,作为我们的 回调方法,同时 Comsumer 回调接口中定义一个 handleDelivery()用来消费消息。

2024-04-10 23:29:28 779

原创 查看MySQL版本的方式

但其实通过连接上mysql客户端服务器的方式去查看 mysql版本的方式,其实有点叫做多此一举,因为当我们输入用户名、密码连接上mysql时,其提示信息已经给出了mysql的版本。这个方法适用于已经成功运行了mysql的童鞋。(注意了,此时的V是个大写的V)

2024-04-05 18:45:23 4258 1

原创 浅谈如何自我实现一个消息队列服务器(4)—— broker server部分使用virtualHost进行整合

因为不同的交换机类型,其转发消息到队列中的转发规则不一样。5)、(获取到队列名之后,查看当前队列是否存在,存在,就构造一个消息对象,再判定一下该消息是否存在,不存在,抛异常,存在,下一步。2)、如果不存在,先对bindingKey进行合法性校验,如果bindingKey不存在,抛异常,如果bindingKey合法,创建Binding对象,然后再判定一下Exchange和MSGQueue是否都存在,如果其一不存在,都需要抛异常,如果存在,3)、判定交换机、队列是否都是持久化,是的话就写硬盘,然后再写内存。

2024-04-03 08:51:18 694

原创 使用IDEA中的 Find Usages

在上述的图片中,我选中了一个方法,右键选择 Find Usages ,点击之后即可看到此方法,究竟被几个地方进行引用。使用IDEA中的 Find Usages ,能够查看某个方法、变量,在哪个地方进行了引用。

2024-04-01 21:18:42 474

空空如也

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

TA关注的人

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