Java
sugar high
记录学习C语言
展开
-
五子棋PVP项目总结
实现一个网页版五子棋对战程序. 支持以下核心功能:* 用户模块: 用户注册, 用户登录, 用户天梯分数记录, 用户比赛场次记录. * 匹配模块: 按照用户的天梯分数实现匹配机制. * 对战模块: 实现两个玩家在网页端进行五子棋对战的功能. ## 核心技术* Spring/SpringBoot/SpringMVC* WebSocket* MySQL* MyBatis* HTML/CSS/JS/AJAX原创 2022-10-09 16:00:25 · 649 阅读 · 1 评论 -
博客系统项目详解
1.创建maven项目2.导入写好的前端代码3.设计数据库4.封装数据库操作1)创建 DBUtil 类2)创建 Blog类3)创建 User4 )创建BlogDao类5)创建UserDao类5.实现博客主界面1)约定前后端交互接口2)编写服务器代码3)编写客户端代码6.实现博客详细界面1)约定前后端交互接口2)编写服务器代码3)编写客户端代码7.实现博客登陆页面1)约定前后端交互接口2)编写服务器代码3)编写客户端代码8.实现用户状态判定功能1)约定前后端交互接口原创 2022-09-02 16:53:32 · 2313 阅读 · 0 评论 -
JVM面试常考的4个问题详解
1.JVM内存区域划分1)程序计数器2)栈3)堆4)方法区2.类加载1)Loading环节2)Linking环节3)Intializing3.双亲委派模型1)加载java.lang.String2)加载自己写的Test类4.JVM的垃圾回收机制(GC)1)垃圾回收的概念2)回收的过程:找垃圾/判定垃圾释放垃圾3)垃圾收集器原创 2022-09-02 11:32:07 · 364 阅读 · 0 评论 -
计算机网络网络层数据链路层协议详解
计算机网络网络层IP协议IP地址NAT机制IPv6路由选择数据链路层协议MTUMSSARP报文DNS原创 2022-08-12 18:55:09 · 1652 阅读 · 0 评论 -
常见协议UDP和TCP详解
UDP报文格式TCP报文格式TCP核心机制1.确认应答2.超时重传3.连接管理(经典面试题)4.滑动窗口5.流量控制6.拥塞控制7.延时应答原创 2022-08-09 21:41:58 · 1586 阅读 · 0 评论 -
Java使用TCP api实现回显服务
关闭是为了“释放资源”,释放资源的前提是已经不需要使用这个资源了,但是对于UDP的程序和serverSocket,这些socket都是贯穿程序始终的。每次都得保证处理完的连接都进行释放。当上面的代码第一次accept结束之后,就会进入processConnection,在processConnection又会有一个循环,如果processConnection里面的循环不结束,processConnection就无法执行完成,外层就无法二次调用accept,就不能接受第二个客户端的链接了。...原创 2022-08-08 19:41:50 · 421 阅读 · 0 评论 -
Java使用UDP Socket实现回显服务
服务器定义为“被动接受请求的一方”,主动发送请求的一方叫做客户端。send方法的参数,也是DatagramPacket需要把响应数据先构造成一个DatagramPacket再进行发送,这里就不是构造一个空的数据报。在当前场景,那个客户端发来的请求,就把数据返回给那个客户端。/***/ /*站在服务器的角度:1.源IP:服务器程序本机的IP2.源端口:服务器绑定的端口号(此处手动置顶了9090)3.目的IP:包含在收到的数据报中(客户端的IP)5.协议类型:UDP。...原创 2022-08-08 17:38:44 · 556 阅读 · 0 评论 -
计算机网络中的封装和分用,五层协议
传输层负责端到端之间的通信,起点和终点只是关注结果(数据到没到),不关注过程(不关注数据走哪条路),相当于买家和卖家,快递公司则要关注中间的过程。在刚才IP数据报基础上,根据当前使用数据链路层协议,构造成一个数据链路层的数据报,典型的数据链路层的协议叫做以太网,就会构造一个“以太网数据帧”IP报头包含了很多信息,最重要的就是源IP和目的IP,相当于发件人的地址和收件人的地址。路由器和交换机实际上,真正的交换机和路由器之间的界限已经越来越模糊了,路由器的很多功能交换机也有,交换机的很多功能路由器也有。...原创 2022-08-01 21:52:55 · 2296 阅读 · 2 评论 -
使用dom4j解析XML
Dom4j重要的API说明org.dom4j.Document常用方法org.dom4j.Element的常用方法dom4j结合XPath解析XMLXpath可以使用路径表达式来选取XML文档中的元素或者属性节点,节点是沿着路径来选取的。XPath官方文档:https://zvon.org/xxl/XPathTutorial/General_chi/examples.htmldom4j集成XPath1.定义版本1.2.02.添加依...原创 2022-06-30 17:20:01 · 886 阅读 · 0 评论 -
XML的使用总结
XML(Extensible Markup Language)表示可扩展标记语言XML的标签没有被预定义也就是说不是固定的,用户可以根据自身的需求去自定义标签XML的作用主要是用来存储数据和传输数据XML的文档声明是可选的,也就是可以不写,但是开发中大家都会写文档声明XML的文档声明如果写了必须放在XML文件的第一行第一列,必须以结尾,而且必须包含两个属性:version和encoding元素是XML的重要组成部分,元素也称为标签每个XML文件必须要有一个根标签标签由开始标签和...原创 2022-06-23 17:37:37 · 1208 阅读 · 0 评论 -
Java多线程下使用哈希表
1.HashTable(不推荐)2.ConcurrentHashMap(推荐)原创 2022-06-21 11:42:40 · 242 阅读 · 0 评论 -
Java中常见的锁策略
1.悲观锁和乐观锁:处理所冲突的态度(原因)2.重量级锁和轻量级锁:处理所冲突的结果3.挂起等待锁和自旋锁:4.读写锁和普通互斥锁:5.公平锁和非公平锁6.可重入锁和不可重入锁synchronized总结synchronized中的锁优化机制1.锁膨胀/锁升级2.锁粗化3.锁消除ReentrantLock可重入锁ReentrantLock和synchronized的区别Semaphore信号量CountDownLatch终点线CopyOnWriteArrayList写时拷贝...原创 2022-06-21 11:41:05 · 492 阅读 · 0 评论 -
java中的并发JUC(java.util.concurrent)
Callable具体使用:原创 2022-06-21 11:38:27 · 185 阅读 · 0 评论 -
Java中的CAS(compare and swap)
定义:用途:2)基于CAS能够实现“自旋锁”如何理解CAS中的ABA问题?一个典型的例子:解决ABA问题的方法:原创 2022-06-21 11:33:01 · 308 阅读 · 0 评论 -
JavaEE线程安全的线程池实现
为什么线程放在池子里就比从系统申请释放来得更快呢?java标准库中的线程池:线程池构造方法:线程池参数解析:一个程序要并发的/多线程的来完成一些任务,如果使用线程池的话这里线程数量多少合适?简化版的线程池线程池的组成...原创 2022-06-17 20:21:19 · 387 阅读 · 0 评论 -
JavaEE线程安全的定时器模式
Timer内部组成:原创 2022-06-17 11:51:52 · 264 阅读 · 0 评论 -
JavaEE线程安全的生产者消费者模型优点
阻塞队列生产者消费者模型原创 2022-06-16 20:59:10 · 113 阅读 · 0 评论 -
JavaEE线程安全的单例模式两种典型的实现
1.饿汉模式2.懒汉模式原创 2022-06-16 20:56:14 · 133 阅读 · 0 评论 -
Java多线程编程Thread类的使用和注意事项
Thread类的基本用法:}线程的一些指标:run和start的区别中断线程线程等待Thread.currentThread()进程状态针对系统层面:java中Thread类进一步细化:状态转换图:线程安全问题:线程不安全产生的原因:内存可见性解决方法:synchronized用法1.直接修饰普通的方法2.修饰一个代码块3.修饰一个静态方法或者监视器锁monitor lock死锁的其他场景死锁的四个必要条件(前三个都是锁本身的特点)java线程类:volatile原创 2022-06-15 20:00:57 · 442 阅读 · 0 评论 -
Java中Thread类的基本使用
Thread类的基本用法:线程的一些指标:中断线程线程等待Thread.currentThread()原创 2022-06-15 16:24:44 · 1937 阅读 · 1 评论 -
操作系统进程线程区别、并发和并行、内存和外存
3.操作系统是如何管理进程的?4.PCB中的属性5.并发和并行6.进程调度7.线程产生的原因8.线程为什么比进程更轻量?9.进程和线程的区别和联系10.内存和外存的区别原创 2022-06-04 21:50:24 · 363 阅读 · 0 评论 -
Java字符串中第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。示例 1:输入: s = “leetcode”输出: 0示例 2:输入: s = “loveleetcode”输出: 2示例 3:输入: s = “aabb”输出: -1提示:1 <= s.length <= 105s 只包含小写字母来源:力扣(LeetCode)链接:https://leetcode.cn/problems/first-unique-character-原创 2022-05-24 20:00:40 · 272 阅读 · 0 评论 -
Java常见排序算法之交换排序
public class 交换排序 { public static void swap(int[] array, int i, int j){ int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } /** * 冒泡排序: * 时间复杂度:0(n^2) 逆序情况下 * 有序情况下:0(n) * * 空间复杂度:0(n)原创 2022-05-24 12:20:44 · 484 阅读 · 0 评论 -
Java常见排序算法之计数排序
public class 计数排序 { public static void countingSort(int[] array){ int maxVal = array[0]; int minVal = array[0]; //1.找最大最小值 for (int i = 1; i < array.length; i++) { if(array[i] < minVal){原创 2022-05-24 12:21:03 · 200 阅读 · 2 评论 -
Java常见排序算法之归并排序
public class 归并排序 { /** * 合并两个有序数组 * * @param array1 * @param array2 * @return */ public static int[] mergeArray(int[] array1, int[] array2){ int[] tmp = new int[array1.length+array2.length]; int i = 0;原创 2022-05-23 20:22:02 · 173 阅读 · 0 评论 -
Java常见排序算法之插入排序
public class 插入排序 { /** *直接插入排序: *时间复杂度:O(N^2) 逆序情况 *最好情况 :0(N)在有序情况下 *对于直接插入排序来说数据越有序越快 经常用在数据不多且整体数据趋于有序的 * *空间复杂度:O(1) * * 稳定性:稳定的 * 一个稳定的排序可以实现为不稳定的排序 * 但是一个本身就不稳定的排序,是不可以变成稳定的排序 * @param arra原创 2022-05-23 20:19:19 · 163 阅读 · 0 评论 -
Java常见排序算法之选择排序
public class 选择排序 { public static void swap(int[] array, int i, int j){ int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } /** * 选择排序: *时间复杂度:O(n^2) * 空间复杂度:O(1) * 稳定性:不稳定 * @param array原创 2022-05-23 20:18:22 · 117 阅读 · 0 评论 -
Java前K个高频单词
给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。示例 1:输入: words = [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2输出: [“i”, “love”]解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。注意,按字母顺序 “i” 在 “lo原创 2022-05-23 20:14:23 · 309 阅读 · 1 评论 -
Java旧键盘
链接:https://www.nowcoder.com/questionTerminal/f88dafac00c8431fa363cd85a37c2d5e?f=discussion来源:牛客网旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。输入描述:输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空原创 2022-05-23 14:48:46 · 79 阅读 · 0 评论 -
Java宝石与石头
给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。字母区分大小写,因此 “a” 和 “A” 是不同类型的石头。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/jewels-and-stones著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。class Solution { public原创 2022-05-23 10:30:05 · 179 阅读 · 0 评论 -
Java复制带随机指针的链表
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链原创 2022-05-23 10:14:02 · 159 阅读 · 0 评论 -
Java大数据去重,返回第一个重复的数据,统计每个数据出现的次数
/** * 给定10w个数据,统计每个数据出现的次数 * @param array * @return */ //key是关键字,value是出现的次数 public static Map<Integer,Integer> func1(int[] array){ Map<Integer,Integer> map = new HashMap<>(); //判断array中的元素是否在ma原创 2022-05-23 09:43:17 · 795 阅读 · 0 评论 -
Java只出现一次的数据
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4来源:力扣(LeetCode)链接:https://leetcode.cn/problems/single-number著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。class Solution {原创 2022-05-23 09:40:44 · 187 阅读 · 0 评论 -
Java通配符
通配符:? 用于在泛型的使用,即为通配符。通配符是用来解决泛型无法协变的问题的,协变指的就是如果 Student 是 Person 的子类,那么List 也应该是 List 的子类。但是泛型是不支持。上界通配符:语法:<? extends 上界>举例:<? extends Number>//可以传入的实参类型是Number或者Number的子类特点:上界通配符实例化的类必须是当前类,或是当前类的子类接收集合中的数据的数据类型只能是当前类,或是当前类的超类原创 2022-05-22 16:41:29 · 4612 阅读 · 0 评论 -
Java写一个大根堆
public class Heap { public int[] elem; public int usedSize; public Heap(){ this.elem = new int[10]; } /** * 向下调整 * @param parent 每棵树的根节点 * @param len 每棵树调整的结束位置 */ public void shiftDown(int parent, int原创 2022-05-19 16:53:19 · 235 阅读 · 0 评论 -
Java合并两个有序数组
/** * 合并两个有序数组 * @param array1 * @param array2 * @return */ public static int[] mergeArray(int[] array1, int[] array2){ if(array1 == null){ return array2; } if(array2 == null) { r原创 2022-05-17 10:51:00 · 449 阅读 · 0 评论 -
Java最后一块石头的重量
有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,所以数组转换为原创 2022-05-07 11:15:11 · 215 阅读 · 0 评论 -
Java二叉树的最大宽度详解版
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:输入: 1 / \ 3 2 / \ \ 5 3 9 输出: 4解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。示例 2原创 2022-05-05 22:09:33 · 3099 阅读 · 0 评论 -
Java递增顺序搜索树
给你一棵二叉搜索树的 root ,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。示例 1:输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]示例 2:输入:root = [5,1,7]输出:[1,null,5,null,7]提示:树中节点数原创 2022-05-05 20:03:59 · 112 阅读 · 0 评论 -
Java二叉搜索树与链表
描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的Tr原创 2022-05-05 17:54:21 · 231 阅读 · 0 评论