自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WengJM的博客

绝知此事要躬行

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

原创 【算法题解】

4.初始化: dp表规模(n+2)*(m+2).dp[0] [1]==1 || dp[1] [0] ==1。2.状态转移方程:dp[i] [j] = dp[i-1] [ j] +dp[i] [j-1]1.状态表示:dp[i] [j] 表示从00位置出发,到达ij位置,一共有多少种方法。1.枚举中心位置的时候,要考虑回文串长度的奇偶性。1.用一个变量来表示,当前位置的前驱最小值。5.填表:dp[n+1] [m+1];2.每输入一个数,更新当前的最小利润。3.如果是马所能到达的位置,就为0。

2024-04-26 21:52:12 481

原创 【网络编程】TCP流套接字编程 | Socket类 | ServerSocket类 | 文件资源泄露 | TCP回显服务器 | 网络编程

如果客户端和服务器建立连接,服务器的应用程序不需要任何操作,系统内核直接完成了连接建立的流程(三次握手),完成流程后,就会在内核的队列中排队(每个ServerSocket都会有这个队列)。此时第二个客户端也过来建立连接,连接建立成功后,连接对象就会在内核的队列里面,等待accept把连接取出来,在代码中处理。​ 让两个循环能够“并发”执行,各执行各的,不会因为进入循环而影响另一个循环。​ 但是clientSocket,每个循环中,每有一个新的客户端来建立连接,都会创建出新的clientSocket。

2024-04-26 19:13:00 1136

原创 【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

通过网络,让两个主机之间能够进行通信。基于通信来完成一定的功能。​ 进行网络编程的时候,需要操作系统提供一组API,通过这些API来完成。这些API可以认为的应用层和传输层之间交互的路径。这些API称为Socket API。通过一套Socket API 可以完成不同主机、不同系统之间的网络通信。​ 传输层提供的网络协议主要有两个:TCP、UDP。这两个协议的特性差异很大,会导致使用这两种协议进行网络编程,会存在一定的差别。系统就分别提供了两套API。

2024-04-25 21:37:31 1115

原创 【网络原理】网络传输的基本流程 | 网络通信 | 协议分层 | 网络模型 | TCP/IP五层网络模型 | OSI七层网络模型 | IP | 端口号 | 本机环回

(上层协议调用下层协议,下层协议给上层协议提供支持)此时即使协议比较多,也可以完成相关工作。​ 上述描述的规则,就是此处我们约定的应用层协议。应用层协议中,具体用几个字段,字段的顺序,什么分隔符都可以由程序员根据具体的场景和具体的需求来自主决定。​ QQ应用程序,把用户A输入的“nb woc”,打包成一个应用层的数据报(这个数据报的格式,只有qq的程序员知道)​ 通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。​ 通过IP协议,对网络层数据报进行解析,去掉报头,拿到载荷。

2024-04-25 21:33:29 1013

原创 牛客 题解

2.区间内的数字必须严格大于0,因为如果区间中存在小于0的数,left在滑动的时候,可能会增大,会倒逼right回退。只有严格大于0的数,随着left滑动,区间之和才会减小。right就会向后移动。更新结果:right-left+1 < retlen retleft = left, retright = right。进窗口:sum += arr[right]2.如果出队/2之后仍是偶数,再次进队。出窗口:sum-= arr[left]1.优先级队列确保出队的都是最大值。判断条件:sum >=x。

2024-04-24 22:05:10 336

原创 【文件IO】 文件系统的操作 | 文件类型 | File的构造和方法 | 字节流 | 字符流 | InputStream | OutStream

文件描述符表是一个顺序表的结构,一个进程每打开一个文件,就需要在这个表里分配一个元素,但是整个顺序表的大小是有上限的。大部分情况下,谈到的文件,都是指硬盘的文件。如果真的读到了字符,会返回0~65535(无符号 char能表示的范围),如果到达了流的末尾,就会返回-1,表示文件读完了。字符流可以自动的把文件中相邻的字节,转换成一个字符。2.一次会读取若干个字符,会把参数指定的cbuf数组填充满,填不满也没关系,读的是所有的数据。1.文本文件:文件中保存的数据都是字符串,保存的内容都是合法的字符。

2024-04-24 19:06:52 931

原创 【多线程】JUC的常见类 | Callable接口 | ReentranLock | 线程安全的集合类

​ 发现需要扩容的线程, 只需要创建一个新的数组, 同时只搬几个元素过去. 扩容期间, 新老数组同时存在. 后续每个来操作 ConcurrentHashMap 的线程, 都会参与搬家的过程. 每个操作负责搬运一小部分元素. 搬完最后一个元素再把老数组删掉. 这个期间, 插入只往新数组加. 这个期间, 查找需要同时查新数组和老数组。可以通过配置文件来描述配置的详细内容(文件本身不是很大),配置的内容就会被读到内存中,再由其他的线程,来读取这里的内容。只有在操作同一个链表上的内容时,才会发生线程安全问题。

2024-04-22 23:23:34 822 3

原创 【多线程】synchronized原理 | 锁升级| 锁消除 | 锁粗化 | 信号量 | CountDownLatch

在实际使用的过程中,如果发现锁冲突的情况比较多,synchronized就会升级成悲观锁(也就是重量级锁,基于挂起等待的方式实现)。当锁冲突出现的时候,偏向锁就会升级成轻量级锁,进行真正的加锁操作。​ 迪杰斯特拉提出的信号量,同时,他也是一位荷兰数学家,在数据结构的图中,要想获取两点之间的最短路径,就可以用迪杰斯特拉算法。线程池,优化的是创建新线程的效率(优化”找下一任“的效率),提前就创建好,直接拿来用,无缝衔接。偏向锁 的核心思想,就是“懒汉模式” 的一种体现,能不加锁就不加锁,因为加锁就意味着开销。

2024-04-22 23:18:47 791

原创 【多线程】CAS的应用 | CAS的概念 | 实现原子类 | 实现自旋锁 | ABA问题

Compare and swap 比较并交换。比较交换的是 内存 和 寄存器比如此时有一个内存 : M。还有两个寄存器A,B​ CAS ( M , A , B ) :如果M和A的值相同的话,就把M和B的值进行交换(交换的目的是为了把B赋值给M,M = B),同时整个操作返回 true。如果M和A的值不同的话,无事发生,同时整个操作返回false。//伪代码:CAS其实是一个CPU指令,一个CPU指令,就可以完成上述比较交换的逻辑。单个的CPU指令是原子的。

2024-04-21 22:00:53 921

原创 【多线程】常见的锁策略 | 乐观锁 | 轻量级锁 | 重量级锁 | 自旋锁 | 挂起等待锁 | 读写锁 | 可重入锁 | 公平锁

可重入锁,锁里面保存了当前是哪个线程加上的锁,同时维护了一个计数器,所以第二次加锁的时候,不会触发阻塞等待,而是自增计数器。要借助系统api来实现,一旦出现锁竞争,就会在内核中触发一系列动作(比如让这个线程进入阻塞状态,暂时不参与CPU的调度。​ 当很多线程去尝试加一把锁的时候,一个线程拿到锁,其他线程就会阻塞等待。​ 轻量级锁是指,锁的开销比较小,消耗的资源少。乐观锁通常是轻量级锁,可能存在特例,不绝对。是“锁的一种特性”,是一类锁,而不是具体的锁。​ 重量级锁是指,锁的开销比较大,消耗的资源多。

2024-04-21 21:57:17 656

原创 【LeetCode题解】2007. 从双倍数组中还原原数组

【代码】【LeetCode题解】2007. 从双倍数组中还原原数组。

2024-04-18 21:16:31 319 1

原创 【多线程】定时器 | 线程池 | 实现MyTimer | 实现MyThreadPoll | 工厂模式 | 构造方法 | 参数种类

​ 假设一个线程的所有代码都是CPU密集型代码,线程池中的线程数量不应该超过N(CPU核心数),设置的比N大,cpu吃满了,无法提高效率,此时添加更多的线程反而增加调度的开销。换句话说,timer当中的任务,是有当中的扫描线程来执行的。所以在第一次判断时间时,在else中,当任务时间还没到的时候,进行wait阻塞,此时线程不会在CPU上调度,避免了忙等。​ 假设一个线程的所有代码都是IO密集型的,这个时候不吃CPU,此时设置的线程数,就可以超过N.一个核心可以通过调度的方式,来并发执行。

2024-04-18 21:13:54 1557

原创 【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

【代码】【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

2024-04-16 21:31:46 452

原创 【多线程】阻塞队列 | put()方法 | take()方法 | 生产者-消费者模式 |实现阻塞队列

​ 在这种情况下:高峰时段,一旦客户端发起的请求量非常多时,每个A收到的请求,都会立即发给B。​ 使用wait时,要考虑wait是notify唤醒的,还是通过Interrupt唤醒的。wait方法除了使用notify()方法进行唤醒,还可以通过interrupt()方法,来中断wait的状态。在出队的时候,当size–后,队列中有位置了,调用notify()方法,对阻塞的put方法进行唤醒。在入队时,当size++后,队列不为空了,调用notify()方法,对阻塞的take方法进行唤醒。

2024-04-16 21:29:54 842

原创 【多线程】单例模式 | 饿汉模式 | 懒汉模式 | 指令重排序问题

单例模式三步走:1.懒汉模式下的双重if嵌套2.用Synchronized对第二个if和后续是实例化操作进行加锁3.用volatile修饰实例,禁止指令重排序。面试遇到的话,人生如戏全靠演技,要适当藏拙,一步一步优化。从单线程的懒汉模式,到加锁,再到指令重排序点击移步博客主页,欢迎光临~

2024-04-15 19:39:32 1173

原创 【LeetCode每日一题】706. 设计哈希映射

【代码】【LeetCode每日一题】706. 设计哈希映射。

2024-04-15 16:14:28 344

原创 【多线程】 synchronized关键字 | 可重入锁 | 死锁 | volatile关键字 | 内存可见性问题 |wait&notify方法|

岁月不居,时节如流。仅以此文,为白女士送上生日祝福。生日快乐,哥们。

2024-04-11 22:22:48 1458

原创 【多线程】Thread的常见属性 | 终止线程 | 等待线程 | 休眠线程 | 线程安全

有的代码在单线程环境下,可以正常执行。但是同样的代码,让多个线程去同时执行,就有可能出现BUG。这类问题就是线程安全问题/线程不安全。//对变量自增50000次i < 50000;});i < 50000;});t1.start();t2.start();t1.join();t2.join();//没有join的话,线程还没自增完,就会打印count上面的代码在并发执行时,构成了线程安全问题。

2024-04-10 21:07:49 953

原创 【多线程】线程(线程的概念+线程的创建)

主要消耗在申请资源上面。​ 验证了每一个线程都是一个独立的执行流,在主线程中,遇到t线程时,兵分两路。为了跨平台,Java又对系统的API进行了封装(Thread类),通过Thread类创建Thread对象,从而操作系统内部的进程。Runnable表示的是一个“可以运行的任务”,这个任务是交给线程负责执行,还是交给其他的实体执行。5.进程之间具有独立性,一个进程出问题,不影响其他进程,不相互干扰。4.进程和进程之间不共享内存空间,同一个进程的线程之间共享同一份内存空间和文件资源,省去了申请资源的开销。

2024-04-09 21:35:44 982

原创 【多线程】进程(进程的概念+进程的管理+PCB(进程控制块)+进程的调度+进程的独立性)

2.一个exe文件,就包含了指令和数据,运行exe,操作系统就会把指令和数据加载到内存中(内存地址),CPU先从内存中取指令,然后执行指令。​ 记账信息会记录,当前进程持有CPU的情况(记录在CPU中执行了多久),可以作为操作系统调度进程的参考依据,从而对资源分配进行调整。2.进程的内存空间,需要有专门的区域存储要执行的指令,以及指令依赖的数据。进程从CPU离开之前,需要保存现场,把当前CPU中各种寄存器的状态,都记录到内存中(存档)不同系统的API是不同的,在Java中,系统的API会被JVM进行封装。

2024-04-08 21:44:39 1167

原创 【前端】JavaScript(概念+语法+形式+变量+数组+函数+作用域+对象)

Javascript语言实际上是两种语言风格的混合产物----(简化的)函数式编程+(简化的)面向对象编程。要完成更复杂的交互,在浏览器端运行JS,除了语法,还需要DOM和BOM的API。内层函数通过链式查找的方式,从内而外依次进行查找,从而访问到外部函数的变量。JS引擎逐行读取JS代码的内容,然后解析成二进制指令,再进行执行。静态类型:变量的类型在定义时是什么类型,在运行时就是什么类型。强类型变量:不同类型变量进行赋值时,需要进行强制类型转换。动态类型:代码在执行中,变量的类型可以随时发生变化。

2024-04-06 22:08:43 1011

原创 【前端】CSS(引入方式+选择器+常用元素属性+盒模型+弹性布局)

层叠样式表(Cascading Style Sheets)对元素位置的排版进行精确控制,实现结构和样式的分离CSS 控制页面的展示效果HTML决定页面的结构。

2024-04-03 21:51:26 1394

原创 【前端】HTML(常用的HTML标签)

HTML超文本标记语言超文本:文本、声音、图片、视频、表格、连接标记:由许多标签组成HTML页面运行在浏览器上面(推荐Chrome)软件:VSCode推荐插件:自动补全、浏览器显示、同步更新!在这里插入图片描述括起来的,都是HTML当中的标签双标签:有头有尾 单标签< html > < head > < title > 这是页面标题 < body > 这是页面内容

2024-04-03 16:47:57 1031

原创 泛型总结(擦除机制+泛型上界+通配符的上下界)

JDK1.5后引入的。

2024-03-31 20:59:34 1031

原创 Lambda表达式(语法+函数式接口+使用+变量捕获)

接口上声明 @FunctionalInterface 注解后,如果这个接口存在两个抽象方法,会报错。forEach方法,继承自Consumer,是一个函数式接口。2.参数类型可以声明,也可以省略,让JVM来推断。3.只有一个推断类型时,可以省略掉( )只有一个抽象方法的接口,叫做函数式接口。1.可以是表达式,也可以是代码块。1.这个参数的函数式接口中的参数。2.是函数式接口里方法的实现。3.可以返回一个值或不返回。在Lambda表达式中同理。匿名内部类的变量捕获。

2024-03-31 19:50:39 887

原创 【LeetCode】三月题解

3.初始化:f[0]=false,f[1]=nums[0]== nums[1],f[2]=nums[0] == nums[1]==nums[2]||递增。3 由f[i-3]转移过来,且nums[i-1] == nums[i-2]+1;2.因为在深度优先遍历的时候会重复,所以递归的结束的条件为,f有记录,返回该几率。2 由f[i-3]转移过来,且nums[i-2] == nums[i-1] == nums[i]3.直到发现num[i]的元素,要大于后面所有合并的值,将合并的最大值更新为此时的num[i]

2024-03-31 18:44:20 1061

原创 Java 枚举(概念+枚举的使用+源码分析)

因为自己写的枚举类,默认继承于Enum类,同时默认调用这个类中的构造方法。所以在反射时,一个要传四个参数。要给父类构造方法传递 ,进行初始化。

2024-03-27 22:07:18 437

原创 Java:反射 reflection ( 概念+相关类+使用方法)

(以下方法返回值为Constructor相关)仅适合在编译前就已经明确要操作的 Class。(以下方法返回值为Method相关)(以下方法返回值为Field相关)静态方法,前提是知道类的。

2024-03-27 22:04:16 1226

原创 【数据结构】String常量池

而s3是新创建的一个String对象,这个对象的value指向的是original.value。Java为八种基本数据类型和String类都提供了常量池,因为有些字面类型的常量会频繁使用,为了提高效率,节省内存。字符串常量池在JVM中是StringTable类,它的本质的一个固定大小的哈希表(HashTable)因为s1已经存进字符串常量池中,s2就会从常量池中把s1存的取出来。所以s1和s2指的是同一个对象。在Java8中,字符串常量池的位置在堆中,可以设置大小,有范围限制,最小是1009。

2024-03-26 17:39:18 749

原创 【数据结构】 HashMap源码分析(常量+构造方法+方法)

同理:在删除结点的时候,如果不符合树化条件,会进行解树化,重新变成链表。会得到一个接近2次幂的数。

2024-03-26 17:36:01 600

原创 【数据结构】 Map和Set万字总结(搜索树+哈希桶+使用方法+实现方法)

Map和Set----Java

2024-03-15 14:23:19 1204

原创 【数据结构】哈希表(哈希函数+负载因子+解决冲突方法)

这种映射的方法叫哈希(散列)方法,函数叫哈希函数,构造的结构叫哈希表

2024-03-14 22:08:02 1189

原创 【数据结构】Set的使用

new 的TreeSet,实际上new的是一个TreeMap对象。TreeSet不能插入为null的Key,HashSet可以,因为TreeSet是需要比较的。LinkedHashSet在HashSet的基础上,维护了双向链表,来记录元素的插入顺序。2.Set中只存有Key,且Key唯一.Key不能修改,修改要先删除,再重新插入。判断集合c中的元素是否在set中全部存在,是返回true,否则返回 false。5.Set的常用接口的TreeSet和HashSet,3.TreeSet的底层是用Map实现的。

2024-03-13 22:06:44 1059

原创 【数据结构】Map的常用方法

Map的使用

2024-03-10 22:14:36 1028

原创 二叉搜索树:查找+插入+删除+性能分析

二叉搜索树:查找+插入+删除+性能分析

2024-03-08 14:10:19 1241

原创 【LeetCode题解】2859. 计算 K 置位下标对应元素的和+938. 二叉搜索树的范围和+1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)

2859. 计算 K 置位下标对应元素的和+938. 二叉搜索树的范围和+1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)

2024-03-03 19:23:31 889

原创 【LeetCode题解】670. 最大交换+2765. 最长交替子数组+2865. 美丽塔 I

670. 最大交换+2765. 最长交替子数组+2865. 美丽塔 I

2024-03-03 19:20:46 582

原创 【LeetCode题解】2182. 构造限制重复的字符串+82. 删除排序链表中的重复元素 II+83. 删除排序链表中的重复元素

2182. 构造限制重复的字符串+82. 删除排序链表中的重复元素 II+83. 删除排序链表中的重复元素

2024-03-02 19:08:04 756

原创 【LeetCode题解】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)+2085. 统计出现过一次的公共字符串(哈希表)+2807. 在链表中插入最大公约数

2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)+2085. 统计出现过一次的公共字符串(哈希表)+2807. 在链表中插入最大公约数(模拟+求最大公约数的6中写法)

2024-03-02 19:03:11 745

原创 【LeetCode题解】1944. 队列中可以看到的人数(单调栈)+383. 赎金信(计数模拟)+447. 回旋镖的数量(枚举+哈希表)+2707.+2696. 删除子串后的字符串最小长度(调用栈)

1944. 队列中可以看到的人数(单调栈)+383. 赎金信(计数模拟)+447. 回旋镖的数量(枚举+哈希表)+2707.+2696. 删除子串后的字符串最小长度(调用栈)

2024-03-01 14:40:50 268

SSM框架练习题(选择+填空+编程题)

SSM框架练习题(选择+填空+编程题)

2023-11-28

空空如也

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

TA关注的人

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