- 博客(77)
- 收藏
- 关注
原创 go每日一题---整数转字符串
简单来说,string(i) 这种转换方式,将整数 i 视为一个Unicode代码点,并返回与该代码点对应的字符。这样,因为代码点 65 对应字符 A,所以输出就是 A。Go语言中当使用 string(i) 将一个整数类型转换为字符串类型时,这个整数被解释为一个Unicode代码点,并且返回相应代码点的字符。所以,当你执行 string(65) 时,它就返回了字符 A。这与使用字符的ASCII值进行编码类似,因为在ASCII码表中,65 也对应字符 A。
2024-09-18 17:27:13
268
原创 kotlin的Map遍历
/ 遍历 key,再通过 key 获取 value。// for-in 遍历,遍历的是 Entry。// forEach Lambda 表达式遍历。// for-in 遍历。
2024-01-29 11:00:29
513
原创 Kotlin中的?、!!、?:、:: 、== 符号
刚学kotlin的时候,发现语法和java差不多,但是有些小符号很有意思。加在变量名后,系统在任何情况不会报它的空指针异常。!!加在变量名后,如果对象为null,那么系统一定会报异常。在执行到log打印队列长度的时候,会报空指针错误而在ktolin中在调用myList的时候在它后面加上一个问号,则会在myList为null 的时候直接打印出null(注意不是0) ,不会抛出。这样就证明了!!会对对象进行非空判断,并且会像 java 代码一样当对象为空时抛出异常。
2024-01-12 17:08:07
1242
原创 垃圾回收器CMS和G1的区别
由于第二阶段是并发执行的,一边标记垃圾对象,一边创建新对象,老对象会变成垃圾对象。所以第三阶段也会进入 Stop the World 状态,并且重新标记,标记的是第二阶段中变动过的少数对象,所以运行速度很快。CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用 G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用。这个阶段也是会耗费很多时间,但由于是并发运行的,所以对系统不会造成很大的影响。G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。
2023-12-10 23:59:04
1375
1
原创 乐观锁和悲观锁
在 Java 中,乐观锁和悲观锁是处理并发访问的两种不同策略。它们用于在多线程环境下管理和控制对共享资源的访问,以确保数据的一致性和完整性。悲观锁是一种较为保守的锁策略,它假设在数据被并发访问时会发生冲突。因此,在操作共享资源之前,悲观锁会将资源锁定,阻止其他事务对该资源进行访问或修改。在 Java 中,常见的实现悲观锁的方式包括数据库的行级锁(如使用 FOR UPDATE),以及使用 synchronized 关键字或 ReentrantLock 类等来保护共享资源,防止并发访问造成的数据不一致。
2023-12-10 23:55:53
1086
原创 线程池怎么用?---实例讲解
例如将新增用户改为查询用户信息,我们知道查询一定是要返回结果的,所以主线程需要等待线程池内的任务执行完毕,他才能继续下一项任务,在这期间主线程一直处于阻塞状态。当主线程将所有任务交给线程池后,主线程就认为新增用户这个任务完成了,去进行下一项任务。===> 不出意料的时间差是5秒左右,QueryBO中也有三个任务的返回值,说明三个查询是一起执行的。===>发现这个count并不是连续递增,说明多线程操作一个变量是不安全的,可能会被互相覆盖。1、将任务交给线程池去做,至于成不成功、需不需要返回值,不关注。
2023-12-04 09:36:37
930
原创 java线程池
在java中,我们可以利用线程做很多事情,创建多个线程来高效完成任务。线程池可以看作是线程的集合,是一种基于池化思想管理线程的工具。i<线程数量;i++){Thread thread=new Thread(任务);这样的方式确实能够并发完成任务,但是也带来了一定的问题:线程数会随着任务数的增多而增多,当任务数量非常大的时候,反复的创建和销毁线程会带来极大的内存开销,同时也会降低计算机的性能。这时我们就需要使用线程池将线程资源集中管理。
2023-12-01 09:14:49
966
原创 java并发之锁的升级
偏向锁 --> 轻量级锁 --> 重量级锁,是synchronized的三种形态转换。可能随时被CPU选中执行;需要等其他线程释放锁后来通知 重新进入就绪队列。
2023-12-01 09:14:17
427
原创 java多线程内存图
1、主方法入栈,并创建两个对象x1,x2(Thread()也在方法区,这里没有画),x1 x2new出来的两个线程对象进入方法区。主线程也创建了w1对象,并调用了他的m1方法。3、创建两个线程栈,栈中有run方法,run方法内分别创建了Person w1对象,并在堆中开辟对象空间。4、w1中调用了m2方法,m2拷贝入栈;另一个w1调用了m3方法,m3拷贝入栈。可能一个线程中的代码执行了两行后又切到了另一个线程了。4.1、m2方法中还调用了m3,m3拷贝入栈。====>这样就说明了,
2023-12-01 09:13:38
442
原创 java并发编程(二)---上下文切换
即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,线程会在分配的时间片内执行任务,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。
2023-12-01 09:12:41
502
原创 泛型和Object的区别
如果使用泛型,List<E>的E中 给他传什么类型,他就返回什么类型,可以获得对应类的属性。其实 A-Z都可以作为泛型标记符,上面只是一种约定,增强代码的可读性,方便团队间的合作开发。如果使用Object,那么返回类型也是Object类,不能获得想要类的属性。编译时自动检查类型安全,避免隐性的类型转换异常。如果这里使用Object,那么将没有办法获取query属性。不需要做强制类型转换。
2023-12-01 09:11:45
791
原创 数据库CASE函数
计算测试表达式,按从上到下的书写顺序将测试表达式的值与每个WHEN子句的简单表达式进行比较。case函数是一种多分支的函数,可以根据条件列表的值返回多个可能的结果表达式中的一个。若指定了ELSE子句,则返回ELSE子句中指定的结果表达式的值;则当指定了ELSE子句时,返回ELSE子句中指定的结果;按从上到下的书写顺序计算每个WHEN子句的布尔表达式。如果所有简单表达式的值与测试表达式的值都不相等,如果某个简单表达式的值与测试表达式的值相等,则。如果没有指定ELSE子句,则返回NULL。
2023-12-01 09:09:15
796
原创 前后端跨域问题
如下图,我们用过vs编写的前端代码在访问Springboot的端口的时候发现访问不到......浏览器处于安全考虑,使用XMLHTTPRequest对象发起HTTP请求实现遵守同源策略(即协议、域名、端口号要完全一致)。否则就是跨域的http请求,默认情况下是被进制的。前后端开发必定会产生跨域问题。
2023-12-01 09:08:40
479
原创 java元注解
如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,如 @Documented 注解;默认情况下,JavaDoc 是不包括注解的,但如果声明注解时指定了 @Documented,就会被 JavaDoc 之类的工具处理,所以注解类型信息就会被包括在生成的帮助文档中。@Repeatable注解用于声明标记的注解为可重复类型注解,可以在同一个地方多次使用。Java 8 版本以前,同一个程序元素前最多只能有一个相同类型的注解,如果需要在同一个元素前使用多个相同类型的注解,则必须使用注解“容器”。
2023-11-30 10:19:53
1116
原创 java并发编程(一)----初识
先看“科普中国”给出的官方解释。并发在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。通俗来讲,并发就是指同一时间间隔内发生两个或多个事件。且并发是在同一实体上的多个事件。并发编程可以提高计算机系统的效率和性能。那么操作系统是如何实现这种并发的呢?现在我们的操作系统无论是Windows、Linux还是MacOS其实都是多用户多任务分时操作系统,用户可以同时干多件事情。
2023-11-30 10:17:09
391
原创 java深浅拷贝
new的方式可以让每一个对象都是新创建的,他们之间互不干扰,但是new的方式在对象个数少的情况下勉强能够使用,在创建对象过多时,对系统的开销很大,所以不推荐这种方式完成。浅拷贝 只是拷贝了原对象的地址,所以原对象的任何值发生改变的时候,拷贝对象的值也会随之而发生变化。深拷贝 则是拷贝源对象的所有值而不是地址,所以即源对象的值发上变化时,拷贝对象的值也会发生变化。在java语言中,当我们需要拷贝一个对象的时候,常见的会有两种方式的拷贝:深拷贝和浅拷贝。
2023-11-30 10:16:22
383
原创 数据库设计规范
新建数据库时【字符集】选utf8mb4,【排序规则】选utf8mb4_0900_ai_ci。3、varchar类型的默认长度不要使用255,一般默认是32,或者2的指数倍。如果确定长度则写具体长度即可。例如对于字符串来说,如果有默认值查出来的是空字符串,如果没有默认值查出来就是空。2、id等数字类型的字段,不能只是bigint,应该是bigint unsigned。5、尽可能的去遵循数据库设计的三大范式,这样会让写程序变得非常舒服。4、所有字段都必须是非空的,都必须有默认值,避免程序出现空指针。
2023-11-30 10:15:23
666
原创 git的版本控制流程
dev:开发环境,从feature去mergetest:测试环境,从feature去mergepre:预生产环境,从master去merge,为了验证master代码master:生产环境,从feature去mergefeature:开发分支----小功能,创建的时候,从master拉取hotfix:bug修复分支,从master拉取。
2023-11-30 10:13:35
1585
原创 重写equals为什么要重写hashCode
----原因:像HashSet、HashMap这类 判断两对象相不相同先比较的是hashCode( ),equals比较的是query2,而hashCode比较的是query3,hashCode不相等了,所以我们的HashSet也会认为两个对象不相等。3、如果两个对象根据equals判断是不相等的,不要求返回不同的整数,但不同的整数结果对应的对象也应该是不同的。(hashCode相等的字符串一定相等?-----由于上一步判定两对象相等,而Set集合中的元素是不重复的,所以Set中只有一个元素。
2023-11-29 10:29:30
1082
原创 Node.js下载安装教程
1、百度网盘自提链接:链接:https://pan.baidu.com/s/1Bbw895MtUgjlfZylPHCCxw提取码:x89v2、进入官网下载选择对应版本,我这里选的windows64位版本。
2023-11-29 09:33:23
855
原创 一篇教会你java内存图怎么画
3.1、Person x1=new Person() ,Person x2=new Person(),Person x3=new Person()new出来的对象在方法堆中。m1()中调度m2(),m2()拷贝入栈;m2()中调度m3(),m3()拷贝入栈;6、x1调度了方法m2(),x1对象内的m2()拷贝入栈(注意是从堆那边拷贝入栈)7、接着x1调度了方法m2(),但m2()方法内调度了m3(),m3()拷贝入栈;9、接下来是T.m3(),已经运行完了也出栈,同时创建的对象x1也会被销毁;
2023-11-29 09:12:05
824
原创 nginx与vue路由
vue代理方式在不加 replace("/sign-system", "") 的时候,是将标识符追加到target后边;当加 replace("/sign-system", "") 语句后,原理则与nginx方式相同。
2023-11-29 09:01:26
741
原创 (最全整理)String类的常用方法
1、toLowerCase()、toUpperCase() 将字符串转成大写字符/将字符串转为大写字符串。4、valueOf() 基本数据类型都可以通过String.valueOf()方法转化为字符串表示形式。8、startsWith()、endsWith() 判断字符串是否以传进来的字符串开头/结尾。2、toCharArray() 将String类型的字符串转化为char字符数组。7、contains() 判断该字符串是否包含传递过来的字符串。
2023-11-28 16:24:44
1332
原创 Arrays.stream().boxed()的使用
使用:1、获取需要转换的数组2、使用Arrays.stream()将数组转换为流,且数组作为参数传递3、返回流例:将字符串转化为Stream,再转为List。
2023-11-28 16:23:32
1166
原创 魔法值问题
魔法值,也叫做魔法数值、魔法数字,通常是指在代码编写时莫名出现的数字,无法直接判断数值代表的含义,必须通过联系代码上下文分析才可以明白,严重降低了代码的可读性。除数字之外,代码中作为key值的常量字符串也被认为是魔法值,尽管其表示含义比数值较为清晰,但是仍然会产生不规范问题。//例如...这个3在运行的时候不会报错,但在代码阅读时很难判断他所代表的含义在当前类中使用或在方法内部使用的值, 可以通过定义静态常量的方式来避免魔法值的出现。接口中定义,继承这个接口的实现类都可以使用这些常量。
2023-11-28 16:22:51
723
原创 【Maven】 must be “pom“ but is “jar“ 报错
jar,并且一股脑的将这句话复制到了子项目中。子项目去除 jar父项目改为 pom
2023-11-27 15:00:45
1905
原创 java基础--枚举enum
枚举,顾名思义就是一个个的列出来,和类以及接口是同一个级别的类型,本质就是类(final类)。它用于声明一组命名的常数的集合,当一个变量有几种可能的取值时,可以将它定义为枚举类型。Java中由关键字enum来定义一个枚举类型。这个枚举定义了两个常量,分别是ENABLE和DISABLE,表示当状态值code为0时所对应的状态名name是开启,当状态值code为1时所对应的状态名name是关闭。@GetterENABLE(0, "开启"),DISABLE(1, "关闭");/*** 状态值*/
2023-11-27 11:53:08
405
原创 java Stream流操作
java8新增Stream,配合同版出现的Lambda,为集合(Collection)操作提供了极大的便利。Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。Strem可以由数组或集合创建,对流的操作由中间操作和终端操作两种。中间操作是在数据源上进行的转换操作,每次操作都会返回一个新的Stream实例,以便继续进行操作。终端操作是指对Stream进行最终操作的操作,如收集、计算或迭代等。
2023-11-27 11:47:06
470
原创 java三大集合类--List
原因:每当删除一个元素,下一个元素就会向前顶一个位置,会使原本index为1的元素变为为0,且 i 在执行后会自增,导致一半元素无法删除。但是如果想再向list1中添加元素时会报错,原因是上述写法执行时JVM会自动申请两块(只有两块)连续的内存空间,再add会报错。在第index个位置添加新的值e,原来这个位置及其后面的元素都向后移一位。删除第index数,返回的是被删除的那个数;当List内元素确定时,这样写性能较高,没有扩容操作。2、接口可以被多个类实现吗?1、接口可以被继承吗?
2023-11-27 09:09:17
718
原创 阿里巴巴java代码规范
1、不允许任何魔法值(即未经定义的常量)直接出现在代码中。反例:String key = "Id#taobao_" + tradeId;2、long 或者 Long 初始赋值时,使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解。注意 Long a = 2l 中难以分清数字是是 21 还是Long型的 2。3、【推荐】不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。正例:缓存相关常量放在类 CacheConsts 下;
2023-11-27 09:08:06
1082
原创 数据库三大范式
在关系模式R(U)中,如果X→Y,Y→Z,且 X 不包含 Y,Y 不确定 X,Y不包含Z,则称 Z 对X传递函数依赖。设有关系模式U(A,B,C,D,E),存在函数依赖关系:F={ A→C, BC→D, CD→A, AB→E}。在第二范式的基础上,每个非主属性既不传递依赖于码,也不部分依赖于码。:在关系模式R(U)中,如果X→Y,并且存在X的一个真子集X0,使得X0不能决定Y,则称Y对X完全函数依赖。:在关系模式R(U)中,如果X→Y,并且存在X的一个真子集X0,使得X0→Y,则称Y对X部分函数依赖。
2023-11-27 09:06:32
359
原创 Mysql索引详解
如果数据量过大,没有索引就需要扫描全表挨个匹配 速度会非常慢,这时就该用到索引了。通过索引表找到该行数据对应的物理地址然后访问相应的数据。索引的出现其实就是为了数据查询的,就像书的一样。事实上,索引是一种数据结构,用于帮助我们在中到我们想要查找的数据。但对于海量数据来说,它的目录也是很大的,不可能全部存储在内存中,因此索引往往是存储在的文件中(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。
2023-11-12 16:12:02
548
1
原创 锁池、等待池、notify到底是什么
当执行该对象的notify()方法时,随机将等待池中的一个线程移到锁池中;当执行该对象的notifyAll()方法时,将等待池中的所有线程移到锁池中。:已经拥有某个对象的锁的线程调用了wait()方法,该线程将进入该对象的等待池去,等待池中的线程不竞争该对象的锁。:某个线程已经拥有了某个对象的锁,其他想要获取该对象的锁的线程就会进入该对象的锁池中;wait 和 nodify 需要监视对其调用的 Object。java中,每个对象都有两个池,锁池中的线程可以竞争该对象的锁。上述内容中我们知道,
2023-11-08 16:35:26
478
2
原创 对线程join()方法的理解
实例化ThreadTest 线程对象, 它在holdThreadLock()方法中,通过 synchronized (thread),获取线程对象t的锁,并Sleep(9000)后释放,这就意味着,即使main方法t.join(1000),等待一秒钟,它也必须等待ThreadTest 线程释放t锁后才能进入wait方法中,它实际等待时间是9000ms~10000ms。=====>说明当主线程调用t.joni(1000)时,主线程等待t线程1秒钟。==========原因同上================
2023-11-08 16:31:40
376
1
原创 xxljob 配置 基本使用
xxljob的doc文件下的db文件中包含sql文件,复制到navicat执行。可以使用 if else 对参数判空,实现对特定人群推送定时任务。对应的日志在xxljob的调度日志界面,操作->执行日志;在xxljob任务管理界面选择新增任务。注意:避免使用@Slf4j 来输出日志。弹框 -> 保存 -> 执行成功。(启动文件内容,注意路径)
2023-11-07 20:31:52
570
原创 Redis list 阻塞队列 规定时间内获取
lrange key start stop (获取全部可以写0,-1)llen keylpop keyrpop key。
2023-11-07 16:49:02
168
原创 Redis 用Hash实现简单购物车
使用 hsetnx key file value 命令可以让一种商品只加载一次,有这个信息就不能set,没有才可以set。当多个人同时买同一个商品,那么商品信息info就会重复加载,所以可以将商品信息(即上边的 file2 单拎出来存储)当前仅仅是将数据存储到了redis中,并没有起到加速的作用,商品信息还需要二次查询数据库。file 和 value 作为 key 对应的 hash;用户所买商品的编号 作为 field;hash 可以计算总量,清空,浏览。不同的用户的购物车是各用各的;
2023-11-07 16:08:47
286
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人