自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 总结七大排序算法

直接插入排序是一种简单的插入排序法,其基本思想是:。实际中我们玩扑克牌时,就用了插入排序的思想。

2024-06-09 13:00:27 848

原创 CSS选择器的常见用法

CSS能够对⽹⻚中元素位置的排版进⾏像素级精确控制,实现美化⻚⾯的效果。以上三个标签选择器 ul li a 中的任意,都可以替换成类选择器,或者id选择器,可以是任。如果需要选择多种标签,可以使⽤ , 分割,如p, div { } 表⽰同时选中p标签和div标签。逗号前后可以是以上任意选择器,也可以是选择器的组合。意选择器的组合,也可以是任意数量选择器的组合。选中了元素,才可以设置元素的属性。以上,关于CSS,希望对你有所帮助。本文总结CSS的选择器的常见用法。不⼀定是相邻的标签,也可以是"

2024-06-02 21:02:55 452

原创 JVM的垃圾回收机制--GC

垃圾回收机制,是java提供的对于内存自动回收的机制。java不需要像C/C++那样手动free()释放内存空间,而是在JVM中封装好了。垃圾回收机制,不是java独创的,现在应该是主流编程语言的标配。GC需要消耗额外的系统资源,而且存在非常影响执行效率的“”问题(触发GC的时候,可能一瞬间把系统负载拉满,导致服务器无法响应其他的请求)。GC回收的“内存”,更准确说,是“对象”,回收的是“(不需要额外回收,线程销毁,自然回收了)(不需要额外回收,线程销毁,自然回收了)

2024-05-29 10:36:07 732

原创 JVM的相关知识

也想交给自己的父亲来处理,但是它的parent指向null,只能自己处理,BootstrapClassLoader尝试在标准库的路径中搜索上述类。如果这个类,在标准库中找到了,于是搜索过程就完成了,类加载器负责打开文件,读取文件等后续操作就行了。如果找到了,也是由当前的类加载器负责处理。比如你自己代码里写了一个类,类的名字和标准库/拓展库冲突了,JVM会确保加载的类是标准库的类(就不加载你自己写的类了)。此时类对象就加载完成了,后续代码就可以使用这个类对象,创建实例,或者使用里面的静态成员了。

2024-05-28 11:47:46 1643

原创 HTTP响应的基本概念

公证机构,生成一对非对称密钥pub(公证),pri(公证),拿着pri(公证)针对证书数据的校验和进行加密,得到了数字签名。如果使用302作为重定向,临时重定向,旧地址是否要重定向,以及重定向到哪里,就是可变的。公证机构一共没多少,一个操作系统就可以在发布的时候,把市面上的公证机构的公钥都打包放在一起。注:获取公证机构的公钥,不是通过“网络”的方式获取到的。相等就说明整个证书都是没有被篡改过的,证书中包含的公钥就是可信的服务器公钥了。访问某个地址的时候,访问的是旧地址,自动跳转到新的地址上。

2024-05-25 19:55:10 1724 2

原创 HTTP协议请求报头(header)

HTTP报头(header)的结构是“”结构,每个键值对占一行,键和值之间使用分号分隔。报头的种类有很多,本次介绍几个重要的。表示请求对应的ip和端口。:表示body中的数据长度。:表示body中的数据类型。一个请求,可能有body,也可能没有。如果有body,上述两个字段,必须存在。如果没有body,上述两个字段,就不存在。POST请求有body,通过空行找到body开始,通过Content-Length找到body的结束位置。解决粘包问题。

2024-05-24 17:53:53 824

原创 HTTP协议相关知识

url的query string中提供了 urlencode机制,二进制数据,也是可以进行encode,得到转义,并进行传输。虽然POST可以直接传二进制,很多时候,也是转义了之后通过文本的方式来传的。比如,web服务器(网站),就可能会包含很多不同的网页,就可以通过这里的路径区分不同的网页了。比如,要执行“支付10块”操作,假设账户余额是100,支付操作就期望支付之后,余额90。HTTP标准中,明确说了一句话,针对GET的url的长度是不做任何限制的。的端口,是目的端口,是服务器自己决定的。

2024-05-22 12:33:04 547

原创 数据链路层相关知识

根域名服务器是其他镜像服务器的源头。就需要把你的域名和ip的映射,提交到根域名服务器这边,然后其他的镜像就会从根域名这里同步数据。在数据传输的过程中,先根据目的ip,确定接下来往哪走,知道下一跳的ip(查路由表),根据下一跳的ip,查转发表,知道ip对应的mac/端口是哪个。当你的电脑尝试访问某个域名,得到ip,就会把ip与域名的对应关系,存储到客户端缓存之中。,把这样的映射关系,使用DNS服务器来保存,个人电脑上就不需要保存文件了,如果要访问域名,就可以通过访问DNS服务器,查询到对应的ip地址了。

2024-05-20 17:39:50 531

原创 IP协议的相关特性

对于路由器来说,在转发数据的时候,很可能无法一下知道目的ip所对应的设备如何到达,只能通过“IP协议是工作在网络层的重要协议,通过不同IP地址的选择,主要解决广域网中主机与主机之间的通信。的功能,如果携带的数据,超出长度上限,ip就会自动拆分成多个数据包,每个数据包携带一部分数据,发送到对方之后,再拼接好。每个路由器,虽然无法感知到整个网络结构的全貌,但是可以认识到它周围的网络设备,路由器中,会维护一个数据结构,“,会记录当前这个请求相对应的是哪个内网中的设备,从而把目的ip替换回最初的内网ip。

2024-05-19 17:35:27 720

原创 TCP的滑动窗口机制和流量控制

接下来,当然要继续等待2001-5000的ack,与此同时,也发送一个新的数据,5001-6000。在滑动窗口中,收到的ack不一定是按照发送顺序返回的,有可能1001-2000和2001-3000的数据先发,但是3001-4000的数据的ack先返回了,这样该怎么办?接收方给发送方返回ack,把这个数值告诉发送方,在ack报文中,在tcp报头里,指定一个字段,表示上述的空闲空间大小。滑动窗口中,批量发送4组数据之后,不是等到4个都回来才继续发送新的数据,而是收到一个ack,就往后发一个新的。

2024-05-14 19:20:45 581

原创 TCP协议建立连接的过程及其意义

在客户端与服务器传输数据之前,要在两台主机之间先,然后再传输业务数据。,是在传输业务之前,就要先进行。握手好了,才能进行后续的传输。注意:握手只是发送一个不携带业务数据的数据报,,只是用来“打个招呼”。

2024-05-13 10:23:30 945

原创 Java数据结构---栈和队列

加标记,定义boolean类型的flag变量,初始为fasle,当rear与front第一次相遇的时候,置为true,当判断为true的时候,就说明再次相遇了。当插入元素时,rear向后++,当删除元素时,front也向后++。牺牲一个空间,当rear的下一个元素时front的时候,此时rear指向的空间就不能再放了。:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有。3、在字符串读取完时,如果栈不为空,返回false。1、在未读取完时,如果栈为空,返回false。

2024-05-09 11:49:40 816

原创 Java数据结构---链表

由于链表中没有将元素存储在连续的空间中,元素存储在单独的结点中,然后通过引用将结点连接起来了,因此在任意位置插入或删除元素时,不需要搬移元素,效率比较高。在java的集合框架库中LinkedList底层实现就是无头双向非循环链表。一般不会单独用来存数据,实际更多是作为其他数据结构的子结构。新链表是通过拼接给定的两个链表的所有节点组成的。类来作为双向链表的实现类。LinkedList的底层是。将两个升序链表合并为一个新的。以上,关于链表,希望对你有所帮助。存储结构,数据元素的。

2024-05-06 12:22:29 403 1

原创 Java数据结构---顺序表

ArrayList虽然提供的方法比较多,但是常用方法如下所示,需要用到其他方法时,大家可以自行查看ArrayList的帮助文档。比如链表,队列,栈。但是像二叉树在我们看来是分散的树形结构,就不是线性表。的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。是n个具有相同特性的数据元素的有限序列。常见的线性表有:顺序表,链表,栈,队列.....是java中实现顺序表的一个类。比如链表,链表中的元素是间断存储的,元素与元素之间由指针串联。以上,关于ArrayList,希望对你有所帮助。

2024-05-02 20:29:44 389 1

原创 UDP的报文结构和注意事项

就是本来传的是0,由于传输过程中电磁波,高能粒子束等外界环境的干扰。实际到了对端变成了1。如果数据部分发生改变,此时的得到的结果也就不一样。对于UDP协议来说,应用层数据到达UDP之后,就会给应用层数据报前面拼装上UDP报头。也就是说,使用UDP开发程序,就得确保传输的单个数据报,不能超过64KB.CRC是一个简单粗暴的计算校验和的方式,称为。给数据引入冗余信息,通过冗余信息来验证原有的数据。数据在网络传输过程中,是可能会出错的。以上,关于UDP的报文结构,希望对你有所帮助。规定整个UDP数据报的长度。

2024-04-30 20:30:52 796

原创 java中的套接字与网络编程

字节流数据的特征是在IO流没有关闭的时候,是无边界的数据,可以多次发送,也可以分开多次接收,就像水流一样,,传输数据的基本单位是一个个的UDP数据报,一次读写只能读写一个完整的UDP数据报,不能搞半个,也不能一个半。,这个过程中,没有计算,也没有业务逻辑。计算机中的连接(Connection) 是一个”抽象的概念“,计算机的连接认为是要建立连接的双方,系统中的socket,可以理解为是一种文件,socket文件,就可以视为是“网卡”这种硬件设备的。,正常的服务器,给它发送不同的请求,会返回不同的响应。

2024-04-25 12:45:35 576

原创 计算机网络中的一些基本概念

将要传输的发送人,接收人,消息时间,消息内容组织到一个字符串中,不同的应用层协议数据组织的格式是不相同的。本身要发送的是一个结构化的数据(包含很多属性,字段),把结构化的转化成字符串的过程,称为“,每个层级都有对应的主线任务,上层协议会调用下层协议的功能,下层协议会给上层协议提供服务。而在真实情况下,现在的路由器和交换机功能越来越多,有些交换机的功能,路由器也有,所以界限就没那么分明了。,ip报头里包含收件人的ip地址和发件人的ip地址。,以太网也有自己的数据包格式,就会拿到上述ip数据包,进一步的封装。

2024-04-21 13:37:07 966 1

原创 java中File类和输入输出流的用法

如创建文件,删除文件,创建目录,重命名文件等。,如读文件,写文件等。针对文件系统进行操作我们可以使用对文件系统进行操作。java标准库提供了File类(出自java.io包里,和输入输出相关的内容就在这个包里)表示一个文件,进一步的通过File提供的方法,就可以进行文件系统操作了。File中提供了很多文件操作的方法:注:当我们在java中运行程序的时候,基准目录是什么呢?此时。

2024-04-20 19:33:09 842

原创 IO、存储、硬盘、文件系统相关常识

同样,把内存的数据保存到硬盘上,远离cpu,是输出。从硬盘读取数据到内存上,靠近cpu,是输入。这就需要在上述体系中,能够有一种方式,来标识某个具体的文件(通过这个机制就能具体定位到,找到某个文件头上)。此处提到的文件特指狭义的文件,也就是平时保存在硬盘上的文件。日常常见的docx,pptx,mp3,mp4,pdf都属于二进制文件。从根节点出发,一层一层往下走,最终达到目标文件之后,中间这些目录,集合在一起,就构成了路径。在硬盘上,存在很多文件和目录,目录又存在一定的“嵌套关系”,整体这一套结构,是一个。

2024-04-16 20:58:55 796

原创 HashTable, HashMap, ConcurrentHashMap 之间的区别

下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap。看起来锁对象多了,实际上不会产生更多的开销,原因是java中的任何一个对象都可以作为锁对象,直接拿每个链表的头结点创建的线程对象作为锁对象就行了。HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用。,导致效率非常低下。的内部类,这个类实现了Map接口,在调用方法时使。

2024-04-15 11:11:23 511 1

原创 总结java中的synchronized锁

如果某些情况下,整个方法体比较大,需要同步的代码只是一小部分,如果直接对整个方法体进行同步,会使得代码性能变差,这时只需要对一小部分代码进行同步即可。(解锁也就是修改一下上述标记,也几乎没有开销)上述过程,就相当于没有任何的加锁操作,速度是非常快的,也可以保证锁能够正常生效。但是,如果再偏向锁状态下,synchronized的“自适应”是根据当前锁冲突的概率来调整锁策略。上述升级过程,针对一个锁对象来说,是不可逆的。:首次使用synchronized对对象进行加锁的时候,关键字的特性进行对比,

2024-04-14 15:35:11 599 1

原创 java中常见的锁策略

这里说的“交换”,实际上更多的是用来“赋值”,一般更关心内存中,交换后的数据,而不关心reg2寄存器里交换后的数据。在加锁的过程中,自旋锁一直在判断锁是否被占用,这个过程消耗了更多的cpu资源,但是一旦锁被释放,就能第一时间拿到锁,挂起等待锁消耗的时间更长,一旦线程被阻塞了,啥时候被唤醒,这个过程是不可控的,可能会经历很长很长的时间。一般来说,锁冲突概率高得时候,就得多做处理,锁冲突概率低的时候,就可以少做处理。锁的粒度:加锁的范围内,包含代码越多,就认为锁的粒度更粗,反之,锁的粒度就越细。

2024-04-14 14:30:10 2024 1

原创 关于java中的线程池用法

我们下面使用java标准库中提供的ThreadPoolExector类来介绍关于线程池的一些参数。1. 核心线程数(corePoolSize)与最大线程数(maximumPoolSize)1、核心线程(corePoolSize) 2、非核心线程maximumPoolSize 就是核心线程数 + 非核心线程数一个线程池,刚被创建出来的时候,里面就包含核心线程这么多的线程。线程池会提供一个submit方法,往里面添加任务,每个任务都是一个Runnable对象。

2024-04-13 13:19:04 575 1

原创 Mysql中索引的内部结构是怎样的

当元素非常多的时候,就会使树的高度变得比较高,查询的效率变低,高度每增加一层,比较次数就增加1.因此,红黑树也不适合大规模在硬盘上管理数据的场景。的情况,无法进行【1~10】这样的范围查询。经过hash函数的映射,原来key之间的大小关系,不能反映到计算出来的hash值的大小关系,也无法决定下标的大小关系。Mysql中的索引类似于目录,能够提高查询的速度,会占用更多的空间,也可能会拖慢增删改的速度。表面上看拿着要查询的key在某个节点上比较的时候,需要更多的比较次数,但是这里的比较还是比较高效的。

2024-04-06 17:19:22 476 1

原创 Java中多线程单例模式线程安全的写法

单例模式是多线程代码中一种经典的设计模式,设计模式类似于棋谱,下棋按照固定的套路来下,基本上棋力就不会太差。饿汉模式的创建时机是在java进程启动(比main调用还早的时机),后续线程执行getInstance的时候,意味着上述实例早都已经有了。如果代码中存在多个单例类,使用饿汉模式,就会导致这些实例都是在程序启动的时候扎堆创建的,可能把。如果是懒汉模式,啥时候首次调用,调用时机是分散的,化整为零,用户不太容易感知到“卡顿”。”,就是在“类对象”上的,每个类的类对象在JVM中只有一个,里面的静态成员,

2024-04-05 17:40:51 531 1

原创 Java中线程安全问题的原因和解决方案

synchronized下面跟者{}用于包裹代码块,当进入到代码块,就是给上述()锁对象进行了加锁操作,当出了代码块,就是给上述()锁对象进行了解锁操作。在一个程序中,锁不一定只有一把,如果你有两个线程,针对不同的代码加锁,不会产生互斥的(也称为锁竞争/锁冲突),只有针对同一段代码加锁,才有互斥。(不可拆分的最小单位,就叫"原子",如果某个代码操作,对应到一个cpu指令,就是原子的,对应到多个,就不是原子的)3)代码中,可以创建出多个锁,只有多个线程竞争同一把锁,才会产生互斥,针对不同的锁,则不会。

2024-03-31 15:20:31 605 1

原创 Java线程的几种状态

线程的状态更准确的说是pcb的状态。就绪状态 指的是这个线程“随叫随到”,要么是这个线程正在cpu上运行,要么是这个线程没在cpu上运行,但是随时可以调度到cpu上运行。如果我们发现“某个线程卡死了”,这个时候,就需要关注线程的状态,通过状态,就能看到线程是在哪一行卡住了(阻塞),原因大概是什么。表示线程已经终止了,内核中的线程已经销毁了,Thread对象还在。后三种状态出现的原因其实都是阻塞,但是产生这三种状态的原因不一样。Java中,对线程的状态,大概分为了6个不同的状态。表示进入阻塞的死等状态。

2024-03-29 21:18:15 285 1

原创 Java中Thread类的基本用法

注:这里创建了Thread的子类,子类内部重写了父类的run方法,同时创建了该子类的实例,对于匿名内部类来说,只能创建一个实例,这个实例创建完了之后,再也拿不到这个匿名内部类了。注:Runnable的作用,是描述了一个“任务”,这个任务和具体的执行机制无关,(通过线程的方式执行,还是通过其他的方式执行),run也就是要执行的任务内容本身了。在java代码中,main线程就是前台线程,程序员创建出来的线程,默认都是前台线程,可以通过上述setDaemon方法来把线程设置为后台线程。那么通过线程等待,就。

2024-03-29 20:34:13 778 1

原创 总结进程与线程的区别(java)

我们知道当前的cpu,都是多核心cpu,需要一定的编程技巧,把要完成的任务,拆解成多个部分,并且分别让他们在不同的cpu上运行,充分利用多核心的资源。通过“”编程的模式,其实就可以起到“”的效果,因为进程可以被调度到不同的cpu上运行,此时,就可以把多个cpu核心都很好的利用起来。但是,这也带来了新的麻烦。在服务器开发的圈子里,这种并发编程的需求场景是非常常见的,作为一个服务器,要能够同时给多个客户端提供服务,如果同一时间来了很多客户端,服务器如果只能利用一个cpu核心工作,速度就会比较慢。

2024-03-24 17:17:25 211 1

原创 关于进程调度的基本过程

,在进程切换出cpu之前,就需要把这些中间结果(cpu的各种寄存器中的值)保存到pcb的上下文里(寄存器-> 内存),下次这个进程回到cpu上执行的时候,就需要把之前的存档回复回来(内存-> 寄存器)。:一个核心,不同时刻,可以执行不同的进程,这一刻,执行进程1,下一刻,执行进程2,cpu把总的执行时间,切换成若干个小的片段,每个片段执行一个进程,每个片段称为“注:除了上述自己运行的程序是进程之外,还有一些系统自带的/安装某些程序,给你添加的,对于你的系统能够稳定运行有很重要的意义的。

2024-03-23 19:09:14 652 1

原创 Mysql 数据库的基本使用与操作

存储数据用文件就可以了,为什么还要弄个数据库?文件保存数据有以下几个缺点:文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便数据库存储介质:磁盘内存为了解决上述问题,专家们设计出更加利于管理数据的软件——数据库,它能更有效的管理数据。数据库可以提供远程服务,即通过远程连接来使用数据库,因此也称为数据库服务器。数据库大体可以分为关系型数据库和非关系型数据库关系型数据库(RDBMS):是指采用了关系模型来组织数据的数据库。

2024-03-17 16:27:12 846 1

原创 Java--二叉树数据结构

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。(Preorder Traversal 亦称先序遍历)——访问根结点--->根的左子树--->根的右子树。:一个结点含有的子树的根结点称为该结点的子结点;

2024-01-24 22:57:22 860

原创 JAVA--优先级队列(堆)

1. 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子)2. 如果parent的左孩子存在,即:child < size, 进行以下操作,直到parent的左孩子不存在。否则:交换parent与较小的孩子child,交换完成之后,parent中大的元素向下移动,可能导致子。注意:在调整以parent为根的二叉树时,必须要满足parent的左子树和右子树已经是堆了才可以向下调整。如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为。

2024-01-23 16:09:14 837

原创 JAVA-SE阶段性总结

注意:不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节整形和浮点型都是带有符号的整型默认为int型,浮点型默认为double字符串属于引用类型2. byte与byte的运算结论: byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误.

2023-12-01 19:37:50 798

原创 JAVA---认识异常

Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构.例如, 我们实现一个用户登陆功能.if (!if (!System.out.println("登陆成功");此时我们在处理用户名密码错误的时候可能就需要抛出两种异常. 我们可以基于已有的异常类进行扩展(继承), 创建和我们业务相关的异常类.具体方式:1. 自定义异常类,然后继承自Exception 或者 RunTimeException。

2023-11-22 18:51:06 12

原创 类与对象(上)

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告在java中定义类时需要用到class关键字,具体语法如下诉给计算机什么是洗衣机。// 品牌// 型号// 重量// 长// 宽// 高// 颜色。

2023-11-05 19:37:54 23

空空如也

空空如也

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

TA关注的人

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