
Java
文章平均质量分 63
分享Java知识
CodeJames
重庆大学研究生毕业,从事IOT后台开发,同名G.Z.H
展开
-
如何使用ElasticSearch存储和查询数据
在大多数的场景里,存储数据都是用MySQL这类关系型数据库,这类数据库的特点是数据存储安全性和一致性高,可以用于事务操作,但是随着数据量的增加,查询的速度也会随之降低,并且其扩展能力有限,因此在日志记录和查询等场景下,MySQL就显得力不从心,为了解决对海量数据的搜索、分析和计算,引入ES(ElasticSearch)搜索引擎。在save方法中共有两个入参,第一个参数就是自己想存储的数据,里面的字段根据业务自定义,第二参数就是定义一个在es中的索引,其索引就像MySQL中的表名字。原创 2023-08-06 09:33:17 · 2012 阅读 · 0 评论 -
前端和后端代码部署及路由配置
1. 引言目前的后台系统都是前后端分离的项目,前端开发者关注页面的编排、后端开发者专注于API逻辑开发。开发流程为:各自开发后好,后端服务先部署到云端,前端在本地进行接口调试,调试好后发布到服务器。两者都部署后,在前端获取到的数据包括两部分,其一是开发的、其二是。那前端在调用的时候是如何去区分是拿静态文件还是接口数据呢?2. 项目部署和路由配置。原创 2023-07-01 23:45:54 · 857 阅读 · 0 评论 -
如何顺序处理设备上报的数据
其中较为重要的一步是注册消息监听器,在该方法中,使用了顺序消费,即在队列里面的消息会根据存储的先后顺序推送给消费者,进行消费。需要注意的是,在RocketMQ中,同一消息队列上的消息是有序的,但不同消息队列之间的消息是无序的。为保证状态推送的有效性,需要指定消息的关键字,其中设备ID是唯一标识设备,因此同一个设备上报的状态就被同一个队列中,这样就能保持统一设备的状态是有序的。在消息生产的时候保持了有序性,为了实现消息消费的有序性,消费消息时需要严格按照接收—处理—应答的语义处理消息。原创 2023-05-24 23:44:27 · 777 阅读 · 0 评论 -
[实例讲解]计算机处理任务的方法和原理--线程
在介绍线程之前,我们先介绍一下计算机中的任务执行:首先任务需放在内存,当得到调度的时候就需要分配`CPU`时间,有了`CPU`支持,任务才可以执行。常见的执行方式有两种:当我们采用一种串行的方式去执行任务,即`CPU`处理好当下的任务,才会去处理下一个任务,这样的执行时间就是每个任务时间的总和;当在性能要求较高的场景下,我们会采用一种并发的方式去执行任务,在每个线程执行任务时,会获得`CPU`时间片,在这一点时间内可以处理当前任务。在并发的方式中,每个任务都能通过一定的方式获取到一部份`CPU`时间。这样宏原创 2023-01-07 21:40:13 · 765 阅读 · 0 评论 -
物联网-异步控制多个设备
在这个万物互联的时代了,物联网设备起到了关键性的作用,那我们怎么去联动一个个物联网设备。比如一个家庭,里面有很多的设备,比如洗衣机,加湿器、空调、除湿机、灯光等等这些智能设备。假如在一个场景中存在多个空调、多个除湿机,人们在米家`APP`或者语言进行一键控制的时候,云端是如何去控制设备呢? 当然在云端会存在很多设备的控制指令,但是控制服务暴露的地址只有一个,如果我们只采用简单的遍历去控制设备,那整体的控制时间是每个设备控制的总和。如果网络稍微延迟,就会导致用户体验差。那为了避免这样原创 2022-12-11 13:53:58 · 1327 阅读 · 0 评论 -
获取某月有多少天
今天在开发的过程中,有个地方需要对传来的天数进行判断,是否是某个月的最大的值。当我还在伸出左手边的拳头数那个月是31天,哪些是30天的时候,突然发现。通过传入的月份,可以对应到当月的最大天数,并且可以判断是否是闰年来确定2月是29天还是28天。这个方法, 自认为这个代码写的很精致。来看看它是怎么实现的?原创 2022-11-14 21:41:33 · 3448 阅读 · 0 评论 -
实际开发中,还在用Date?现在都是LocalDateTime
在和前端交互的过程中,常常需要和时间打交到,比如前端传入一个开机时间,云端定时后将控制设备开机;或者传入的时间和数据库里的时间进行比较,或者和当前的时间进行比较,或者转为时间戳等等。接下来就来梳理一下在实际工作中常见的时间操作。随着jdk的发展,对于时间的操作已经摒弃了之前的Date等方法,而是采用了LocalDateTime方法,因为LocalDateTime是线程安全的。原创 2022-11-12 15:06:46 · 726 阅读 · 0 评论 -
如丝般添加缓存来优化服务
在一个项目在使用的过程中,随着数据或者用户的增多,慢慢就会了出现老化;当请求个别接口就出现了返回缓慢的情景,严重影响了用户的使用体验,随之就需要对服务进行优化升级。优化不是我们重新去编写这个项目,而是用一些中间件去优化,常见的就是去缓存啦,因为很多时候我们的项目的瓶颈不是CPU等这些硬件,而是IO操作,因此对IO优化后会很好地提高项目能力。...原创 2022-06-06 20:47:04 · 333 阅读 · 0 评论 -
XML和Object的转换
XML和Object之间的转换原创 2022-06-01 19:10:35 · 2246 阅读 · 0 评论 -
如何在后端去访问第三方API
如何在后端去访问第三方给的API 在后端开发中,我们除了编写供前端调用的接口外,有时我们在后端也会去调用第三方接口实现业务处理,那我们如何去调用第三方接口呢? 我们都知道http包含头部和body,因此我们需要去模仿构造一个header和body,那在开发中有什么快捷的方式实现嘛?首先构造http头部HttpHeaders httpHeaders = new HttpHeaders(); 其中HttpHeaders()属于Spring框架—import org.spring原创 2022-05-25 21:27:13 · 2892 阅读 · 2 评论 -
2022年主要的编程语言及应用
如图一所示,展示了2022年编程语言的排行榜,有很多我们熟知的,也有很多不太清楚的语言,接下来就以我的理解来说一下各类主流语言的主要用途。原创 2022-04-19 22:53:33 · 3102 阅读 · 0 评论 -
怎样理解认证与授权
认证与授权是web开发中绕不开的话题,任何开发的系统都需要对用户身份信息进行认证和授权,那什么是认证和授权呢?原创 2022-04-10 16:14:04 · 4615 阅读 · 0 评论 -
再谈OAuth授权
再谈OAuth授权工作场景流程大家都知道OAuth是用于第三方授权的,当你用其他的APP想访问微信账号的昵称、粉丝、联系人等信息,这里就需要微信进行授权,此时在APP的网页端是可以发现有微信登录的,点开会出现弹框,在弹框中输入用户名和密码,此时即同意授权,会直接到微信授权服务端获取授权码Code,接着通过302重定向到redirect,并且把生成的code加入到redirect的后面,此时链接会访问到APP的服务端,此时APP服务器会利用截取到的code到微信的授权服务器,对code进行验证,验证通过就原创 2021-09-23 20:40:04 · 233 阅读 · 0 评论 -
Manacher算法
背景Manacher使用来求取字符串中最长的回文半径的。三大要素回文半径回文右边界回文边界中心思想常见的方法是:从左到右进行暴力扩,即求每个值向两边扩的半径。manacher算法利用了一个回文半径数组来进行加速,通过利用前面每个值的回文半径来指导后面的值的半径,从未达到加速的目的。在Manacher中有两种情况定义变量:i:此时遍历值下标,R回文右边界,C回文中心,L关于回文中心对称的左边界,l是i关于回文中心对称的下标。第一种情况:i 在R外面,此时暴力扩第二种情况:i 在R原创 2021-04-21 17:00:15 · 131 阅读 · 0 评论 -
HashMap底层源码分析-手动注释
HashMap是一种K-V映射的一种数据结构,通过K(key)值能实现在O(1)的时间复杂度下找到对应的V(value)。JDK1.8之前,HashMap的底层数据结构是数组+链表,数组中的每个元素称为一个Entry,包含(hash,key,value,next)这四个元素,其中链表是用来解决碰撞(冲突)的,如果hash值相同即对应于数组中同一一个下标,此时会利用链表将元素插入链表的尾部,(JDK1.8是头插法)。在JDK1.8及之后,底层的数据结构是:数组+(链表,红黑树)原创 2021-01-31 20:28:45 · 126 阅读 · 0 评论 -
ArrayQueue底层源码分析
public class ArrayQueue<T> extends AbstractList<T>{ //定义必要的属性,容量、数组、头指针、尾指针 private int capacity; private int T[] queue; private int head; private int tail; //进行初始化,注意容量和数组的大小都需要+1;head和tail全都初始化为零 public ArrayQueue(原创 2021-01-25 09:47:36 · 267 阅读 · 2 评论 -
如何将代码上传到github-常见命令
代码上传到githubgit initgit add 文件名git commit -m "日志"ssh-keygen -t rsa -C "邮箱账号" //build ssh key, generally cache Cgit remote add origin 仓库名.git //connection remote repogit push -u origin master // uploadgit pull origin master // download...原创 2021-01-04 22:18:20 · 130 阅读 · 1 评论 -
Redis思维导图知识点整理
1. 采用了Xmind思维导图的方式,对Redis的主要知识点进行了整理2. Java中的反射原创 2020-07-05 20:22:10 · 1010 阅读 · 0 评论 -
再来一篇深度优先遍历/搜索总结?
再来一篇深度优先遍历/搜索总结?简介:深度优先搜索算法(Depth-First-Search, DFS),最初是一种用于遍历或搜索树和图的算法,在LeetCode中很常见,虽然感觉不难,但是理解起来还是有点难度的。简要概括,深度优先的主要思想就是“不撞南墙不回头”,“一条路走到黑”,如果遇到“墙”或者“无路可走”时再去走下一条路。思路假如对树进行遍历,沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当达到边际时回溯上一个节点再进行搜索。如下图的一个二叉树。首先给出这个二叉树的深度优先遍历的结果原创 2020-05-22 21:02:42 · 402 阅读 · 0 评论 -
微人事-持久层
摘要最近将微人事这个开源项目进行了复现,这篇文章记录mybaits访问数据库这一块。其中MyBatis是一个流行的持久层框架,支持自定义SQL、存储过程和高级映射。MyBatis消除了几乎所有的JDBC代码、手动设置参数和检索结果。MyBatis可以使用简单的XML或注释进行配置,实现对数据库的访问。项目结构其中mapper是持久层,model是实体类,service是逻辑层,web是...原创 2020-04-30 21:45:38 · 770 阅读 · 0 评论 -
20200218
程序员面试经典判定字符是否唯一题目 :实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = “leetcode”输出: false示例 2:输入: s = “abc”输出: true思路:字符全都不同,可以想到的是集合可以保证字符的唯一性。最后判断集合的字符串长度和给定的字符串长度是否相等。codepublic boolean isUnique(...原创 2020-02-18 10:21:37 · 172 阅读 · 0 评论 -
20200217
判定字符是否唯一题目 :实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = “leetcode”输出: false示例 2:输入: s = “abc”输出: true思路:字符全都不同,可以想到的是集合可以保证字符的唯一性。最后判断集合的字符串长度和给定的字符串长度是否相等。codepublic boolean isUnique(String a...原创 2020-02-17 10:23:51 · 319 阅读 · 1 评论 -
200216
判定字符是否唯一题目 :实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = “leetcode”输出: false示例 2:输入: s = “abc”输出: true思路:字符全都不同,可以想到的是集合可以保证字符的唯一性。最后判断集合的字符串长度和给定的字符串长度是否相等。codepublic boolean isUnique(String a...原创 2020-02-16 17:03:15 · 154 阅读 · 0 评论 -
数据结构-随看-栈-补
数据结构-随看-栈-补栈:先入后出, push pop。模板: Stack<Integer> s = new Stack<>(); s.push(); s.pop();最小栈设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。...原创 2020-02-14 11:16:51 · 119 阅读 · 0 评论 -
数据结构-随看-栈
数据结构-随看-栈栈:先入后出, push pop。模板: Stack<Integer> s = new Stack<>(); s.push(); s.pop();最小栈设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。t...原创 2020-02-13 12:02:17 · 138 阅读 · 0 评论 -
数据结构-随看-队列
数据结构-随看-队列队列可以使用动态数组和指向队列头部的索引:List data = new List<>();更有效的方法是使用循环队列。即使用固定大小的数组和两个指针来指示起始位置和结束位置。循环队列-实现class MyCircularQueue { private int[] data; private int head;...原创 2020-02-12 12:02:44 · 125 阅读 · 0 评论 -
搜索二维矩阵
搜索二维矩阵 ||题目 编写一个高效的算法来搜索m*n矩阵matrix中的一个目标值target,其中:每行的元素从左到右升序排列每列的元素从上到下升序排列示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26...原创 2020-02-11 10:57:30 · 614 阅读 · 0 评论 -
合并两个有序数组
合并两个有序数组给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3...原创 2020-02-11 10:56:37 · 165 阅读 · 0 评论 -
多数元素
多数元素题目 给定一个数组,找到其中的多数元素,多数元素是指在数组中出现⌊n/2⌋\lfloor n/2 \rfloor⌊n/2⌋ 次。方法一 :利用散列表,进行计数,即<数字,出现次数>, 最后遍历散列表,找到满足的数字。public int majorityElement(int[] nums){ double n = Math.ceil(nums.length / ...原创 2020-02-10 10:26:21 · 232 阅读 · 0 评论 -
只出现一次的数字
只出现一次的数字题目:给定了一个非空整数数组,除了某个元素只出现一次意外,其余每个元素均出现两次。找出那个只出现一次的元素。方法一 比较法:思路 :先对数组进行排序,然后对nums[i]和nums[i+1]进行比较,i+=2,继续下一组比较。codepublic static int singleNumber(int[] nums){ Arrays.sort(nums); ...原创 2020-02-10 10:25:15 · 147 阅读 · 1 评论 -
动态规划-三角形最小路径和
三角形最小路径和给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。思路 :先将每一行按照第一列对齐,采用自底向上的方式,定义一个*minlen[]*用于存储得到的结...原创 2020-02-09 11:10:15 · 473 阅读 · 1 评论 -
动态规划-不同的二叉搜索树
动态规划-不同的二叉搜索树题目 给定一个整数n,求以1…n为节点组成的二叉搜索树有多少种?输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2...原创 2020-02-08 13:10:25 · 169 阅读 · 0 评论 -
动态规划(不同的二叉搜索树)
动态规划(不同的二叉搜索树||)考虑 [] 的所有解null考虑 [ 1 ] 的所有解1考虑 [ 1 2 ] 的所有解 2 /1 1 \ 2考虑 [ 1 2 3 ] 的所有解 3 / 2 /1 2 / \ 1 3 3 / 1 \ 2 1 ...原创 2020-02-07 11:33:44 · 146 阅读 · 0 评论 -
动态规划(解码方法)
动态规划(解码方法)题目 :以11056为例,从后往前遍历。首先是6,很明显是1种6->F接着是56,很明显还是1种56->EF接着是056,结果为0接着是1056,结果为numDecodings(10 56) + numDecodings(1 056) = numDecodings(10 56)->JEF接着是11056,结果为numDecodings(1 105...原创 2020-02-06 11:18:56 · 373 阅读 · 0 评论 -
二叉搜索树(1038)
二叉搜索树(1038)二叉搜索树相比于其他数据结构的优势在于查找,插入的时间复杂度较低。为O(logn)。从二叉搜索树到跟大和树思路 通过遍历从最右节点开始计算,之后的每个节点都可以使用前一个节点的值 + 本身的值。代码 :class Solution{ int currVal = 0; public TreeNode bstToGst(TreeNode root){ ...原创 2020-02-05 11:03:24 · 109 阅读 · 0 评论 -
最小路径和
最小路径和题目 找出从左上角到右下角的路,使得路径上的数字总和最小。思路: 本题是典型的动态规划问题。递推公式如下:grid(i,j)=grid(i,j)+min(grid(i+1,j),grid(i,j+1))grid(i,j) = grid(i,j) + min(grid(i+1,j), grid(i,j+1))grid(i,j)=grid(i,j)+min(grid(i+1,j)...原创 2020-02-04 12:02:04 · 307 阅读 · 0 评论 -
不同路径(leetcode)
不同路径||(leetcode)题目: 物体怎样从左上角移动到右下角,其中1表示有障碍,不能行走。思路:知道整个方框的行和列。对第一行和第一列进行填充1,当碰到1(障碍)填充0。本题可以被视为一个动态规划的问题,从上到下,从左到右,其中到达一个终点的路径总是左边路径**+**上面路径。 即:dp[i][j]=dp[i−1][j]+dp[i][j−1]dp[i][j] =...原创 2020-02-03 11:12:26 · 265 阅读 · 1 评论 -
动态规划-2-1
最大子序和public int crossSum(int[] nums, int left, int righ, int p){ if(left == right) return nums[left]; int leftSubsum = Integer.MIN_VALUE; int currSum = 0; for(int i=p;i > le...原创 2020-02-01 08:54:35 · 162 阅读 · 0 评论 -
堆排序
思路,复杂度O(nlgn)把数组变成一个最大堆; 把堆顶的元素和最后一个元素对调位置; 对剩下的元素重新构建最大堆,堆顶元素和最后元素对调,循环。 //堆排序 public static void heapSort(int[] arr){ int temp = 0; System.out.println("堆排序!!!"); for...原创 2019-11-04 21:42:06 · 95 阅读 · 0 评论 -
二叉树中序线索化
n个结点的二叉树有n+1个空的指针域 思路: 先线索化左子树; 线索化当前结点;(难点)处理当前结点的前驱结点; 处理后序结点;线索化右子树;/** * * @param node 当前需要线索化的结点 */ public void threadedNodes(HeroNode node){ //如果node == null,...原创 2019-11-03 17:21:45 · 508 阅读 · 0 评论