- 博客(63)
- 收藏
- 关注
原创 数据库被黑客删除并勒索0.0125比特币,分析原因总结经验避免再次发生
一直关注开发,对数据的安全和备份确实有失关注了,还好只是测试数据,但是被黑客攻击这一经历,给我敲响了警钟,让我意识到网络世界中要保护信息的安全。于是针对于此,做了很多数据库安全加固,给大家做个分享。
2024-06-10 13:07:24 1542
原创 Linux启动KKfileview文件在线浏览时报错:启动office组件失败,请检查office组件是否可用
通过阅读官方更新内容得知,KKFileView在4.0.0版本之后,将底层集成 OpenOffice 替换为了 LibreOffice,而 OpenOffice 本身在linux的安装盘中都会携带,不需要自行安装。此次更新将底层替换成了LibreOffice,由于 linux 中没有,自然就会出现报错。
2024-06-09 15:44:25 2649 2
原创 使用STS临时访问凭证通过客户端直连OSS对象存储服务器
客户端直传是指客户端直接上传文件到对象存储OSS。相对于服务端代理上传,客户端直传避免了业务服务器中转文件,提高了上传速度,节省了服务器资源。在典型的服务端和客户端架构下,常见的文件上传方式是服务端代理上传:客户端将文件上传到业务服务器,然后业务服务器将文件上传到OSS。在这个过程中,一份数据需要在网络上传输两次,会造成网络资源的浪费,增加服务端的资源开销。为了解决这一问题,可以在客户端直连OSS来完成文件上传,无需经过业务服务器中转。
2024-06-02 08:45:00 1864 1
原创 系统开发实训小组作业week7 —— 优化系统开发计划
在项目的开发过程中,我们小组遇到了一些数据库设计与管理方面的问题。为了提高项目的效率和质量,我们商议了以下改进计划。
2024-04-10 14:31:16 930 6
原创 【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
semaphore 信息量的概念抽象:停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车辆就会加1,当显示屏上的剩余车位为0时,停车场入口的栏杆就不会再打开,车辆就无法进入停车场了,直到有一辆车从停车场出去为止。
2024-03-19 08:45:00 2305 74
原创 【网络原理】TCP 协议中比较重要的一些特性(三)
和流量控制一样,也是用来限制发送方的发送速率的。如果当前接收方处理速度很快,但是中间的通信路径出现问题,某个地方出现了“堵车”现象,此时发送的速度再快也没有(反而发的越快丢包丢的越多)。将中间路径的所有设备视为一个整体,如果按照某个窗口大小发送数据后出现了丢包,就视为中间路径存在拥堵,就减少窗口大小;没有出现丢包,就视为中间路径不存在拥堵,就增加窗口大小。
2024-03-17 08:45:00 4515 91
原创 【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
对框架和设计模式的简单理解就是,这两者都是“大佬”设计出来的,让即使是一个代码写的不太好的“菜鸡程序员”也能写出还可以的代码。设计模式也可以认为是对编程语言语法的补充。此处提到的“单例模式”就是一种设计模式。
2024-03-15 08:45:00 1565 32
原创 【网络原理】TCP 协议中比较重要的一些特性(二)
TCP 状态和“线程状态”是类似的概念,用于描述 TCP 连接过程中正在执行什么操作。TCP 服务器和客户端都有一定的数据结构来保存连接信息,而这个数据结构中有一个属性叫“状态”,操作系统内核根据状态的不同,决定当前应该执行什么操作。
2024-03-13 08:45:00 2146 74
原创 【网络原理】TCP 协议中比较重要的一些特性(一)
TCP 是工作中最常用到的协议,也是面试中最常考的协议,具有面向连接,可靠传输,面向字节流,全双工的特点,其中可靠传输是 TCP 安身立命的本钱,TCP 设计的初心就是为了解决“可靠传输”这个问题。
2024-03-11 08:45:00 1171 9
原创 JVM 的垃圾回收机制以及垃圾回收算法的详解
引入了“对象的年龄”这样的概念,JVM 中有专门的线程负责周期性扫描/释放,一个对象如果被线程扫描一次,并且“可达性分析”证明可达(不是垃圾),此时将该对象的年龄属性 + 1(初始年龄为0)。然后经过一轮 GC 扫描后,会有少数存活的对象通过“复制算法”拷贝到生存区(有两个生存区),后续的 GC 扫描线程会对伊甸区和生存区都进行扫描,伊甸区中少数存活的对象同样会进入生存区,而生存区中仍然存活的对象会拷贝到另外一个生存区。
2024-03-09 08:45:00 2129 32
原创 对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解
类加载指的是 Java 进程运行的时候,需要把 .class 文件从硬盘读取到内存,并进行一系列的校验解析的过程。类加载的过程其实就是 .class 字节码文件转成 类对象 的过程,本质上也是数据从硬盘到内存的过程。
2024-03-07 12:24:04 1044 6
原创 【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
本质上就是学习传输层给应用层提供的 api,通过 api 把数据交给传输层,进一步地层层封装将数据通过网卡发送出去,这也是网络程序的基本工作流程。掌握了基础 api 就能更好的理解实际开发中使用的框架(spring,dubbo)的工作过程,也提供了魔改/自己实现框架的能力。
2024-03-01 08:45:00 1477 12
原创 【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
文章总结了面试中有关多线程的考点,主要涉及锁的策略、synchronized中锁的升级,锁消除,锁粗化的过程以及CAS(Compare and swap)比较并交换,并引申出CAS的ABA问题,以及对应的解决方案。
2024-02-27 08:23:24 1385 23
原创 【Java多线程】对线程池的理解并模拟实现线程池
提前把要使用的线程,在线程池中准备好,等到需要用时就从池子里取出,用完之后再归还给池子。其中取出和归还操作都是属于纯用户态代码,这就比内核操作更快,更可控。
2024-02-25 08:45:00 1326 12
原创 【Java多线程】分析线程加锁导致的死锁问题以及解决方案
出现锁竞争进而引起阻塞状态,这个阻塞会一直持续到下一个线程释放锁为止。但是,设想一个场景,共有AB两个线程,此时A线程因为锁竞争进入阻塞状态,而如果此时B线程恰巧也正在阻塞状态,由于AB线程都进入了阻塞状态,此时进程无法运行,出现死锁问题。下面针对死锁问题的出现以及解决方法展开讨论。
2024-02-22 09:46:47 1698 19
原创 【Java多线程】线程安全问题与解决方案
某个代码,无论是单线程下执行还是多线程下执行都不会产生bug,被称之为“线程安全”;如果在单线程下执行正确,但是多线程下会产生bug,被称之为“线程不安全”或者“存在线程安全问题”;
2024-02-20 08:45:00 1359 13
原创 【Java多线程】线程中几个常见的属性以及状态
和进程一样,线程也有状态,Java中对线程的状态又进一步的区分,表达得更加丰富。t 线程执行完后,内核pcb也随之释放,但是当程序还未结束时,t 变量还存在,此时也为false。顾名思义,但是在Java中设置优先级,效果可能不太明显(由于系统的随机调度)。
2024-02-18 08:45:00 1572 27
原创 【Java多线程】Thread类的基本用法
虽然线程底层的调度是随机的,但是可以在应用程序中,通过一些api,来影响到线程的调度顺序使用join就是其中一种方式,使用多个线程并发进行一系列计算,用一个线程阻塞等待上述计算线程,等到所有的线程都计算完了,最终这个线程汇总结果。
2024-02-16 09:00:00 1298 9
原创 【Java多线程】对进程与线程的理解
进程是包含线程的,每个进程至少有一个线程存在,即主线程。进程和进程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间(所以资源开销少,但会影响其他线程)。没有线程这个概念之前,进程是系统分配资源的最小单位,也是系统调度执行的最小单位。有线程这个概念之后,进程是系统分配资源的最小单位,线程是系统调度执行的最小单位。一个进程挂了一般不会影响到其他进程,但是一个线程挂了, 可能把同进程内的其他线程一起带走(整个进程崩溃)。
2024-02-14 20:53:38 1986 38
原创 【数据结构】二叉树的三种遍历(非递归讲解)
学习二叉树的三种非递归遍历前,首先来了解一下递归序递归序就是按照先序遍历的顺序,遇到的所有结点按顺序排列,重复的结点也必须记录。我们可以发现递归序中每个结点都会遇到三次。这是因为当进入某一结点时,对该结点进行第一次操作,然后调用其左孩子结点,等左孩子结点结束调用时会返回自己,此时就可以对自己进行第二次操作,然后再调用其右孩子结点,等左孩子结点结束调用时又会返回自己,此时就可以对自己进行第三次操作,因为不管怎样,调用完孩子结点后终究会返回到父结点。
2024-02-07 10:30:06 1544 12
原创 【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
该题如果使用暴力破解法,其代码实现过程是很容易想到的,只需要找到nums1此时的元素在nums2中的位置,并向右查询是否存在更大的值,有则返回该值,无则返回-1即可。结合思想不难想到时间复杂度为O(m*n),m和n分别为两个数组各自的长度。虽然该题直接使用暴力破解法可以直接通过,但是只是出题人没有为难大家,如果该题的数据非常庞大,此时直接使用暴力破解法必然会导致超时。而本文将讲解单调队列的算法模版解决这类问题(next greater number问题),它能够很好的将时间复杂度控制在O(m+n)。
2024-02-05 12:18:33 1296 13
原创 【数据结构】二叉搜索树的模拟实现
Java底层实现搜索树的两个主要类是TreeSet和TreeMap。TreeSet是基于红黑树(Red-Black tree)实现的,它提供了对元素的唯一性排序。TreeSet中的元素是唯一的,并且按照升序排序。TreeMap也是基于红黑树实现的,它提供了一个键值对的映射关系,并且按照键的升序排序。TreeMap允许使用null键和null值。这两个类都实现了NavigableMap和SortedMap接口,提供了更丰富的方法用于搜索、排序和遍历操
2024-01-29 18:14:24 1308 16
原创 【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
top-k问题:即求数据集合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。对于top-k问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决
2024-01-23 09:34:00 1814 13
原创 【数据结构】二叉树相关oj题(一)
层次遍历需要使用到队列,利用队列先进先出的特性使遍历能够从上到下,从左到右顺序遍历。该题唯一的难点就是返回值的规范。题目中要求返回的是List,从示例中可以看出,每一层的节点分别使用有一个List来存储,这就要求我们不仅需要实现层序遍历,还需要将遍历结果按照层数划分。
2024-01-21 22:32:54 1285 8
原创 【计算机网络】虚拟路由冗余(VRRP)协议原理与配置
VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。是一种LAN接入设备备份协议。一个局域网络内的所有主机都设置缺省网关,这样主机发出的目的地址不在本网段的报文将被通过缺省网关发往三层交换机,从而实现了主机和外部网络的通信。
2023-11-29 22:18:46 4316 12
原创 【JavaSE】基础笔记 - 异常(Exception)
在日常开发中,绞尽脑汁将代码写的尽善尽美,在程序运行过程中,难免会出现一些奇奇怪怪的问题。有时通过代码很难去控制,比如:数据格式不对、网络不通畅、内存报警等。当出现这些问题时,JVM虚拟机会自动捕获这些问题并抛出错误信息。在Java中,将程序执行过程中发生的不正常行为称为异常。
2023-11-23 23:21:55 1609 11
原创 【计算机组成原理】知识点巩固 - 存储器概述
由于信息载体和电子元器件的不断发展,存储器的功能和结构都发生了很大变化,先后出现了多种类型的存储器,具体可以从以下不同的角度进行分类。
2023-11-18 20:37:34 1426 34
原创 【JavaSE】基础笔记 - 图书管理系统(保姆教程,含源码)
Java的三大特性是:封装、继承和多态。最近博主刚刚学完Java的三大特性,因此想写一个小项目巩固一下知识点。这次的简单图书管理系统主要是为了练习继承,接口和多态的使用,那么就用这篇博客来讲解一下这个小项目,目的只是为了练习。
2023-11-17 21:50:01 1026 13
原创 【JavaSE】基础笔记 - 类和对象(下)
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。this引用的是调用成员方法的对象。例如当调用a.setDay()是,此时的this就代指a,如下图。同理b也一样。
2023-11-07 22:46:23 1865 87
原创 【JavaSE】基础笔记 - 类和对象(上)
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。面相对象程序设计关注的是对象,而对象是现实生活中的实体洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。
2023-11-05 18:32:55 2242 71
原创 【LeetCode力扣】42. 接雨水
42. 接雨水 - 力扣(LeetCode)leftMax用于记录当前左指针left经过的最大高度,同理rightMax用于记录当前左指针right经过的最大高度。下标 i 处能否接水以及接到水的数量其实取决于左指针left到 i 时所经过的最大高度leftMax与右指针right到 i 时所经过的最大高度rightMax它们之间的较小值。
2023-10-29 17:37:10 1996 118
原创 【LeetCode力扣】189 53 轮转数组 | 最大子数组和
189. 轮转数组 - 力扣(LeetCode)53. 最大子数组和 - 力扣(LeetCode)我们可以使用额外的数组来将每个元素放至正确的位置。用 len 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k) % len 的位置,最后将新数组拷贝至原数组即可。
2023-10-28 21:14:51 1568 60
原创 【Java】JDK 21中的虚拟线程以及其他新特性
JDK 21是Java开发工具包的最新版本,它引入了许多令人振奋的新特性,旨在提高开发人员的生产力和代码质量。在本文中,我们将介绍一些JDK 21的新特性,并提供使用示例,以帮助您更好地理解和应用这些功能。
2023-10-23 12:43:51 1498 43
原创 【LeetCode力扣】234 快慢指针 | 反转链表 | 还原链表
234. 回文链表 - 力扣(LeetCode)判断回文,就是判断是否是对称的。有些朋友对于数组的回文判断非常熟悉,但是对链表的回文判断可能就无从下手了,其实都一样的。有一种非常简单的方式就是将链表转化成数组,然后就是判断该数组是否回文就可以了,这种方式统称暴力破解法,简单粗暴。下面就来先带着大家看一下这道题的暴力破解法。
2023-10-22 10:30:00 1089 109
原创 【LeetCode力扣】86. 分隔链表
86. 分隔链表 - 力扣(LeetCode)考虑通过「新建两个链表」实现原链表分割,算法流程为:新建两个链表small和BigEqu,分别用于链接小于标志数 x 的结点和大于等于标志数 x 的结点。遍历链表head并依次比较各节点值 head->val 和 x 的大小,若head->val < x ,则将head指向的该结点添加到链表 small 最后面。若head->val >=x,则将head指向的该结点添加到链表BigEqu最后面。遍历完成后,拼接small和Big
2023-10-20 12:53:10 1141 126
原创 【LeetCode力扣】297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 - 力扣(LeetCode)二叉树序列化就是将内存中的二叉树变成硬盘中的字符串形式,并且要求每个二叉树能够对应一个唯一的字符串。二叉树反序列化就是将这个唯一字符串在内存中还原回对应的二叉树。
2023-10-15 10:00:00 1345 100
原创 【LeetCode力扣】75 快速排序的子过程partition(荷兰国旗问题)
75. 颜色分类 - 力扣(LeetCode)荷兰国旗问题
2023-10-12 17:01:27 1241 144
原创 【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
在上篇当中给大家介绍了二叉树的先序遍历、中序遍历以及后序遍历的递归写法。递归的系写法主要是理解递归序,只要递归序能够理解清楚,就能够很轻易地理解和书写递归实现三次遍历。任何递归函数都可以改成非递归函数,因为递归函数不是什么玄学,只是递归时系统帮忙解决了压栈问题。那么不用递归方式的话只要自己手动进行压栈依然可以完成递归能够实现的功能。那么在接下来的下篇中,我将带大家审深入学习二叉树三种遍历的非递归写法,也是二叉树遍历的代码中的。
2023-10-10 10:16:49 887 130
原创 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
使用递归和非递归的方式实现二叉树的先序、中序、后续遍历,其中递归部分使用了递归序的知识点进行讲解,让读者更加任意理解其中的含义。
2023-10-09 10:30:00 601 59
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人