- 博客(29)
- 收藏
- 关注
原创 关于springboot服务层传递到控制层数据丢失问题
TableField("suggest_matter") //建议与意见内容。@TableField("contact_way") //联系方式。反之你的字段是这样设置那么postman就会获取不到该字段数据。我的问题关键在于实体类的字段命名导致,无其他代码逻辑错误。如果你的字段是这样设置那么postman就会显示数据。
2024-05-11 22:57:12 123 1
原创 java声明式对象和new对象的区别
总结:声明式对象只是一个该对象类型的变量或者说是引用没有真正实例化,第二段代码只是把查找到的该类型对象返回来给这个变量。new对象是直接实例化了嘛然后分配在堆上,存活时期看垃圾回收器。
2023-08-22 17:33:07 280
原创 为什么变量需要内存对齐
答:这是与内存的结构密切相关的,假设你的电脑是64位,那么CPU它一次去读取的数据就是64bit,如果你的变量名是a并且是long类型占八个字节,那么如果不字节对齐的话,有可能CPU去读取那一行64bit数据的时候前面是int类型b变量占了四个字节,后面才是你想要的long类型a变量占四个字节,但是获取的数据还只是a变量的一半,那么又要再一次去读取下一行a变量的数据,如此类推,假设下一行还是一个long类型的变量呢?很多编程语言都有变量内存对齐这个概念,比如c语言的结构体,JAVA的对象。
2023-07-01 14:48:38 210
原创 关于spring boot属性设置的问题,springboot属性开头必须小写
spring boot的属性设置有没有采用驼峰命名法我不知道,但属性的开头必须要小写如果你的属性值像下面@TableId("id") //映射主键private Integer id; //自动增长id@TableField("studentId") //映射字段private String studentId; //学生的学号@TableField("studentName")private String studentName; //学生的姓名@TableFi
2023-06-29 15:25:47 412
原创 进程和线程上下文切换cpu花销问题
让一部分线程获取io数据的时候,其他不需要io数据的线程也可以继续在cpu里面执行,等到那个线程获取到io数据的时候,再把它执行。所以我们现在来讲一下进程和线程上下文切换的cpu花销问题,线程上下文切换它只需要保存它自己私有的寄存器数据和私有的栈数据等等就完了,而进程上下文切换要保存所有当前执行的线程私有的寄存器数据和私有的栈数据等等,此外进程有些资源也要发生切换,比如打印资源,这些临界资源是属于进程的,所以这些资源也要切换给下一个进程。用图来表示A是一个大的圆,b是A里面小的圆。
2023-06-09 11:48:21 511
原创 总线锁和缓存锁
第二个是缓存锁,我们知道cache中有三级缓存,一级和二级缓存是各个cpu内核私有的,第三级缓存是所有cpu内核共享的,缓存锁锁的是第三级缓存中该变量的缓存行,这个缓存锁并不是锁住这个缓存行不让其他cpu内核访问,而是拥有该锁的cpu内核才能修改该缓存行,如果它将来被修改了,修改的cpu内核会发出一个广播事件通知其他cpu内核说这个缓存行已经被修改了,是不正确的数据,麻烦你们重新去更新这个缓存行。最好的结果就是让A内核有锁即有这个权限,去修改该缓存行的数据,等A修改完再把这个锁的权限给B。
2023-06-09 10:42:13 932
原创 脏读和不可重复读和幻读的区别
2.不可重复读是指,一个事务再次读取这个数据可是这个数据已经被另一个事务修改了,举例,比如事务A先读取一个文档发现是空的,事务B修改这个文档写上一些数据,事务A再次读取这个文档就会发现有数据。1.脏读是指,一个事务读取到另一个事务未提交的数据,另一个事务未提交该数据有可能会回滚操作,那么我们读取到的这个数据就是一个错误的,不存在的数据。幻读和不可重复读的区别:幻读是一个事务再次读取到另一个事务增加或删除读取到的数据,而不可重复读是一个事务再次读取到的另一个事务修改到的数据。
2023-06-08 21:09:33 574
原创 快照读和快照数据是什么?当前读是什么?
当前读,就是直接去读取数据库最新的数据。但这个也会有个问题,我读取的过程中,还有两个事务发生修改这个数据,假设A事务修改一个属性值为10,B事务修改这个属性值为5。先说一下快照数据,快照数据是当一个事务开启的时候数据库会为这个事务保存一个某时刻数据库的数据(假设某时刻时间是15:00),通过undo log日志实现。所以快照读有两个问题,那就是当前事务记录的快照数据,被别的事务给回撤了,那么当前读取的数据是一个错误数据。或者当前事务记录的快照数据,别的事务已经增加或者修改了,那么读取到的数据就过时了。
2023-06-08 19:54:08 331
原创 spring如何解决循环依赖,以及三级缓存的流程,探讨一级缓存,两个缓存,和为什么要三级缓存
这样子好像也是可以的?但不过这里偏偏有个毛病在这,singletonfactory.getObject()这个方法它会返回的是原生的对象或者代理后的对象,如果A是需要代理对象的,那么每次执行这个方法返回的是不同的A代理对象,如果B对象注入第一个代理后的A对象,又有一个类C需要A对象,C对象注入第二个A代理后的对象,那么就会两个注入都是不同的,显然这不符合逻辑,那么spring是怎么做的?我们再来重新走一遍spring处理循环依赖的流程,假设有三个类发生循环依赖,A依赖B,B依赖A,A也依赖C,C依赖A。
2023-06-07 09:50:36 513
原创 BeanFactory和ioc容器的关系?
我认为其实是同一种东西,ioc容器就是工厂接口,工厂接口就是ioc容器。不过在网上也有人说ioc只是一种思想,该思想是控制反转。工厂接口只是ioc思想的具体实现。这种说法也没毛病,因为说的只是ioc不是说ioc容器。ioc思想有两种实现一个是BeanFactory接口,另一个是ApplicationContext接口。ApplicationContext是BeanFactory的子接口。除了继承BeanFactory管理Bean的功能还有其他丰富的功能。
2023-05-04 11:35:42 123
原创 spring工厂模式为什么需要反射获取而不是new对象?
2.另外这也和springioc容器的思想有关,即尽可能的降低代码的耦合度,如果spring框架允许修改,一旦新建一个类想在工厂类中帮忙new对象,,那么工厂类的代码也会随着新建的类变的很多,并且耦合度会很高,因为新建一个类必须马上在工厂类中添加new对象的代码。没办法提前帮忙new对象又不能去spring框架内部修改spring代码,所以就不能采用new对象的方式。1.因为spring框架是事先就写好的框架不能改变,它内部的处理并不知道用户要写哪些类,那是以后由使用它的人来定的,
2023-04-25 20:39:54 509
转载 依赖是什么及类的关系有那些
聚合关系是一种has-a关系,假设有两个类,类A和类B,类A包含类B,类B是类A的成员变量,聚合关系和关联关系都体现在成员变量,它们的区别在于:关联关系双方是平级的,是个体和个体的关系,聚合关系双方不是平级的,是整体和部分的关系。关联关系是一种强依赖的关系,假设有两个类,类A和类B,类B作为类A的成员变量存在,类A也可为类B的成员变量存在,如果互为成员变量则为双向依赖,否则为单向依赖。--------------------以下是高手的回答----------------------------
2023-04-20 21:34:12 306
原创 为什么linklist可以采取下标遍历?
第一步判断index下标与size/2比较,如果大那么就从后面开始遍历。因为linklist.add(o)默认从后面开始添加元素,下标大那么意味着元素肯定在后面。用集合对象.get(下标),比如想要get(1),那么第一步判断小于size二分之一,那么开始从前面遍历,即先去找到元素4,然后再找到元素2,此时它的下标是1所以找到。if (index < (size >> 1)) 判断index下标与size/2比较,如果小于那么就从前面开始遍历。linklist集合对象依次添加五个元素4,2,8,6,5.
2023-04-12 16:15:23 185
原创 get请求和post请求的区别
5:get请求无副作用(不会破坏服务器上的资源,因为它执行的是只读操作),幂等(如果是相同的参数返回的页面都是一样的)。4:get请求相对危险因为放在url里面所以可以肉眼看到,post请求相对安全因为放在请求体里面所以需要解码才能看到。2:get请求的数据可以被浏览器缓存,也可以保存为书签,有浏览器历史记录。1:get请求是把请求的参数写在URL里面。post请求是把请求参数写在body(请求体)里面。3:get请求因为url长度有限制所以传输的参数比较小,post请求放在请求体所以传输的参数较大。
2023-04-11 21:30:17 1239
原创 常用的http状态码及http缓存实现
http缓存实现有两种,第一种是强制缓存,是否使用该缓存取决于浏览器,只要浏览器判断该缓存没有过期,那么用户再访问那个资源时浏览器就会拿这个缓存出来用。第二种是协商缓存,即用户再次访问那个资源时,服务器会只返回304状态码说页面没有修改,告诉浏览器可以用该缓存的资源。304请求的资源没有修改,和上一次请求一样。然后告诉浏览器用上一次缓存的资源。302和301类似,只是访问的资源暂时挪到另一个URL。502服务器自身正常,但是访问后端服务器错误。500笼统的错误码,服务器错误。404请求的资源找不到。
2023-04-11 21:04:27 83
原创 java重载和重写的区别
重载:方法名相同,但参数和参数个数返回值只要有一点不同就可以重载。父类有这个方法,子类可以重载,本类有这个方法自身也可以重载。重写:方法名相同,参数和参数个数相同返回值相同。总之要什么都一样,然后父类有这个方法,子类才能重写。重写需要@Override关键字。
2023-04-11 14:59:24 63
原创 接口和抽象类的区别
3:接口定义变量必须默认赋初始值(因为接口默认变量为public static final类型,那么如果你定义变量而没有赋有用的初始值,就相当于白白开辟一个空间但这个空间却不能被使用,编译器肯定不给干这样的事,所以要求你必须赋值),抽象类定义变量不需要默认赋初始值可以为任意类型(抽象类默认变量为friendly 类型即该变量只能在同包里面访问)。抽象类里面的方法可以用 abstract关键字只声明,也可以有具体的方法体实现,但不能只定义声明而不加 abstract关键字。
2023-04-11 14:47:20 78
原创 关于for下标遍历arraylist集合的时候会出现漏删的情况
即出现满足判断删除条件连续下标的情况,则出现漏删元素。因为arraylist底层实现是数组,假设现在有一个数组里面有元素2,8,8,6,4,8,8。删除元素的条件为元素为8。那么for下标遍历删除的结果为,2,8,6,4,8。因为arraylist是动态数组,下标为1的时候元素为8满足删除条件,把它删除了,所以把后面的元素往前移,此时原先下标为2元素为8,下标已经变成1了,因为前面的那个8被删除了。等到for遍历下标为2时,下标2变成了元素6,那么没有满足删除条件,后面的如此类推。
2023-04-11 01:56:41 133
原创 arraylist使用迭代器或者foreach遍历的时候为什么集合不能使用自身的方法添加或删除元素
而生成迭代器对象的时候已经把modcount变量赋值给expectedModCount变量了,如果在迭代器遍历的时候集合还调用自身对象的add方法,那么迭代器在遍历的时候保证数据的有效性,会调用next方法后首先调用next方法里面的checkForComodification方法比较modcount与expectedModCount发现一不一致,不一致就会导致抛出并发修改异常。至于foreach底层实现也是迭代器,所以foreach遍历的时候,集合对象也不能使用自身的add或者remove方法。
2023-04-11 01:54:55 295
原创 重写equals方法为什么集合可以删除相同的元素
是删除不了集合中Student(15,"dada")元素,因为new对象每次都是创建新的地址,add(new Student(15,"dada"))方法是把第一个对象引用添加到list集合,而remove(new Student(15,"dada")),是又创建一个相同值的对象,但这两个对象的地址是不一样的。而object类的equals方法判断对象相同,默认的是是否是一样的地址,而不是相同的值。所以这条语句jdk源码里面它更明确的说是如果有多个相同的对象,那么它删除的是第一个下标相同的对象。
2023-04-07 09:43:58 73
原创 死锁产生条件
B 持有资源1该资源只能一个线程使用,他们同时都想申请对⽅的资源,所以这两个线 程就会互相等待⽽没有被打断就会进⼊死锁状态。线程已获得的资源在末使⽤完之前不能被其他线程强⾏剥夺,只有⾃⼰使⽤完毕后。请求与保持条件:⼀个进程因请求资源⽽阻塞时,对已获得的资源保持不放。互斥条件:该资源任意⼀个时刻只由⼀个线程占⽤。若⼲进程之间形成⼀种头尾相接的循环等待资源关系。2该资源只能一个线程使用。
2023-03-28 20:33:26 64
原创 c++和Java的区别
5:c++是编译型语言即编译链接就可以变成可执行程序,JAVA是半编译型语言,编译之后不能成为可执行程序,而是.class码,然后把.class码交给虚拟机去解释然后才可以运行。8:c++一个类可以继承多个类,JAVA只能单继承,但是可以实现多个接口,达到类似多继承目的,JAVA中object类是所有类的祖先类。6:c++没有反射机制,JAVA有反射机制,允许程序在运行时自我检查,同时允许对其内部成员操作。2:都是面向对象语言,都具有三大特性,即封装,继承,多态。1:c++提供指针,java没有提供指针。
2023-03-28 20:25:32 2314
原创 操作系统缺页会发生什么
对此我并不认同,即使没有虚拟内存依然会有缺页这个概念,因为Windows内存是按照页面管理,也就是把内存分成一个个页面。但有时候一个程序很大比如有几十g,而内存只有8g,所以不可能一下子全部装进来,既然装不进来就会有想要访问的数据不在内存中的情况,而去硬盘读取,所以这就是缺页。然后判断内存是否已满,如果内存不满,直接从外存中读取进内存。如果已满则采取页面置换算法调出内存中的页面,并判断该页面是否被修改,如果被修改那就先写回外存。假设CPU现在要计算a+b的值,但是b的数据不在内存中就会发生以上情况。
2023-03-28 19:30:49 647
原创 并发和并行的区别
并发可以用另外一种词来表述,即平等串行。假设有三个进程而只有一个cpu内核,那么并发就是平等的在每一段时间内使用该cpu内核。举例a进程先用20毫秒b进程用20毫秒c进程用20毫秒。但是我们人的感觉就是三个进程在同时执行,所以这就是并发。但对于cpu来讲他是串行运行的。并行:举例现在有四个cpu内核和四个线程,那么线程它们直接用各种的内核,对于cpu来讲它们是同时运行的。
2023-03-28 15:41:44 41
转载 java对象都是引用传递,基本数据类型是值传递
IntegerCache.low和IntegerCache.high分别是-128和127,输入的元素进来先判断是不是属于这区间,如果是这存入IntegerCache.cache[]数组中。但是我不知道为什么不直接存入i,而是要存入i+128。可能很多朋友曾经都尝试拿integer 对象来当成形参,但明明是引用传递,修改integer的值,最后却没有成功。这是因为integer类里面传入的值如果不一样就会自动创建一个对象,且创建的对象的值为 final。本文不用于任何商业目的,如有侵权请告知,立马删除。
2023-03-25 18:16:18 237
原创 关于主表和从表的概述
提示一下,以上所有结论我都代码实验过,另外不要直接drop table 表名,虽然这样可以删除表,但是表的所有东西都会被删除,包括表的结构和数据和索引这些。主表中deptno字段有10,20,30.那么想删除delete from 从表名字 where deptno=30;如果主表想要添加数据如果deptno字段为40,必须要看从表主键deptno有没有这个值,如果存在那么可以添加。删除从表的主键必须看主表中的数据是否存在,如果存在那么就不能删除从表主键的数据。方式一:先删除所有的从表。
2023-03-18 22:09:23 992
原创 指针和二级指针
以下纯属个人见解,如有不对请见谅(不对该骂就骂)。int a;变量名a存储的是值;但它在内存中也有自己的地址int *p;变量名p存储是地址;但它在内存中也有自己的地址& 是取地址的操作符;刚开始认识指针的时候一定会有人和我一样为什么变量名不是*p而是p呢?没办法这里的变量名就是p,而*在我看来它是一种类似于去到某个变量的操作符。上代码int **ps;是二级指针,变量名ps存储的是下一指针的自身地址。上代码如果不想看代码,也有我自己画
2023-02-26 22:06:00 93
原创 数据库char和varchar的简单区别
MySQL8.0.29版本图形化界面 workbench举例char(10),代表可以存储10个字符,输入的字符不够那么将会自动填充,所以它是固定长度。如果使用的是utf8编码,那么每个字符是三个字节,使用的是gdk编码,那么每个字符是两个字节。varchar(10),代表最大可以存储十个字符,但实际存储可以不存储十个字符,但要用额外的一到两个字节来表示存储长度,所以他是可变长度。固定长度的字符比如身份证手机号,可以考虑用char类型因为比varchar查找等方面要快。数据库表的行限制是
2023-02-23 23:40:07 1063 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人