- 博客(97)
- 资源 (1)
- 收藏
- 关注
原创 并发编程概念整理
一、进程 定义:系统分配资源的最小单位,一个任务就是一个进程 组成: (1)PID:进程的唯一身份标识 (2)进程的状态: 新建状态 —— 就绪状态 —— 运行状态 —— 阻塞状态 —— 销毁状态 (3)优先级:决定进程的执行顺序 (4)记账信息:为了进程的执行的相对公平 (5)上下文:保存本次的执行状态,以便下次仅需执行 (6)一组内存:指定进程需要使用的资源 并行和并发 并行:多个任务在多个CPU下,同时执行角左并行(宏观与微观都是同
2021-08-03 17:30:30
601
3
原创 SpringBoot 框架搭建 用户管理系统(附代码)
使用SpringBoot 框架搭建用户管理系统,代码附在文末 快~点这里来试试(●’◡’●) 1、项目解决问题 用户管理系统:用户的信息做统一的管理 2、需求功能分析 1、登录功能(普通管理员登陆、超级管理员的登录) 2、用户列表页面(普通用户的列表、超级管理员的列表页) 3、条件查询(组合条件查询、不定规则查询) 4、分页功能 5、添加功能(普通管理员的添加、超级管理员的添加) 6、单挑删除功能 7、多条删除功能 3、设计数据库 用户表: id int 自增, 姓名 varchar(5
2021-07-30 11:30:47
7534
4
原创 计算机网络概念整理
1、协议: 是网络交互的基础,是一种约定,规范双方的通讯行为用于保证网络传输双方能够正常通讯 2、协议的分层 (1)OSI 七层模型(从上到小的,下一层是为上一层服务的) 应用层 :将标准的数据转换成程序需要的格式 表示层:将设备的数据格式转化成标准的格式。 会话层:用来管理通讯双方之间的会话。 传输层:用来确保双方的数据可以正常传输 网络层:地址的管理和路由的选择 数据链路层:保证相邻节点之间的数据传递 物理层:将数字信号传递成为光电信号 (2)TCP/IP 四层模型 应用层:常用协议有 —— HT
2021-07-27 15:40:10
301
原创 MySQL概念整理
连接数据库指令:mysql - u用户名 -p密码 -h IP地址 -P 端口号 一、MySQL 基础使用 1、数据库操作: 查询数据库:show databases; 删除数据库:drop database db_name; 使用数据库:use db_name; 创建数据库:create database db_name character set utf8mb4; 2、表操作 创建表:create tables tables_name(字段1,字段2,…); 删除表:drop table table_n
2021-07-20 16:36:15
165
原创 没有办法从零开始也不是胎教的 SpringBoot 框架搭建个人博客项目实现(附代码)
使用SpringBoot 框架搭建个人博客代码附在文末 1、下载环境 首先在官网 https://start.spring.io/ 下载一个模板到本地,使用Spring Boot 2.4.8版, java 8,下载jar包,同时导入Spring Boot DevTools(热部署)、Lombok(快捷注释)、 Spring Web(网络项目需要用) 三个依赖;下次使用时,解压然后改文件名就可以了 2、安装依赖 我们创建的
2021-07-19 11:42:23
551
2
原创 Java虚拟机 —— JVM
JVM部分大纲如下: 1、JVM组成5个部分 2、类加载机制(JVM加载 | 双亲委派模型 | 破坏双亲委派模型的三种情况) 3、垃圾回收 a ) 判断什么是垃圾? b ) 垃圾回收算法 c ) 垃圾处理器(7种 ,其中重点为 CMS 和 G1) 4、JMM(java内存模型)—— 让JVM高速运行的一种技术 JVM布局(HotSpot): 以jdk1.8为例,分为5个部分 1、堆 new Object() 所有的对象都是存在此区域,此区域也是JVM中最大的一块区域;JVM垃圾回收就是针对此区域。
2021-06-21 19:26:34
192
原创 Java并发编程 —— JUC(java.util.concurrent)下的常用类、线程安全容器(ConcurrentHashMap)
HashMap 相关的高频问题:底层实现结构、负载因子、哈西冲突的解决方案…、线程安全问题 HashMap 是非线程安全的容器 在JDK1.7 下会造成死循环 在JDK1.8 下会造成数据覆盖 HahsMap JDK1.7 死循环分析 HashMap 的存储结构为: 数组 + 链表/红黑树 当链表长度大于8,数组长度大于64时,会升级为红黑树 当链表长度小于6,会降级为链表 双线程在进行扩容时可能会出现循环引用,循环引用就会导致死循环 HashMap扩容代码如下(JDK1.7为头插) 使用Conc
2021-06-21 13:00:31
262
2
原创 Java并发编程 —— 锁策略
乐观锁 认为一般情况西不会发生冲突,只有在进行数据更新的时候,才会检测并发冲突,如果没有冲突则执行修改,如果有冲突则返回修改。 CAS(乐观锁的具体实现)Compare And Swap —— 比较并且交换 CAS中的三个组成部分: V(内存值)、A(旧值)、B(新值) 实现原理: V == A?true(没有并发冲突) —> V = B false(并发冲突) —> 该线程将旧值A修改为此时内存中的V值,然后再进行一次比较 乐观锁的事项 Atomic* Atomic*(乐观锁的实现)
2021-06-18 11:27:51
276
1
原创 Java并发编程 —— 单例模式、自定义阻塞队列
提升程序的性能: 1、多线程 2、单例模式 单例模式 单例模式:整个程序的运行中只存储一个对象 简单来说,当我这个对象创建好了之后,在整个程序中,其他人想用的时候都用的是我创建的这个对象 单例模式的创建方式: 1、饿汉方式 —— 上来直接先创建一个对象 package ThreadLocal; /** * 饿汉方式 * */ public class ThreadLocalDemo80 { static class Singleton{ // 1、创建私有的构造函数.
2021-06-17 11:18:21
207
2
原创 Java并发编程 —— ThreadLocal
ThreadLocal 是线程级别的私有变量 需求一:使用最高效的方式实现两个Date(事件类型)的格式化 使用SimpleDateFormat得到时间格式化,写法如下: package ThreadLocal; import java.text.SimpleDateFormat; import java.util.Date; /** * SimpleDataFomart使用方法 * **/ public class ThreadLocalDemo64 { public static v
2021-06-16 19:25:30
241
原创 Java并发编程 —— 线程池
线程的缺点: 1、线程的创建需要开辟内存资源:本地方法栈、虚拟机栈、程序计数器等线程私有变量的内存。所以频繁的创建和消耗会带来一定的性能开销 2、使用线程不能友好的管理任务和友好的拒绝任务。在《阿里巴巴java开发手册》中要求,线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。 线程池: 定义:使用池化技术来管理和使用线程的技术,就叫做线程池 线程池的创建方式包含7种 创建方式一:创建固定个数的线程池 package ThreadPool; import java.util.concu
2021-06-15 18:04:27
1411
原创 Java并发编程 —— 死锁问题、线程等待
线程的状态转换流程: 死锁 定义:在多线程编程中(两个或两个以上的线程),因为资源抢占而造成资源无限等待的问题 线程和锁的关系 —— 1 对 多:一个线程可以拥有多把锁;而一把锁只能被一个线程拥有 排查死锁的工具: 1、jconsole 2、jvisualvm 3、jmc 手写一个死锁的关键步骤: 1、获取锁A 2、线程休眠 3、获取锁B package Thread; /** * 实现一个死锁 * */ public class ThreadDemo16 { public
2021-06-11 16:47:28
337
1
原创 Java并发编程 —— 使用synchronized 和Lock解决线程不安全问题
Volatile 轻量级解决“线程安全”的方案 private static volatile boolean flag = false; volatile作用: 1、禁止指令重排序 2、解决线程可见性的问题 如何解决? 根据线程的工作方式 —— 线程会先在自己的工作内存中找变量,如果在自己的工作内存中没有找到,再去主内存中找变量 使用了volatile后,当操作完变量后,会强制删除掉 ...
2021-06-10 21:43:57
210
原创 Java并发编程 —— 线程的启动、中断;线程的状态;多线程的线程安全问题
线程启动的方法 start和run方法的区别 1、run属于普通方法,start属于线程启动的方法 2、run方法可以执行多次,而start方法只能执行一次 线程中断 1、使用全局自定义的变量来终止线程 终止的方法比较温柔,在拿到终止指令后,需要执行完当前的指令之后才会终止线程 package Thread; /** * 使用全局自定义变量来终止线程 * */ public class ThreadDemo10 { // 全局自定义变量 private static boole
2021-06-09 16:59:35
1120
1
原创 Java并发编程 —— 线程的创建、线程休眠
进程vs线程: 1、进程是系统分配资源的最小单位;线程是系统调度的最小单位 2、一个进程中至少要包含一个线程 3、线程必须要依附于继承,线程是进程实质工作的一个最小单位 线程的创建方式: 1、继承Thread类 实现线程的创建(2种写法) 1.1种写法 public class ThreadDemo03 { static class MyThread extends Thread{ @Override public void run(){
2021-06-08 21:45:10
481
3
原创 从零开始,但又不是完全从零开始的也不那么胎教的”Web聊天室“项目实现(附代码)
最终整个项目的完整代码我会放在文末 整体流程总结: 1、新建项目准备 (1)创建maven项目;选择maven-archetype-webapp (2)修改WEB-INF下的web.xml;配置pom.xml下的依赖包 (3)在Setting的Plugins中安装Lombok(这个在本项目中的作用是不用再生成private的Get和Set的方法了) (4)还需要准备一些工具包放在webapp下,“css”、“fonts”和“js”的一些包,这些主要是构成前段页面的(我代码中有了) 2、需求分析 (1)打开主
2021-06-03 00:03:06
278
8
原创 从零开始的胎教“ 个人博客 ”项目搭建 —— 项目创建,用户注册功能
搭建一个个人博客,使用的工具是IDEA 在进行项目之前,需要一些前置知识: 1、我们要使用tomcat这个工具对我们的代码进行部署,这个工具可以将我们的项目部署到网络,本项目暂时是将该项目部署在自己的局域网上 2、在IDEA中新建一个项目,新建项目的流程如下: ① 选取Maven栏(简单的理解就是一种项目管理工具),并勾选Create from archtype并如下选取,并执行next ② 给工程起名,这步不重要,起个英文名直接next ③ 这步比较关键,如下图所示User settings file
2021-04-07 19:31:39
398
2
原创 小彩笔的痛苦刷题日记 ——132模式
题目: 给定一个整数序列:a1, a2, …, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。 注意:n 的值小于15000。 示例1: 输入: [1, 2, 3, 4] 输出: False 解释: 序列中不存在132模式的子序列。 示例 2: 输入: [3, 1, 4, 2] 输出: True 解释: 序列中有 1 个13
2021-03-24 10:21:30
173
原创 小彩笔的痛苦刷题日记 ——扁平化嵌套列表迭代器
题目: 给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。 示例 1: 输入: [[1,1],2,[1,1]] 输出: [1,1,2,1,1] 解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。 示例 2: 输入: [1,[4,[6]]] 输出: [1,4,6] 解释: 通过重复调用 next 直到 ha
2021-03-23 11:38:36
160
原创 小彩笔的痛苦刷题日记 —— 反转链表Ⅱ
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 ````
2021-03-18 10:33:06
210
原创 小彩笔的痛苦刷题日记 ——验证二叉树的前序序列化
验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / \ 4 1 # 6 / \ / \ / \ # # # # # # 例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。给定一串以逗号分隔的序列,验证它是否是
2021-03-12 09:49:50
200
原创 小彩笔的痛苦刷题日记 ——分割回文串
分割回文串 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串。返回s的所有可能的分割方案。 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ] 回溯算法 1、画出树形结构,本题的递归树模型是一颗二叉树 2、编码 每一个节点表示剩余没有扫描到的字符串,产生分支是截取了剩余字符串的前缀 产生前缀字符串时,判断前缀字符串是否是回文 – 如果前缀字符串是回文,则可以产生分支和结点 – 如果前缀字符串不是回文,则不产生分支和结点,这一步是剪枝操作 如果叶
2021-03-07 13:26:30
153
原创 小彩笔的痛苦刷题日记 ——下一个更大元素
一、下一个更大元素 I 给两个没有重复元素的数组nums1和nums2,其中nums1是nums2的子集。请找出nums1中每个元素在nums2中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。 忽略数组nums1,对nums2中的每一个元素,求出其下一个更大的元素。随后将其放入HashMap,再遍历数组nums1,并直接找出答案。对于nums2,使用单调栈来找到每个元素的下一个更大元素。
2021-03-06 19:15:25
150
1
原创 小彩笔的痛苦刷题日记 —— 俄罗斯套娃信封问题
俄罗斯套娃信信封问题 给定一些标记了宽度和高度的信封,宽度和高度以 整数对 的形式(w, h)出现。当另一个信奉的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里吗,如同俄罗斯套娃。 请计算最多能有多少个信奉能组成一组“俄罗斯套娃”信封(不允许旋转信封) 示例: 输入: envelopes = [[5, 4],[6, 4],[6, 4],[2, 3] ] 输出: 3 解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。 解析: 该问
2021-03-04 14:33:47
283
1
原创 小彩笔的刷题痛苦日记 —— 比特位计数
比特位计数: 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回 示例: 输入:2 输出:[0,1,1] 示例: 输入:5 输出:[0,1,1,2,1,2] 方法一:直接计算: 使用x = x&x(x-1)的方式,将x的二进制的最后一个1变为0 例如: 11 1 0 1 1 例如要统计11的二进制中1的个数,使用ones作为计数器 10 1 0 1 0 &am
2021-03-03 14:49:28
168
原创 小彩笔的刷题痛苦日记 —— 区域检索-数据不可变、二位区域和检索-矩阵不可变
一、区域检索-数据不可变 给定一个整数数组nums,求出数组从索引i到j(i≤j)范围内元素的综合,包含i、j两点。 实现NumArray类: NumArray(int[] nums)使用数组nums初始化对象 int sumRange(int i, int j) 返回数组 nums 从索引i 到j(i ≤ j)范围内元素的总和,包含i、j 两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j])) 解析:前缀和(preSum) 假设数组长度为N,定义一个长
2021-03-02 11:17:26
144
原创 JAVA学习记录(十八)—— 二叉树进阶习题
1、递增顺序查找树:给你一个树,请你按中序遍历重新排列树,是树中最左边的结点现在是树的根,且每个节点没有左子节点,只有一个右子节点。力扣(LeetCode) 示例 : 输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / \ 3 6 / \ \ 2 4 8 / / \ 1 7 9 输出:[1,null,2,null,3,null,4,null,5,null,6
2021-01-29 20:07:35
241
原创 JAVA学习记录(十七)—— 二叉树基础、简单习题
树的表示形式 class Node{ int value; // 树中存储的数据 Node firstChild; // 第一个孩子引用 Node nextBrother; // 下一个兄弟引用 } 特殊的二叉树 1、满二叉树:每一个层的结点数都达到最大值,这个二叉树就是满二叉树。个二叉树的层数为K,且节点总数是2k−12^k - 12k−1,就是满二叉树。 2、完全二叉树:对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中
2021-01-27 19:24:47
250
1
原创 JAVA学习记录(十六)—— 栈、队列
1、栈(Stack) 一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。遵循先进后出原则 压栈:栈的插入操作叫做进栈/压栈/入栈 出栈:栈的删除操作叫做出栈 public class MyStack{ private int[] elem; private int top; //可以表示下标,也可以表示当前栈内有多少个元素 public MyStack(){ this.elem = new int[10]; // 这里默认给栈的大小为10
2021-01-25 16:10:23
230
2
原创 JAVA学习记录(十五)—— 集合、范型、List
泛型: 只存在于编译时期 意义:自动进行类型的检查;自动进行类型的转换 范式在 1、Java中,的集合类型包括ArrayList、LinkList、HashMap等,下列关于集合描述错误的是?(C) A.ArrayList和LinkedList均实现了List接口 B.ArrayList的访问速度比LinkedList快 C.随机添加和删除元素时,ArrayList的表现更佳 D.HashMap实现Map接口,它允许任何类型的键和值对象 解析:ArrayList是基于数组实现的,
2021-01-23 09:10:20
495
3
原创 小彩笔的刷题痛苦之旅 —— 将数组分成和相等的三个部分、二维网格迁移、找到小镇法官
题目:给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。 形式上,如果可以找出索引i+1 < j且满足A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1]就可以将数组三等分。 示例 1: 输入:[0,2,1,-6,6,-7,9,1,2,0,1] 输出:true 解释:0 + 2 + 1 = -6 + 6 -
2021-01-22 19:09:17
184
原创 JAVA学习记录(十四)—— String 类
字符串创建的方法 String str1 = "Hello world"; String str2 = new String("Hello world"); char[] array = {'a', 'b', 'c'}; String str3 = new String(array); 关于字符串比较相等的问题: String str1 = "abcde"; String str2 = new String("abcde"); System.out.println(str1 == str2); //
2021-01-20 17:07:43
257
1
原创 JAVA学习记录(十三)—— 图书管理系统
该系统总共有以下这么多个部分 一、book文件夹下: Book中有每一本书得信息,与这些信息的Get和Set方法,还有对于书的toString方法 package 一月十八日.图书管理系统.book; public class Book { private String name; //书名 private String author; //作者 private int price; //价格 private String type; //类型
2021-01-18 18:33:25
579
2
原创 Java学习记录(十二)—— 类_继承_多态_抽象类_接口
多态 // 打印形状 class Shape{ public void draw(){ } } // 打印矩形 class Rect extends Shape{ @Override public void draw(){ System.out.println("♦"); } } // 打印圆圈 class Circle extends Shape{ @Override public void draw(){ Syste
2021-01-17 20:03:52
156
原创 JAVA学习记录(十一)—— 无头双向非循环链表
双向链表与单向链表的区别是,单向链表的一个结点包含(当前节点的值val、指向下个结点的地址next);双向链表的一个结点包含(当前节点的值val、指向下个节点的地址Next、指向上一个结点的地址prev) class ListNode(){ // 也可以使用public进行修饰 // 但是双链表使用private,为了熟悉一下使用get和set操作 private int val; private ListNode next; private ListNode pre
2021-01-10 09:29:11
158
原创 JAVA学习记录(十)—— 无头单项非循环链表相关习题
一、反转一个单链表 思路:定义三个结点 1、cur 作为遍历整个链表的引用 2、prev 代表当前需要翻转的 3、curNext 代表需要翻转的下一个节点 public Node reverseList(){ Node cur = this.head; Node prev = null; Node newHead = null; while(cur != null){ Node curNext = cur.next; if(curNext
2021-01-09 11:28:11
189
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人