- 博客(38)
- 收藏
- 关注
原创 阶段性检测实战项目----文件搜索引擎
仿照 everthing 设计文件搜索引擎,相对于 everthing 支持跨平台的使用,这是因为Java是跨平台的。
2022-08-27 22:23:15
495
原创 数据结构---哈希表基本操作浅记
哈希表就是借鉴了数组的随机访问能力,利用数组的随机访问的高效性产生了哈希表哈希函数其实就是把转成大的int类型转为小的int类型 一般都是,根据数论摸一个其他类型 -- > int 因为任意的数据类型都有方法,所以可以。...
2022-08-15 16:11:42
792
原创 数据结构---BST 二分搜索树基本操作笔记
1.是一个二叉树2.每个树的左子树的所有节点 < 根节点 < 所有右子树的节点值(当前树中所有子树也遵循这个给规则)3.存储结点必须具备可以比较的能力(要么实现了Comparable接口,要么传入比较器)......
2022-08-12 18:14:49
371
原创 数据结构---七大排序之堆排序
②开始交换堆顶元素和最后一个元素的位置,然后继续①siftDown操作。①从最后一个非叶子节点,开始进行siftDown操作,化为最大堆。任意一个数组在不创建任何额外空间的基础上该怎末实现排序呢?③依次往复①和②操作,直至全部排序。......
2022-08-07 16:09:56
212
原创 牛客刷题---年会抽奖
①A抽之后,二个人B恰好抽到了带有A名字的字条,A也刚好抽到了带有B名字的字条。那这样题目的思路就梳理的比较明了了, 相对对立的系统我们可以使用递归的方式来处理。阅读题意我们首先要明白”无人获奖的概率“是怎末算出来的,这也是本题的难点。样本容量很好找,N个人去抽N个不同的字条,抽一个盒子里就少一个,所以。3. 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!这一事件是一个新的独立的系统,与前面A和B没有关系。②A抽之后,二个人B没有抽到了带有A名字的字条。这种情况下,相当于A后面的N-1个人。..
2022-08-04 21:05:00
321
原创 闭关修炼---网络原理之IP协议
子网掩码跟IP地址的长度相等(IPv4位32位,IPv6为128位),对于IPv4来说,子网掩码也是用点分四组十进制来表示的。是由一台主机或路由器使用的分配位,用以确定如何从一台主机对应的IP地址中获得网络和子网信息,更通俗点说,通过它可以确定一个IP地址的网络/子网部分的结束和主机部分的开始。IP地址+网络掩码-->保留前n位(这里的n就是有多少个1的意思)为网络号,剩下的是主机号。是网络号,那么主机号就有2^24个,这样算下来,将近两千万台主机,试问哪个公司由两千万台主机?.........
2022-07-26 18:43:02
358
6
原创 从零开始JAVA---String类详解
被final修饰就意味着不能被继承,String就不存在子类,这样的就能保证没有覆写,无论哪个人使用的String都是相同的,就可以保证String类下的方法都是相同的。举个例就是A使用的String.equals和B使用的String.equals完全相同。你的这个类不希望有别的版本,到此为止。所有使用者用的这个类完全相同,没有别的实现。什么叫字面量哪?字面量可以简单的理解为直接写出来的数值。比如10就是int类型的字面量;10.1是double类型的字面量;。...............
2022-07-25 17:15:58
412
1
原创 闭关修炼---网络原理之TCP协议
同里,有ASN的存在,重复收到ACK也没关系。因为TCP协议即需要扮演了发送者(sendSegment)的角色,同时还需要扮演接收者(acknowledgesegment)的角色,为了TCP身兼两种不同的角色,在TCP设计之初就有一个。应用层使用TCP进行数据发送,本次发送成功,代表数据放在本机TCP的发送缓冲区中,数据有没有发出去还不一定。1.作为一台主机上的TCP,需要内部针对每一条TCP的通信链路,维护一组数据他们至少由ISN、当前SN、当前ASN、发送缓冲区、接收缓冲区、五元组信息构成。......
2022-07-20 18:29:16
688
8
原创 多线程---CAS
比较交换,不会真正阻塞线程,不断尝试更新。(乐观锁的一种实现方式)假设当前主内存中的值为V,工作内存中的值为A,当前线程要修改的值为B。
2022-07-15 16:49:43
235
原创 多线程---wait()和notify()方法
notify 方法是唤醒等待的线程. notify方法只是唤醒某一个等待线程. 使用notifyAll方法可以一次唤醒所有的等待线程.对于wait和notify方法,其实有一个阻塞队列也有一个等待队列。阻塞队列表示:同一时间只有一个线程能获取到锁, 其他线程进入阻塞队列等待队列表示:调用wait(首先此线程要获取到锁,进入等待队列,释放锁)1.t1拿到lock🔒,其中 t3,t2 就进入了阻塞队列。2.当调用 wait 方法,调用 wait 方法会释放🔒锁,则 t3,t2 就会竞争锁,而 t1..
2022-06-28 23:12:44
1270
1
原创 多线程---synchronized和volatile关键字
synchronized--监视器锁monitor lock(对象锁) :某个线程获取到对象的锁时,其他线程若也要获耳同一个对象的锁,就会处在阻塞等待状态。正因为increase方法上锁处理,多个线程在执行increase方法时其实是排队进入,同一时刻只可能有一个线程进入increase方法执行对count属性的操作。其中,当所释放之后,别的多个线程抢占资源时并不遵循FIFO队列的先来后到的特点,时由操作系统线程重新调度,之后的线程重新竞争。需要特别理解的是synchronized上锁🔒的对象是:.
2022-06-26 17:15:41
168
原创 多线程---安全性问题
线程安全是指:代码并行执行的结果和串行执行的结果完全一致,就称为该代码是线程安全的,若多个线程串行执行的结果和并行执行的结果不同,这就称为线程不安全。创建两个子线程,分别开启,执行循环。我们预期的结果是count输出10000,但是实际结果明显不相符, 这就造成了并行执行的结果和单线程串行执行的结果不一致,显然这样的多线程是不安全的。 想要深入了解多线程的安全问题,首先需要了解JMM(JAVA Memory Model),也就是java的内存模型:描述多线程场景下java的线程内存(CPU的寄存器
2022-06-26 17:14:24
244
原创 从零开始JAVA---Lambda表达式
时间回到2008年,JDK8发布,大数据时代的来临,带来了函数式编程思想 --> Scala。同时JDK新增了一些东西,比如:1.带来了Lambda表达式:简化Java这种面向对象的定义繁琐,在处理各种数学运算时,频繁需要定义类,对象,方法之类的操作。2.出现了default普通方法:它出现的目的是为了修正JDK上古版本接口中拓展方法使用的,不常用。3.出现了函数式接口:一个接口有且只有一个抽象方法,这种解口称之为函数式接口。可以使用 @FunctionalInterface 注解 检查当前接口是否只包含一
2022-06-16 16:00:02
151
原创 从零开始JAVA---内部类
就是将一个类嵌套在一个类的内部,就把内部类当作类中一个普通的属性来看待。内部类的设计也是一种封装的思想,体现了保护性和易用性。 1.内部类和外部类可以方便的访问彼此的私有域(属性和方法)2.内部类可以对外部类的外部完全隐藏(把内部类就当做外部类的属性来看待)3.内部类可以变相实现多继承(实际开发中用的不多,了解即可)。~成员内部类~静态内部类~方法内部类~匿名内部类在外部类的内部不使用静态关键字定义的内部类就是成员内部类,类比成员属性和成员方法。成员内部类需要依赖外部类对象,现有外部类,才有内部类对象
2022-06-14 17:48:46
316
原创 初识MySQL--事务
a.并发是在单核的情况下,CPU根本不可能真正同时进行多个的线程,CPU只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态。 b.并发是当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行。 小A和小B在qq上聊天1.读未提交∶处在该隔离级别的事务可以看到其他还没提交事务对数据库的修改~~RU⒉读已提交:处在该隔离级别的事务可以看到其他已经提交事务对数据库的修改~~RC - Oracle数据
2022-06-11 16:04:06
132
原创 初识MySQL--索引
索引和事务应用在比较复杂的场景和比较庞大的数据量索引是一种特殊的文件,包含数据库中所有记录的引用,类似于数组的引用下标,通过这个下标就能拿到数组中的数据。和数组中下标一样,通过下标寻找数组数据很快的,通过索引去查找数据库中的数据也是很快的。M有SQL数据库是插件式的设计。每种索引再不同的存储引擎中的实现都有可能不同 提问:为什么需要索引?为了提高查询数据的效率,但是会拖慢增、删、改的效率。创建索引也许有时间和空间的开销。索引和书的目录作用是一样的,根据书本的目录去查找特定的内容,要远比胡乱翻找快得多。exp
2022-06-09 19:00:00
162
原创 LeetCode动态图解---面试题 17.14. 最小K个数
面试题 17.14. 最小K个数设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。最常规也是最容易想到的思路就是,先对数组进行排序,再遍历输出前四个元素即可。 public int[] smallestK(int[] arr, int k) { Arrays.sort(arr); int[] ret = new int[k]; for (int i = 0; i < k; i++) { ret
2022-05-19 21:53:11
257
原创 初始数据结构---堆操作
优先级队列(堆):PriorityQueue按照优先级大小动态出队(动态指的是元素个数动态变化,不是固定的)普通队列:FIFO按照元素的入队循序出队,先入先出。优先级队列(堆):PriorityQueue 入队和出队时间复杂度都是O(logn)特点:1.普通二叉树要存储空节点,会浪费大量的数组空间。只有完全二叉树适合使用数组这种结构存储,不用存储空节点,其他的二叉树都要用链式结构。2.节点值。堆中节点值 >= 子树节点中的值(最大堆,大根堆)堆中
2022-05-18 16:44:42
307
原创 LeetCode动态图解---155. 最小栈
题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/min-stack思路:核心.
2022-05-10 15:23:38
188
原创 LeetCode动态图解---20. 有效的括号
题目给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。思路;当输入的字符串是左括号,就进行压栈操作,当输入的右括号时,这个时候就进行出栈操作,然后和右括号匹配,不匹配直接返回 flase,匹配成功再进行压栈出栈操作,进行一轮的匹配。栈中只存储左括号,栈顶一直是最新的左括号。当扫描整个字符串仍然没有找到不匹配的括号时,且当前栈为空,就说明了字符串是一个
2022-05-10 00:31:46
105
原创 从零开始JAVA---多态
写在前面想要理解JAVA中多态思想就必须先要搞清楚什么是:重写 (overide)对比记忆学习方法重载(overload):发生在同一个类中,定义了若干个方法名称相同,参数列表不同的一组方法。方法重写(overide):发生在有继承关系的类之间,子类定义了和父类除了权限不同,其他全都相同的方法,这样的一组方法称之为方法重写。多态是建立在继承机制上的一种机制,具体点来说就是某个行为,当由不同的人去作时会产生出不同的效果。这就好比一台性能超强的Mac pro在大佬手里是一台能搞在极.
2022-05-03 17:04:42
530
原创 从零开始JAVA---继承和Super关键字
继承:当一个类继承了另一个类,另外一个类中所有的属性和方法子类就天然具备了。JAVA中使用extends表示类的继承。public class Animal { public String name; public void eat(String food) { System.out.println(this.name + "正在吃" + food); }}public class Dog extends Animal{}publ..
2022-04-27 11:21:14
519
原创 LeetCode动态图解---876. 链表的中间结点
题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。方法一:思路:设长度为N,N / 2例如,5 / 2 = 2 -->从头结点开始走两步到中间点6 / 2 = 3 -->从头结点开始走三步到中间点无论链表是奇数还是偶数,只要拿到链表长度,从head开始开始走N / 2 步恰好走到中间节点。代码:public ListNode middleNode(ListNode head) {
2022-04-25 18:07:41
588
原创 LeetCode动态图解---206. 反转链表
题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。思路:①不断遍历链表,将链表中的元素添加到新的链表中去。②可以用两个指针, pre 和 cur 。其中 cur 指向 head,不断遍历 cur。每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。③递归。代码:方法一:头插法public ListNode reverseList(ListNode head) { ListNode dum.
2022-04-25 17:26:28
165
原创 LeetCode动态图解---82. 删除排序链表中的重复元素 II
题目:给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。重复节点一个也不留!!!思路:对于单链表来说,都是通过前驱节点来删除,但是有一个问题就是这个前驱节点删不掉,所以想要删掉前驱节点就需要注意的是 前驱节点 prev 一定不能指向待删除的节点!所以就这个题而言,就需要引用三个节点,用 cur.val == next.val 判断元素是否重复。在此的基础上引入一个虚拟头节点来简化代码。1.当 cur.val !=
2022-04-25 16:30:21
812
原创 LeetCode动态图解---83. 删除排序链表中的重复元素
题目:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。思路:
2022-04-25 15:30:02
626
原创 LeetCode动态图解---面试题 02.04. 分割链表
题目:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区中各节点的初始相对位置。思路:创建两个新的子链表,其中它们的节点由原链表构成。一个链表存放所有大于val的值,零、另一个链表存放所有小于val的值,小于val 的节点的尾节点拼接大于val的链表的头节点即可。动态图解: public ListNode partition(ListNode hea
2022-04-24 20:47:35
289
原创 LeetCode动态图解---21. 合并两个有序链表
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。思路:新的链表没有创建新的节点,只是把原来的两个链表合并成新链表,空间复杂度为O(1)。1.首先当 list1 和 list2 都不为空时,遍历这两个链表,若 list1.val <= list2.val,就把当前的 list1 链表拼接到新链表的尾部,list1 继续向后移动若list1.val > list2.val,就把当前的 Iist2 链表拼接到新链表的尾部,I.
2022-04-24 20:40:22
322
原创 LeetCode动态图解---203.移除链表元素
题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。思路:①单链表中只有头节点没有前驱,投机欸但需要额外处理;若头节点就是待删除节点,就是用while判断,这里是因为删除后的新的头节点还有可能是待删除的节点。这里还有一个要注意的点,while循环的判断条件不能 (head.val == val && head != null),因为循环中的 head.val == val 可能为
2022-04-23 15:07:23
591
原创 从零开始JAVA---单链表增删改查
单向链表没个节点只保存了下一个节点的地址,只能从头节点开始向后遍历。创建一个单链表/** * 基于int的单链表 - 火车 * 真正被用户使用的是火车类-单链表对象 **/public class SingleLinedList { // 链表的头节点 private Node head = null; // 当前链表中Node节点的个数 = 有效数值的个数 private int size = 0; /** * 单链表..
2022-04-21 16:05:13
1079
原创 从零开始JAVA---线性表增删改查
所谓的线性表,就是多个相同数据类型元素逻辑上呈直线排列,逻辑上连续。我们把这种结构称为线性表。常见的线性表有:数组(顺序表),链表,栈,队列,字符串...(字符串本质是字符串数组 )增加1.add(int val):向当前动态数组中添加元素 --> 添加到数组末尾。import java.util.Arrays;public class MyArray { // data数组的长度可以由用户来指定。 private int[] data; priva
2022-04-19 17:30:00
948
原创 从零开始JAVA---静态代码块知识点
静态代码块:定义在类中,使用static修饰的代码块,在类加载时只执行一次,无论在类的那个位置。与对象无关,不论产生多少对象静态代码块只在类加载时执行一次。public class Test{ public static void main(String[] args) { System.out.println("=====进入主方法====="); Person person = new Person("七七"); }}class Person..
2022-04-17 19:04:11
539
原创 从零开始JAVA---构造方法和This关键字
构造方法构造方法的作用就是产生对象。构造方法是类中非常特殊的一类方法,使用关键字new实例化对象时实际上就调用的是该类的构造方法public class Test{ public static void main(String[] args) { Person person = new Person(); }}class Person { private String name; private int age; public Per
2022-04-16 15:44:41
540
原创 从零开始JAVA---Static关键字
static1.修饰属性,类方法,类变量2.修饰方法,类方法,工具方法3.static 修饰代代码块,静态代码块4.static 修饰内部类,静态内部类public class Test { public static void main(String[] args) { Person person1 = new Person(); person1.country = "漂亮国"; System.out.println(perso
2022-04-15 16:08:01
227
原创 从零开始JAVA---数组
数组①一种数据结构---顺序表。②是引用数据类型③一次定义多个相同数据类型的变量,这种数据结构叫做数组。数组初始化①动态初始化:(在创建数组时,如果没有使用{}初始化每个元素的值,每个元素都是该数据类型的默认值)数据类型[] 数组名称 = new 数据类型[]{初始化数据}数据类型[] 数组名称 = new 数据类型[数组大小]②静态初始化:(语法糖。经过 JAVAC 编译之后,就是动态初始化)语法糖:只存在编译期之前,数据类型[] 数组名称 = {初始化数据
2022-04-14 10:25:19
1023
1
原创 编程世界--冒泡算法浅析
核心思想:假设有数组有n个元素,每进行一次遍历,就将最大值放到数组末尾,每一次遍历就有一个数的位置不再改变。原理:①比较相邻的两个元素。如果第一个比第二个大则交换他们的位置。②从数组的开始一直到末尾,依次对每一对相邻元素都进行比较。这样,值最大的元素就通过交换到了数组的末尾,完成第一轮遍历排序。③重复上一步,继续从数组开头依次对相邻元素进行比较。已经到末尾元素不用比较。④继续从数组开始进行比较,每轮比较会有一个元素的位置不在改变。每轮需要比较的元素个数会递减,一直到没有任何一对元素需..
2022-04-10 23:28:48
333
原创 编程世界---汉诺塔算法浅析
汉诺塔问题:有三个柱子------A,B,C, 有n个盘子在A柱子上,要求按大小顺序重新摆放在C柱子上,规定在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。分析:n = 1第1次 1号盘 A---->C sum = 1 次n = 2第1次 1号盘 A---->B第2次2号盘 A---->C第3次 1号盘 B---->C sum = 3 次n = 3第1次 1号盘 A---->C第2次 2号盘 A---->B ...
2022-04-10 22:55:21
330
原创 从零开始JAVA---数据类型
八大基本类型数据类型 关键字 包装类 内存占用 范围 字节型 byte Byte 1字节 -128 ~ 127 短整型 short Short 2字节 -32768 ~ 32767 整型 int Integer 4字节 -2^31~2^31-1 长整型 long Long 8字节 -2^63~2^63-1 单精度浮点数 float Float..
2022-04-03 21:36:24
564
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人