- 博客(126)
- 资源 (6)
- 收藏
- 关注

原创 初识二叉树
初识二叉树树形结构概念二叉树二叉树的基本形态两种二叉树满二叉树完全二叉树树形结构树是一种非线性的数据结构,它由n(n>=0)个有限结点组成。树形结构像一颗倒挂的树。概念1、结点:树由结点组成,根节点没有前驱结点,除了根节点,其余每个结点有且仅有一个前驱,可以有0个或多个后继。N个结点有n-1条边。2、结点的度:一个节点含有的子树的个数称为结点的度;3、树的度:一棵树中,最大结点的度称为树的度。4、叶子结点:度为0的结点称为叶节点。(没有后继的结点)4、树的深度:树中,结点最大层次;
2021-03-26 13:16:27
3482
10

原创 顺序表和模拟实现ArrayList的常用方法
模拟实现ArrayList的常用方法ArrayListArrayList:顺序表顺序表和数组的区别:顺序表中的注意点:ArrayList的常用方法模拟实现ArrayList的常用方法ArrayListArrayList:顺序表我们可以将顺序表的底层理解成为一个数组(可以扩容的数组),但是相比于数组多出一个记录有效数据的计数器size,如:顺序表和数组的区别:上面说,顺序表的底层可以理解为一个数组,但是相比于数组,更加的高级。顺序表可以自己扩容;顺序表严格区分数组容量和元素的个数。所以数组其
2021-03-07 14:09:21
2903
13
原创 对称加密和非对称加密
对称加密和非对称加密对称加密非对称加密数字签名CA证书HTTP是一种不安全(嗅探、篡改)的协议所以需要引入HTTPS(HTTP + SSL)对称加密加密密钥 = 解密密钥优点:速度较快,缺点:密钥的传输和保管也是不安全的(可能会有中间人获取)所以还是有可能使用一个不安全的密钥进行传输非对称加密非对称加密:加密密钥!=解密密钥虽然速度较慢,但是不怕密钥泄露如何保证在传输的时候,没有中间人呢?数字签名数字签名,数字摘要——对数据进行哈希,利用相同的数,哈希值一定相同如果签名的值相同
2021-07-30 11:00:28
872
1
原创 初识TCP
TCP -- Transmission Control Protocol可靠性TCP报头确认应答机制TCP协议和UDP协议是运行在传输层的协议,也是为了结局进程间通信的问题,它相对于UDP协议而言,是一种有连接的,可靠的协议。可靠性为什么需要可靠性?因为网络的不可靠,而应用层很多时候需要可靠的传输(核心)什么是可靠性?尽可能的吧数据发送给对方,不丢包如果实在发送不到,至少通知应用层这个错误保证数据的有序到达TCP保证不会收的错误的数据(只能保证无意识的错误,不能防范有意识的篡改)TC
2021-07-29 21:58:38
953
2
原创 初识UDP协议
UDP协议UDP格式UDP特点不可靠无连接可以广播面向数据报性能相对高UDP的缓冲区UDP是在传输层上工作的协议传输层协议:是在主机已经可以和主机建立链接的前提下,实现进程和进程间的通信。UDP格式UDP协议:16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度如果校验和出错,就会直接被丢弃校验和:CRC算法 ——>Hash算法可以判断出数据是否被修改UDP协议首部有一个16位的最大长度,也就是说,一个UDP能传输的最大长度是64K(包含UDP首部)如果需要传输的
2021-07-29 15:48:38
1080
1
原创 初识Redis
初识RedisRedis使用场景安装简单操作:使用RedisRedis是一个软件。存储软件(和MySQL有着相似之处)它的核心就是内存型存储软件(数据主要保存在内存中,相对的读写速度快于MySQL;持久化存储的能力弱于MySQL)核心:key-value存储,不是关系型数据库。不适用SQL语言使用场景实际生产中,Redis适合存储一些数据一致性不高,但是要求读写速度的场景。例如:访问量统计。安装在linux环境下,使用yum安装。yum install redis启动:servic
2021-07-28 15:43:22
681
2
原创 Tomcat配置HTTPS
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2021-07-28 15:20:26
715
1
原创 定时器+线程池
定时器+线程池定时器线程池创建Executors定时器定时器:定时器就像设置一个闹钟,当时间到达后完成某件事情,像JS中的是setTimeout。(JS中的setInterval是每隔多久执行一次)1、我们使用定时器的时候,最主要的是小一个任务Runnable,TimeTask就实现了Runnable接口,所以我们直接创建一个Task。2、设置定时器:Timer timer = new Timer();3、调度:利用timer.schedule()方法设置task和delay;schedule
2021-07-10 17:31:44
1038
5
原创 初识阻塞队列
阻塞队列阻塞队列生产者-消费者模型模拟实现阻塞队列阻塞队列阻塞队列表现为通知模式的队列。生产者因为队列满了而阻塞在队列上,直到队列不满时被通知唤醒。java.concurrent.BlockingQueue <E> interface继承自 java.util.Queue <E> 队列concurrent:并发parallel:并行java.util.concurrent juc包ArrayBlockingQueue 数组阻塞队列(循环队列)实现阻塞队列的(w
2021-07-08 18:29:55
613
1
原创 按序打印——wait的再理解
按序打印加锁volatilewaitoj我们提供了一个类:public class Foo {public void first() { print(“first”); }public void second() { print(“second”); }public void third() { print(“third”); }}三个不同的线程 A、B、C 将会共用一个 Foo 实例。一个将会调用 first() 方法一个将会调用 second() 方法还有一个将会调用 third()
2021-07-07 09:07:55
709
1
原创 线程等待机制——wait/notify(notifyAll)
线程等待机制语法waitwait()加锁notify使用场景wait和sleep对比wait、notify、notifyAll属于Object类下的三个普通方法(java中所有对象都具备这三个方法)基本使用规则:对象.wait(),使得线程进入“等待”状态,直到有其他线程,在同一个对象上调用notify/notifyAll()方法语法关于wait和notify的使用规则,必须先对等待的对象,通过synchronized加锁Object o = new Object();//等待唤醒的对象syn
2021-07-06 09:20:05
1479
2
原创 初识单例模式
单例模式饿汉模式懒汉模式单线程版多线程版-性能低多线程版-性能高单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。作为单例模式:
2021-07-05 19:03:18
640
1
原创 volatile关键字
volatile关键字语法作用volatile——脆弱的,易失的语法volatile关键字是变量修饰符,用来修饰变量主要修饰静态属性、属性例如:class ThreadDemo { private volatile int n; public static volatile int a;}作用保护内存可见性(最重要的作用)被volatile修饰的变量不能被缓存,每次读取都必须从主存储中读取,每次写入,必须刷回主存储中保护一定的原子性例如:volatile
2021-07-04 19:54:11
592
2
原创 synchronized
synchronized 关键字-监视器锁monitor locksynchronized语法预备知识synchronized关键字的作用两个线程互斥例子:synchronized 加锁的过程synchronized 释放锁的过程synchronized容易被忽视的地方synchronized的作用synchronized 是一种保护线程安全的机制。synchronized语法修饰任意的方法——方法修饰关键字普通方法 synchronized void m2() {}静态方法 s
2021-06-30 17:04:56
718
1
原创 多线程带来的风险——线程安全
线程安全线程安全原子性常见的操作是原子的常见的不是原子的操作内存可见性JMM代码重排序那些场景下会存在线程安全常见的一些类线程安全多线程代码中往往表现出很强的随机性其主要原因是:线程调度所导致的一个程序是线程安全的概念:程序的运行结果100%符合程序开发的期望为什么会出现线程不安全的情况没有保证原子性存在内存可见性问题由于代码重排序所带来的的问题原子性高级语言中的一条语句往往对应的是很多条指令,例如:n++指令:把n这个变量对应的内存中的数据,加载到寄存器中 ( LOAD)
2021-06-29 18:44:33
667
原创 线程初步认识
线程认识线程(Thread)概念什么情况下需要线程创建Java线程Thread的几个常见属性如何创建Java线程start() vs run()Thread类常见的构造方法:线程中断调用方法等待一个线程线程的状态Thread.isXXX()Thread中常见静态方法观察线程状态工具认识线程(Thread)概念线程属于进程的组成(每个进程中至少有一个线程(主线程),也可以有多个线程)线程是os进行调度的最小单位。进程是系统分配资源(包括CPU)的最小单位,线程是系统调度(CPU分配)的最小单位
2021-06-28 18:45:44
782
1
原创 进程的初步认识
进程os定位进程的初步认识关于进程调度/切换时间片并发和并行进程的状态内核态与用户态进程间的通信os定位在计算机的软硬件构架中,操作系统的定位是:一套纯正“管理”的软件(分配资源)进程的初步认识进程是os进程资源分配的最小单位主要表现为硬件资源、文件资源(硬盘资源)os的内存管理1、做到隔离性的空间分配2、线性地址和物理地址之间的转换关于进程调度/切换1、为什么要有进程调度?因为os在进程之间分配CPU2、什么是进程调度?os通过完成一些动作,使得CPU从运行A进程指令
2021-06-24 21:53:12
727
1
原创 Linux部署
Linux部署搭建环境部署搭建环境# 环境准备的所有命令yum install -y git # 安装 gityum install -y java-1.8.0-openjdk-devel # 安装 jdk8yum install -y maven # 安装mavenyum install -y mariadb-server # 安装mysql服务器systemctl start mariadb # 启动mysql服务器systemctl enable mariadb # 让mysql服
2021-06-11 12:38:00
643
1
原创 Get和Post请求
Get和Post请求GET请求 VS POST请求:本质上的区别:语义不同(GET是取,POST是提交)表现出的一些主要区别:1、GET没有请求体,POST请求允许有请求体2、GET请求具备幂等性,POST请求不具备幂等性幂等性:多次请求没有副作用。GET就相当于查询,POST相当于修改3、GET请求允许被浏览器/代理服务器进行缓存,POST请求不允许4、GET请求可以被浏览器书签保存,POST不允许5、form表单提交数据的时候,GET请求放在query string中(url后面),
2021-06-08 19:04:18
661
原创 JS实现点名功能
JS实现点名功能描述实现主要是使用JS修改/操作DOM树的能力描述利用JS实现点名功能,当在网页点下点击按钮的时候,随机点名,然后将点过名的同学插入到安全区(下次不会点到),但是安全区的名字最多只有5个,超过5个,则下次仍然有机会点到。实现我们首先准备HTML的页面,页面包含如下内容:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title&g
2021-05-31 22:56:18
2650
6
原创 Cookie和Session
Cookie和SessionCookie和SessioncookieSession流程例子cookie与HTTP==Cookie和Session的区别==HTTP协议是一种无状态的协议,但是在现实生活中希望出现会话管理,所以出现了cookie和session机制。应用场景:例如:登录,注册…需要保持一段时间的在线状态Cookie和Sessioncookie一种在浏览器中解决的方案,将登录认证的信息保存在本地浏览器中,后面发起的http请求,都会自动携带该信息,达到认证用户,保持用户在线状态。
2021-05-27 13:38:35
753
2
原创 模拟实现红绿灯
模拟实现红绿灯模拟实现红绿灯模拟实现红绿灯利用HTML+CSS+JS实现红绿灯效果:<!DOCTYPE html><html lang="zh-hans"><head> <meta charset="uft-8"> <title>红绿灯</title> <style> * { box-sizing: border-box;
2021-05-17 22:18:20
764
原创 猜数字游戏网页版
猜数字游戏网页版本猜数字游戏页面展示:具体实现:猜数字游戏实现一个猜数字游戏。随机产生一个数字,输入数字猜这个数字的大小,直到猜中这个数字。当你输入的这个数字小于这个随机数,提示猜小了,当你输入数字大于这个随机数,则提示猜大了。直到猜中这个随机数,输出恭喜你猜中了,并结束程序。如何用网页实现猜数字游戏呢?我们需要用到html/css/JavaScripthtml用于展示css美化界面(设置背景,颜色…)JavaScript计算页面展示:具体实现:<!DOCTYPE html&g
2021-05-17 21:07:34
1775
5
原创 SQL查询总结
查询聚合查询聚合函数GROUP BY 子句多次分组聚合HAVING联合查询内连接外连接自连接子查询[NOT] IN[NOT] EXISTSSQL基础语句查询为:SELECT * FROM student;聚合查询聚合函数常见的聚合函数有:MAX、MIN、AVG、COUNT、SUM函数说明COUNT返回查询到数据的数量MIN返回查询到数据的最小值MAX返回查询到数据的最大值AVG返回查询到数据的平均值SUM返回查询到数据的总和需要注意的
2021-04-26 13:50:40
1934
4
原创 MySQL基础
MySQL基础数据类型SQL语句:对数据库操作对表的操作对MySQL表的增删改查新增(Create)单行数据+全列插入多行数据+指定列插入查询(Retrieve)指定列查询全列查询查询字段为表达式别名去重: DISTINCT排序 ORDER BY条件查询:WHERE分页:LIMIT修改(Update)删除(Delete)数据类型数据类型非常的多,这里就只列出我们常用的一些类型吧:1、数值类型:(INT 整形 DECIMAL 非整形(浮点型))2、字符串:VARCHAR(45) 变长的字符串
2021-04-18 16:25:20
1812
7
原创 模拟实现HashMap
模拟实现HashMap模拟实现HashMap注意事项关于Set和Map区别:见链接: Set和Map关于HashTable见链接: 哈希表模拟实现HashMapNode:public class Node { public String key; public Integer value; public Node next; public Node(String key, Integer value) { this.key = key;
2021-04-15 21:27:17
428
原创 哈希表
哈希表概念哈希函数设计冲突调节负载因子冲突解决闭散列开散列/哈希桶实现自己的哈希表:概念理想的搜索方法:不经过任何比较,一次直接从表中得到想要的搜索元素。构造某种存储结构,通过某种函数(hashfunc)使元素的存储位置与他的关键key之间建立一一映射的关系,在查找的时候,可以很快找到该元素。哈希方法中使用的转换函数称为哈希(散列)函数,构造出的数据结构称为哈希表(HashTable)(后者称为散列表)哈希函数设计常见的哈希函数:1、直接定制法:Hash(key)= A*key+B优点:简
2021-04-15 20:10:50
403
1
原创 Set和Map
Set和MapSet和MapSetSet中的常用方法:MapMap中的常用方法:Set和MapTreeSet和TreeMap在Java中利用搜索树实现的Map和Set;实际上是用的红黑树,而红黑树是一颗近似平衡的二叉搜索树。关于二叉搜索树 :见下面链接:链接HashSet和HashMap在java中利用哈希表实现;Java中使用哈希桶方式解决冲突的;Java会在冲突链表长度大于一定的阀值后,将链表转变为搜索树(红黑树);Set注意:Set继承自Collection接口类Set中只存储了k
2021-04-14 14:12:05
851
6
原创 二叉搜索树原理及操作
二叉搜索树原理构建二叉搜索树查找插入删除原理二叉搜索树(Binary Search Tree BST)又称为二叉排序树,它是一颗空树或者具有以下性质:它的左子树不为空,则左子树上所有节点的值都小于根节点的值它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也是二叉搜索树简单来说:每个结点, 节点左子树中所有的key值,都小于节点的key值; 节点右子树中所有的key值,都大于节点的key值所以:二叉搜索树的中序遍历,一定有序构建二叉搜索树节点:publi
2021-04-09 23:24:58
614
6
原创 排序算法性能分析和海量数据排序问题
排序算法性能分析时间和空间复杂度快速排序的优化海量数据排序问题:时间和空间复杂度整理:排序稳定性时间复杂度空间度复杂度最好最坏最好/平均/最坏最好/平均/最坏冒泡排序有序逆序稳定O(n) / O(n2) / O(n2)O(1)插入排序有序逆序稳定O(n) / O(n2) / O(n2)O(1)选择排序不稳定O(n2) / O(n2) / O(n2)O(1)希尔排序不稳定O(n * log(n)) / O
2021-04-08 20:41:16
466
4
原创 归并排序(重要)
归并排序原理:分解:合并:非递归:原理:归并排序(mergeSort)是建立在归并操作上的一种有效的排序算法,该算法采用分治法。将以有序的子序列合并,得到一个完全有序的序列,即:先使得每个子序列有序,再使得子序列段间有序。如果将两个有序表合成一个有序表,称为:二路归并。我们采用二路归并如图演示:分解的过程,我们可以借助递归,不停的往下分解,直到只有一个元素分解完成。合并的过程,就是我们合并两个有序的数组,我们主要是比较两个元素,小的先放,然后放较大的元素。分解:public static v
2021-04-07 23:07:01
3077
6
原创 快速排序——一看就会,一写就废
快速排序原理:实现:partitionhoare法:实现:挖坑法:实现:前后遍历:实现:原理:1、从待排序区间中选择一个数,作为基准值(pivot);2、Partition:遍历整个待排序区间,将小于等于基准值放在基准值左边,将大于等于基准值的放在基准值右边;3、采用分治思想,对左右两个区间相同方式处理,直到区间长度为1,代表有序,或者区间长度为0,代表没有数据。实现:当我们看见使用相同的方式处理,应该很快想到需要使用递归,但是使用递归,我们需要划定区间,所以需要quickRange,(至于pa
2021-04-07 15:32:48
861
13
原创 排序算法原理及实现
排序算法原理及实现插入排序原理:实现:希尔排序原理:实现:选择排序原理:实现:冒泡排序原理:实现:排序,使一串记录,基于比较,按照递增或者递减的排列起来。通常意义上的排序,都是原地排序(in place sort)插入排序原理:我们将整个区间看做无序区间和有序区间,每次选择无序区间的第一个元素,然后在有序区间的合适位置插入。实现: public static void insertSort(long[] array) { for (int i = 1; i < a
2021-04-06 20:52:43
672
8
原创 查找和最小的k对数字
查找和最小的k对数字查找和最小的k对数字查找和最小的k对数字LeetCode373: 链接:查找和最小的k对数字题目描述:373. 查找和最小的K对数字给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。示例 1:输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
2021-04-03 23:03:01
504
原创 了解优先级队列(堆)
优先级队列(堆)堆堆的定义大小堆堆的创建向下调整建堆优先级队列模拟实现优先级队列TOPK问题堆堆的定义把所有元素按照完全二叉树的顺序存储方式存储。堆,堆在逻辑上是一个完全二叉树,实质上是一个顺序表。将元素放入数组中,可以根据二叉树的性质将其还原:假设数组下标为i,如果i为0,代表根节点其双亲节点为 (i -1 ) / 2大小堆将根节点最大的堆叫大堆,根节点最小的堆叫小堆堆中的某个结点值,总是不大于或者不小于其父节点的值堆总是一颗完全二叉树根据有序数组,我们可以推出它是堆,但是
2021-04-01 21:58:32
583
2
原创 二叉树的层序遍历和杨辉三角
二叉树的层序遍历和杨辉三角二叉树的层序遍历杨辉三角之所以把这两个题放在一起,是因为他们的返回值类型都是==List<List< Integer>>==在链表中放入的元素是链表我们可以一起比较学习。二叉树的层序遍历LeetCode题目:链接:二叉树的层序遍历class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List&l
2021-03-31 15:09:16
1715
4
原创 二叉树的部分练习题目
目录相同的树另一个树的子树二叉树的最大深度平衡二叉树对称二叉树二叉树的最近公共祖先二叉树创建字符串相同的树链接: 相同的树思路:先判断根节点是否相同,如果不同则false,然后在判断左子树和右子树class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; }
2021-03-30 13:18:46
386
6
原创 二叉树前中后序遍历的递归和非递归实现
目录二叉树遍历前序遍历递归非递归中序遍历递归非递归后序遍历递归非递归二叉树遍历二叉树的遍历分为深度优先和广度优先深度优先又分为前序遍历、中序遍历和后序遍历详见:初识二叉树我们可以理解为对结点的处理顺序在前、中间还是最后例如:前序遍历二叉树的前序遍历递归 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<
2021-03-28 13:41:00
786
2
C++ Test实验(动态测试).docx
2020-12-22
C++ Test实验(静态测试).docx
2020-12-22
java实验-字符串.docx
2020-12-13
Java实验-接口.docx
2020-12-13
Java实验-多态.docx
2020-12-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人