自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 网络原理 6 - IP协议

上篇文章我们已经介绍完了TCP中的一些核心的机制。那么我们在传输层中应该选择TCP协议还是UDP协议呢?TCP特点:有链接、可靠传输、面向字节流、全双工。UDP特点:无连接、不可靠传输、面向数据报、全双工。应用场景:如果需要可靠传输,首选TCP,如果当前要传输的数据包很大,也首选TCP。绝大部分的场景,都可以优先考虑TCP~~UDP相比于TCP,最大的优点就是传输效率,比如有的场景中,对于效率要求很高,但是对可靠性要求不高,就可以优先选择UDP。那既对可靠性有要求,又对性能有要求的场景(比如打LOL等竞技类

2025-06-10 09:00:00

原创 网络原理5 - TCP4

在之前的文章中,我们已经介绍了TCP的5个机制:确认应答、超时重传、连接管理、滑动窗口和流量控制,接下来我们来学习TCP的另外五个机制。

2025-06-07 21:51:07 949 1

原创 网络原理 4-TCP3

上篇文章,我们讲了TCP协议的连接管理(”三次握手“和”四次挥手“的过程)。

2025-06-06 00:23:43 677 1

原创 网络原理3—TCP 2

(重点!!!上篇文章,我们讲到了TCP保证可靠性传输的其中两个机制——确认应答和超时重传,这篇文章。我们来讲述TCP保证可靠性的第三个机制——

2025-06-05 19:47:20 1558

原创 网络原理 2——TCP1

TCP全称为“传输控制协议”(Transmission Control Protocol),它会对数据的传输进行一个详细的控制。

2025-06-04 09:00:00 666

原创 网络原理1

(网络传输的数据要怎么使用,也要考虑数据是什么样的格式,包含哪些内容)。应用层的协议在开发时一般是客户端和服务器共同约定的。

2025-06-03 20:17:02 983

原创 Java网络编程API 2

是创造TCP服务器端的API。

2025-06-03 09:00:00 958

原创 Java网络编程API 1

DatagramSocket是UDPSocket,用于发送和接收UDP数据报,就相当于网卡的作用。

2025-06-02 01:23:28 873 1

原创 网络编程1_网络编程引入

网络编程:网络上的主机,通过不同的进程,以编程的方式实现网络通信(网络数据传输)。也可以只需要满足进程不同即可。所以即使是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。特殊的,对于开发来说,在条件有限的情况下,一般也都是在一个主机中运行多个进程来完成网络编程。但是,我们一定要明确,我们的目的是使网络上的不同主机,基于网络来传输数据资源。进程A :编程来获取网络资源。进程B:编程来提供网络资源。

2025-05-31 10:00:00 788

原创 文件操作和IO—IO代码案例

查找硬盘上文件的位置。需要我们给定一个文件名和需要搜索的目录,根据所给的信息,找到文件名匹配的结果并打印出该文件的绝对路径。之前我们讲过文件系统的目录是。

2025-05-24 21:47:16 571 1

原创 文件操作和IO-3 文件内容的读写

编译器就可以进行检查,如果想要创建实例就会编译报错。所谓面向对象,就是通过代码抽象来表示实际事物的一种方式。

2025-05-23 00:13:58 773

原创 文件操作和IO-2 使用Java操作文件

这两种属性是文件路径的表示,可以表示为字符串类型或者字符类型,依赖于路径分隔符,实际开发中多使用“\”进行分隔。

2025-05-20 21:26:51 1016

原创 文件操作和IO—初识文件

狭义上的文件(file),,类似于办公桌上一份份文件一样。计算机中存储数据的设备:对于计算机来说,“文件”是一个广义的概念,硬盘上的普通文件,硬盘上的目录(文件夹),很多的硬件设备,都是被操作系统抽象成了文件(键盘、显示器、网卡……)作为程序员,我们并不关心硬盘的内部物理结构,写代码时并不涉及这些结构细节,操作系统都帮我们封装好了。操作系统有一个专门的模块,把硬件细节封装好,提供统一的API来给程序员调用。文件除了有数据内容之外,还有。

2025-05-20 17:15:45 801

原创 多线程进阶

sychronized背后涉及了很多的优化手段:1、锁升级:偏向锁 -> 轻量级锁 -> 重量级锁。2、锁消除:自动干掉不必要的锁。3、锁粗化:把多个细粒度的锁合并成一个粗粒度的锁,减少锁竞争的开销。这些机制都是在内部默默发挥作用的,是JVM的大佬们为我们默默奉献的(他暖,我哭~~~CAS:compare and swap,字面意思:“比较并交换”,是一个特殊的CPU指令(严格的说,和Java无关,它是操作系统内部)(JVM中关于CAS的API都是在unsafe包中,即不安全)。

2025-05-20 00:03:06 994

原创 多线程代码案例-4 线程池

池是一个非常重要的概念,我们有常量池,数据库连接池,线程池,进程池,内存池……一开始讲过,进程能够解决编程问题,但是因为频繁创建和销毁进程,需要耗费大量的空间、时间,成本太高了,所以我们引进了。但是如果创建和销毁线程的频率进一步提高,此时线程创建和销毁的开销,也不能忽略了。(抛开剂量谈毒性,都是耍流氓),因此我们需要想办法,。1、引入轻量级线程——纤程/ 协程(Java21引入的虚拟线程就是这个东西)。协程本质,是程序员在用户态的代码中进行调度,而不是靠内核调度器调度,这就节省了很多调度上的开销。

2025-05-18 18:58:27 645 1

原创 多线程代码案例-3 定时器

定时器,是我们日常开发中常用的组件工具,类似于闹钟,设定一个时间,时间到了的时候,定时器就可以自动地去执行某个逻辑。

2025-05-17 11:00:00 674

原创 多线程代码案例-2 阻塞队列

通过数据结构的学习,我们都知道了队列是一种“先进先出”的数据结构。阻塞队列,是基于普通队列,做出扩展的一种特殊队列。

2025-05-16 16:43:44 863

原创 多线程代码案例-1 单例模式

单例模式是开发中常见的设计模式。,是我们在编写代码时候的一种,也就是说,我们遵守了设计模式,代码的下限就有了一定的保证。设计模式有很多种,在不同的语言中,也有不同的设计模式,设计模式也可以被认为是。,某个类在一个进程中,只应该创建出一个实例(原则上不应该创建出多个实例),使用单例模式,可以对我们的代码进行一个更为严格的校验和检查。举个例子:有时候,代码中需要管理/持有大量的数据,此时有一个对象就可以了。比如:我需要一个对象管理10G的数据,如果我们不小心创建出多个对象,内存空间就会成倍地增长。

2025-05-14 00:01:37 917

原创 wait和notify

wait和notify翻译过来的意思是,和join的用途相似,因为引入wait和notify,是为了能够从应用层面上,,这里的干预,(系统内核中的线程调度任然是无需的)。而是在应用程序代码中,让后执行的线程,主动放弃被调度的机会,就可以让执行的线程,先把对应的代码执行完了。

2025-05-12 09:00:00 904

原创 线程安全 3

Java标准库中的很多类都是不安全的,这些类可能会涉及到多线程修改共享数据,又没有任何加锁措施,如下,这几个类都是线程不安全的。但也还有一些线程安全的,使用了一些锁机制来控制。这几个类,自带了锁,在多线程环境下,情况可以好一些,但也不是100%不会出问题,只是概率比上面没有自带锁的类小很多,但仍然需要具体代码具体分析。只是概率比上面没有自带锁的小很多,但仍需要具体代码具体分析。(多线程的代码,稍微有一些变化,就可能会产生不一样的结果)

2025-05-11 01:35:49 782 1

原创 多线程 2 - 死锁问题

死锁,是多线程代码中的一类经典问题。加锁能够解决线程安全问题,但如果加锁方式不当,就很可能产生死锁。

2025-05-11 00:11:06 822

原创 线程安全 1_线程安全

1、根本原因:操作系统上的线程是“抢占式执行” “随机调度”的,这为线程之间的执行顺序带来了很多变数。2、代码结构:代码中存在多个线程,同时修改同一个变量。(1)一个线程修改一个变量,没事.(2)多个线程读取同一个变量,没事(3)多个线程修改不同变量,没事3、直接原因:上述多线程修改操作,本身不是“原子的”。

2025-05-10 18:59:52 1502

原创 多线程3-Thread类

这样的操作,Java 的 API 是没有提供的,上述强制执行的做法,利大于弊。比如这个线程正在执行写操作,写文件的数据有一定的格式要求(写一个图片文件) --> 如果写图片写了一般,线程被终止了,图片就尴尬了,图片文件是存在的,里面的内容不正确,无法正确打开了。上述线程结束顺序的先后,在代码中,是通过API控制的,让main线程主动放弃了去调度器中调度,其中t线程也可能和其他线程一同参与调度,但是由于主线程一直在等待,即使t线程中间经历了多次CPU的切换,仍然不影响t线程正确执行完毕。

2025-05-09 01:40:16 793

原创 多线程2-多线程编程

通过之前的学习,我们知道了操作系统的作用:1、管理硬件资源。2、为软件提供稳定的运行环境。操作系统中,最核心部分的功能模块。操作系统大致可以分为内核空间(内核态)和用户空间(用户态),平时运行的普通的应用程序,QQ音乐,idea,抖音等等都,都是运行在用户态的。但是这些应用程序有时需要针对一些系统提供的硬件资源来进行操作。这些操作,都不是应用程序直接操作的,需要调用操作系统提供的API,进一步在内核中完成这样的操作。为什么要分出用户态和内核态呢?主要目的还是稳定。

2025-05-06 22:37:01 779

原创 多线程1-进程和线程

在上一篇文章中,我们知道:多任务操作系统通过“并发执行”(并行+并发)能够同时运行多个进程,这些进程能够解决“并发编程”这种问题。但是在一些特定的情况下(如一些需要频繁创建、销毁的情景),进程并不能很好地解决并发编程问题,这是因为:进程在频繁创建和销毁时花费的系统开销是比较大的。(主要体现在资源的申请和释放上)早期编写服务器程序时,是使用C语言来进行编写的(基于一种CGI技术,该技术是一种基于多进程的编程模式)。服务器同一时刻会收到很多请求,针对每个请求,都会创造出一个进程,给这个请求进行响应。

2025-05-06 18:54:30 838

原创 计算机是如何工作的

CPU,是计算机系统的核心部件,负责执行计算机的基本算数,逻辑,控制和输入输出操作指令。是计算机的运算和控制核心,是信息处理,程序运行的最终执行单元。CPU制作工艺非常精密,现今出名的公司:X86架构:(1)因特尔 (2)AMD arm架构:(1)苹果(2)高通。

2025-05-06 00:46:10 1141

原创 一文搞定mysql中的事务

mysql中的事务是一个经典的面试题,这篇文章就来跟大家唠唠什么是事务以及事务的一些特性……

2025-05-03 23:20:09 933

原创 java_Lambda表达式

lambda表达式:优点 :1、代码简洁,开发迅速2、方便函数式编程3、非常容易进行并行计算缺点:1、代码可读性变差2、在非并行计算中,很多计算未必有传统的for性能高3、不容易进行调试。

2025-05-03 18:07:52 884

原创 java枚举的使用

1.枚举本身就算一个类,其构造方法默认就算私有的,且都是默认继承于java.lang.Enum。2.枚举可以避免反射和序列化的问题。

2025-05-02 00:27:48 622 1

原创 Java的反射机制

Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到对应的属性和方法,就可以对部分类型信息进行修改。这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射(reflection)机制。

2025-05-01 23:18:06 798

原创 泛型进阶之通配符

通配符其实就是一个问号(?),多用于泛型中。

2025-04-26 18:38:26 814

原创 再谈String

下面是两种创建字符串对象的代码上述程序创建方式类似,但为什么打印结果s1 == s2的时候是true,s1 == s3打印的时候是false,s3 == s4打印的时候是false呢?在Java中,对于1、2、3、3.14、“hello”等字面类型的常量经常频繁使用,为了使程序运行更快,更节省内存,Java为8种基本类型和String类都提供了常量池。

2025-04-25 23:19:52 1228

原创 Map&Set 4 面试题汇总

解题思路:创建两个Set1和Set2中,将输出的字符(s2)全部变为大写然后放入Set1中,再遍历输入的字符(s1),如果当前的字符在set1中不存在,说明这个键是坏掉的,我们先把当前键输出再存入Set2中,因为坏掉的键无需重复输出,所以我们将它存进Set2中,那么遍历输入字符的判断条件就变为当前键既不在set1中也不在set2中。分析我们的代码可知:我们只在优先级队列放满元素后处理了出现频率相同的情况:让字母顺序小的元素入队,而没有在建立前k个元素的小根堆的时候,对出现频率相同的字母进行调整。

2025-04-24 02:02:11 989

原创 Map&Set 3 一文搞定哈希表

这里需要解释的是,我们在put方法中是由resize方法和loadFactor方法的,因为由负载因子的出现,是不会使得单链表的长度十分长的,单链表的长度一定会保持在一个常数级的大小,所以可以将该方法的时间复杂度记为O(1)。α是散列表装满程度的标志因子,由于表长是定值,α与填入表中的元素个数成正比,所以,阿尔法越大,表明填入表中的元素越多,产生冲突的可能性就越大;反之,α越小,表明填入表中的元素越少,产生冲突的可能性越小,实际上表的平均查找长度是负载因子α的函数,只是不同处理冲突的方法有不同的函数。

2025-04-16 22:31:30 620

原创 Map&Set 2 (Set)

Set的官方文档与Map不同,Set是继承于Collection这个类的,且Set中只存储了Key。

2025-04-15 21:09:35 164

原创 Map&Set 1

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下的二叉树:1、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。2、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。3、它的左右子树也分别是二叉搜索树。下图是一棵二叉搜索树,它的中序遍历就是升序的。

2025-03-31 18:32:06 859

原创 HashMap底层代码解读

在IDEA中,双击shift键,在类中搜索HashMap就可以找到HashMap的源码,如图所示:关于Serializable这个接口,它的作用如下: 这里的put方法返回了putVal方法,下面我们来分析putVal方法:

2025-03-25 21:38:11 131

原创 一文助你搞定所有排序

在编程语言中常见的排序算法有以下几种: 当插入第 i (i >= 1)个元素的时候,i 前面的元素已经排好序,此时用arr[i]与前面的元素进行比较,找到适合的位置插入即可,如果arr[i]的元素小于原来位置上的元素,原来位置上的元素则需要向后移。当arr[i]大于原来元素元素时说明找到了arr[i]该插入的位置,直接将arr[i]插在当前位置的后一个元素即可。 如图,要将当前数组的元素直接插入排序: 我们需要先定义两个下标i = 1, j = i - 1,再定义一

2025-03-22 15:33:40 1018

原创 优先级队列 2

Java集合框架中提供了和两种类型的优先级队列,,这里主要介绍PriorityQueue。关于PriorityQueue的使用要注意:1.使用时必须导入PriorityQueue所在的包,即:2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常,如下图:3. 不能插入null对象,否则会抛出NullPointerException。4. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容。

2025-03-19 23:29:29 884

原创 优先级队列(PriorityQueue)_1_模拟实现优先级队列

1、概念1、概念前面介绍过队列,,但有些情况下,,这时候,使用队列显然不合适了。在这种情况下,。这种数据结构就是。

2025-03-19 00:11:43 621

空空如也

空空如也

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

TA关注的人

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