- 博客(71)
- 收藏
- 关注
原创 《面试总结》
数组使用Array.sort集合使用Collection.sortsort方法底层使用归并排序,适合大型数组排序,若数组元素不多或者已经部分有序的话,执行效率不高自定义排序算法时实现一个Comparator类对象,其中定义数组元素具体排序规则,然后将Comparator对象传给sort方法。
2023-05-15 22:18:33
440
1
原创 java订单支付核心业务
spu:虚拟商品,针对某个商品进行搜索,页面展示的就是spu的信息,是一组具有共同属性的商品集,如品牌信息,其中包含多个skusku:具体商品,用户点击页面的spu进入的页面会详细显示对应的sku,spu商品集中的商品根据不同的特性而细分出的具体商品就是sku,如颜色、具体尺寸、价格,用户下单时使用的就是sku信息。
2023-05-09 22:07:27
3410
1
原创 java多线程、线程池、锁
当我们在main方法中调用这个多线程对象的run方法后,再调用多线程的设置a为false的方法,那么很有可能其实这个子线程中的a变量的值并未改变,因为主线程中调用的子线程对象修改a的方法其实只是修改了主线程的本地内存中a变量的值为false,但由于之后失去了cpu执行权,就导致这个本地内存中的a的值还没写入主内存中,主线程就已经挂了,所以子线程也就不能读取到主线程中修改后的a的值,要解决这种线程间不可见问题的话,在tomcat的xml配置文件中配置线程池的参数,可以设置的参数和java的线程池参数一致。
2023-05-07 19:22:03
312
原创 lambda表达式、stream流、方法引用、mybatis-plus中的方法引用
以使用Runnable接口开启多线程举例,使用lambda表达式可以简化代码写法。
2023-05-06 22:11:54
656
原创 mysql结构及mysql调优
在创建多列索引的时候,我们会根据业务的需求,where子句中使用最频繁的一列放在最左边,因为mysql索引查询会遵循最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。mysql中有自带的缓存,客户端在进行查询时会先去缓存中进行查询,若缓存查询到则直接返回,不会再为本次查询生成执行计划,也不会执行,默认缓存是关闭的,可以在mysql中设置这个参数或者在配置文件中设置参数。聚簇索引: 以InnoDB作为存储引擎的表,表中的数据都会有一个主键,即使不创建主键,系统也会自动创建一个隐式的主键。
2023-05-05 20:44:33
144
原创 java内存结构及jvm参数调优
其中栈内存是每个线程私有的,存放自己的局部变量,在线程创建时被创建的,堆内存存放new关键字的对象,会被jvm的垃圾回收机制管理,是共享的,本地方法栈是用于调用c或者c++的驱动代码的,方法区用于存放常量、被加载的类的信息、静态变量等,是共享的。
2023-05-02 16:43:04
349
原创 spring原理
我们会在spring配置文件中配置mybatis的MapperScannerConfigurer对象的ioc和di,di的时候我们传入的参数就是我们项目中mapper接口所在包,这个scanner实现了spring容器的一个后置接口,这个scanner会在spring容器初始化过程中会自动调用,在scanner方法中会先获取我们所有的mapper接口,并且为其生成对应的BeanDefinition对象,然后会将每个BeanDefinition对象的类型替换为mybatis的MapperFactoryBean
2023-04-19 21:30:27
192
原创 docker
当生产者发送消息给kafka后,有时候我们需要知道消息是否发送成功,所以这里可以通过带回调的生产者来实现。在项目启动时我们可以根据项目需要为项目生成对应的主题,通过编写java配置类实现。导入kafka工具类依赖。
2023-04-18 21:15:13
118
原创 用户微服务(单点登录)
自定义sql或hql语句进行查询时,我们可以用于多表查询,只需要根据查询结果编写对应的Vo实体类来接收查询结果//自定义sql,通过用户名密码查找用户 @Query("select u from User u where u.username=?2") //面向对象的查询语法,不论用什么数据库,我们只要在这里写hql,底层就生成对应的数据库的sql //把表名换成类名、数据库字段换成属性名,其中参数为?
2023-04-15 14:28:54
478
1
原创 互联网冲刺一
1.项目架构2. 项目搭建2.1 搭建父工程删除父工程中的src目录,在pom中导入maven依赖2.2 搭建common父工程2.3 搭建core工程2.4 搭建interface工程2.5 搭建admin后台管理工程2.6 ssm整合2.7 admin测试2.8 maven插件admin中的pom.xml配置jetty <build> <!--jetty插件--> <plugin>
2023-04-01 11:07:58
1012
原创 java面试
之后放行用户访问对应的接口。在访问接口时就会调用我们所编写的权限aop通知方法,这个权限通知方法中会首先判断接口上方有没有被我们自定义的权限注解所标记,若没有则说明当前接口不需要进行权限鉴定,直接进行放行,若存在则说明需要进行鉴定。在鉴定时我们会从当前线程中取出用户所拥有的全部权限标记信息,并将其与用户访问的接口上的权限鉴定注解中的内容进行对比,若包含则说明用户拥有对应权限进行放行,否则进行拦截以自定义redis工具类的自动装配为例先创建maven项目,在maven基础上编写自动装配项目。
2023-04-01 10:24:01
724
原创 java反射实现动态代理模式
java反射实现动态代理模式package com.xqy.java;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Set;//代理类和被代理类需要实现的接口interface Human{ String getBelief(); String eat(String food)
2021-01-31 16:22:12
217
原创 力扣算法题
hash相关:(1). 两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。例如:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]class Solution {public: vector<int> tw.
2020-08-21 21:53:33
2312
原创 用指针创建二维数组
//array中有rowNums个元素,每个元素都是一个int*int **array = new int*[rowNums];for(int i = 0;i < rowNums;i++){ //为array中每个int*元素分配columnNums个空间存放int型数据 array[i] = new int[columnNums];}
2020-08-08 16:53:20
406
原创 动态规划
例题1:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。动态规划解题思路:1. 建立一个数组dp与传入函数的数组nums长度相同2. dp[i]表示以nums[i]作为子序列最后一个元素时,这个子序列和的最大值3. dp[i]的取值只可能有两种情况:(1).当dp[i - 1] > 0 时,说明num
2020-08-08 16:53:14
73
原创 形参中指针需要作为结果传出函数
//函数形参中的a需要作为函数执行结果传出函数void test(int* a) { int* b = new int(2); //这里只能使用*a = *b而不能用a = b,否则函数对指针a的操作不能传出函数 *a = *b;}//函数返回值作为函数执行结果传出函数int* test(){ int* b = new int(2); return b;}int main(){ int* a = NULL; a = test();
2020-08-08 16:53:08
323
原创 LeetCode 33:判断链表是否有环
给定一个链表,判断链表中是否有环。返回1表示有环,0表示无环class Solution{public: bool hasCycle(ListNode* head) { ListNode* fast = head; ListNode* slow = head; int pos = 0; while (fast) { pos++; if (pos % 2 ==
2020-08-08 16:52:52
121
原创 LeetCode 32:链表原地逆序
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* previous= NULL; ListNode* temp = NULL; while (head) { temp = head->next; he
2020-08-08 16:52:37
383
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人