- 博客(51)
- 收藏
- 关注
原创 安卓端如何获取在pc端界面自定义中添加的栏位?
由于仓管员这个栏位是在搜索条件中显示,所以需要获取对应的字段list以及适配器,判断list中是否有字段名为standardCol02的字段,有就通过SharePreferenceCommon.getUserInfo()获取当前登陆用户,将其name赋值给仓管员栏位,最后通知对应的适配器更新ui。所以我们可以在doBusiness()方法中,调用这个方法,用于界面初始化的时候给自定义字段的栏位赋值。如下:需要将自定义的仓管员栏位的值赋值为当前登陆用户。
2025-12-19 14:31:50
186
原创 Spring中的@Autowired和@Bean有什么区别?
Bean是用于注册bean的,@Component是用于注册我们自己定义的bean,将自定义的bean注册到spring容器中,而对于Maven导入的一些第三方jar包要注册到spring中就需要使用@Bean注解了,@Bean注解用于方法上,在这个方法中我们产生对象,这个对象就会注册到容器中。在方法上使用是setter注入;在构造器上使用是构造注入。@Autowired按照类型注入bean,如果spring容器中不存在此类型的bean,会报错,可以搭配@Qulifier来按照name注入bean。
2025-08-12 15:13:49
496
原创 Java工厂模式
工厂模式用于创建对象,将对象的创建和使用分开,创建对象的时候不再去new,而是使用工厂来创建对象,提高了代码的可维护性,可扩展性和灵活性。工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。
2025-08-12 11:23:32
218
原创 JVM、JRE、JDK的区别
JVM全称Java虚拟机(Java Virtual Machine, JVM),它是运行java字节码的虚拟机,JVM针对不同的系统有不同的实现,目的运行相同的字节码有同样的结果,JVM是“一次编译,到处运行”实现的关键。如下不同的编程语言编译生成字节码文件,通过JVM在不同的操作系统上运行。
2025-05-09 10:21:49
494
原创 SpringBoot的自动装配原理
继续进入@EnableAutoConfiguration,发现有个@Import注解,它引入了一个核心类,可以去将META/INF/spring.factories文件中所有的全路径类名的类加载到spring容器中。进入@AutoConfigurationPackage注解,里面也是引入了一个核心类,可以将spirngboot启动类目录及其子目录下的所有bean加载到spring容器中。进入这个注解,里面有@EnableAutoConfiguration,这个注解表示开启springboot自动装配。
2025-03-29 16:52:49
380
原创 Mysql中各种连接的区别
left join会返回左表的数据,以及右表匹配的数据,不匹配的数据会显示为null。内连接:通过inner join连接两个表,返回两个表中的匹配的数据,不匹配的不显示。right join右表的所有数据,以及左边匹配的数据,不匹配的数据显示为null。外连接:主要分为左连接(left join)和右连接(right join)。
2025-03-24 18:32:08
300
原创 Mysql的锁
表级锁:锁住一整张表,针对非索引字段加的锁,sql没有用到索引就会使用全局锁,性能较低。行级锁:针对索引字段加的锁,会锁住一行记录,并发性能高。全局锁:锁住一整个库,让数据库处于只读状态,一般在数据备份时用到。当update、delete的时候没有命中唯一索引或者索引失效,会走全表扫描加上表锁,性能很低。
2025-03-23 11:16:55
329
原创 Spring事务的传播行为
Nested,如果存在外层事务则嵌套外层事务,不存在则新建一个事务。嵌套事务的意思是如果外层事务提交,嵌套事务也会提交;外层事务回滚,嵌套事务就会回滚;这种场景适用于允许部分失败的业务,比如一个订单中有多个商品,其中有个商品库存不足了,只需要回滚那个商品就行了,其余商品可以下单成功。Required是spring事务默认的传播行为,如果存在外层事务就会融入外层事务,如果没有则新建一个事务。spring的事务传播行为指在一个开启了事务的方法内,去调用了另一个方法,那么事务会怎么传播呢?
2025-03-21 11:24:40
330
原创 索引的设计原则
3.对于区分度越高的列,建立索引的效果越好。对于唯一的列,索引效果最佳;如果有多个重复值的列,索引效果不好。1.where、order by、group by后的字段,还有join时的连表条件的字段适合建立索引。4.区分度最高的列放在联合索引的最左侧,更频繁使用的列放在联合索引的左侧。2.不要给每个列单独建立索引,尽量使用联合索引。5.对于较长的索引列,可以使用前缀索引。6.单表的索引数最好不要超过5个。
2025-03-21 10:31:40
148
原创 受检异常和非受检异常
非受检异常指在编译时不强制我们去捕获或者抛出的异常,所有的RuntimeException都是非受检异常,比如NullPointerExcetion、IndexOutOfBoundsException。受检异常指在编译时需要我们强制去捕获或者抛出的异常,比如IOException、SQLExcetion。受检异常的好处就是在发生这些异常的时候,我们能及时去做一些相应的处理,比如发生SQLException的时候我们可以去通过try-catch去捕获,然后及时的关闭数据库连接池对象。
2025-03-20 14:14:02
520
原创 为什么重写了equals必须要重写hashCode?
hashcode方法用于获取对象的哈希码,一般用于快速找到对象在容器中的索引位置以及快速判断对象是否相等。比如说set集合,它其中的元素是唯一的,我们往set集合里put元素的时候,它会先去判断set中有没有元素和加入的元素的hashcode相等,如果没有就直接加入set,否则就用equals判断是否相等,不相等就加入set,否则就不加入。因为hashcode可能会发生哈希冲突,所以如果两个对象的hashcode相等,它们的equals不一定相等。
2025-03-19 20:54:44
179
原创 ==和equals的区别?
比如String类就重写了equals方法,它会先用==判断两个对象的内存地址是否相同,相同直接返回true,不相同再去判断字符串的内容是否相等,相等返回true,否则返回false。如果没有重写equals方法,会去调用Object类的equals,其实就是去用了==比较两个对象。equals是Object类的方法,所以所有的类都有equals方法。如果重写了equals方法,会按照重写的逻辑来判断对象是否相等。对于引用数据类型,比较的是它们的内存地址。对于基础数据类型,比较的是值是否相等。
2025-03-19 20:36:22
256
原创 String、StringBuffer、StringBuilder的区别
String是不可变的,这是因为String内部用于存储数据的char[]数组用了final关键字修饰,而且是private的,并且没有对外提供修改数组的方法。StringBuffer和StringBuilder是可变的,它们内部的char数组没有用final关键字修饰。StringBuffer中的方法都用了Synchronized修饰,也是线程安全的。String不可变,每次操作String都会生成新的对象,它的性能最低。由于String是不可变的,所以它是线程安全的。String适合操作少量的数据。
2025-03-19 20:28:48
249
原创 引用拷贝、浅拷贝和深拷贝
浅拷贝去拷贝对象时,会在堆上新建对象,对于基本数据类型的属性,会直接拷贝其值;而对于引用类型的属性,会拷贝它的引用地址。引用拷贝会去拷贝对象的引用,也就是对象的内存地址,不会在堆上新建对象。深拷贝会完整的拷贝对象,包括它的引用类型的属性。
2025-03-19 20:10:22
214
原创 线程池的核心参数
线程池帮助我们管理监控线程,通过重复利用线程,来防止频率创建和销毁线程带来的性能消耗。可以使用ThreadPoolExecutor或者Executors来创建线程。
2025-03-19 14:50:25
926
原创 一文了解ThreadLocal
ThreadLocal是每个线程私有的,线程可以把自己的私有数据放到ThreadLocal里面,不用担心其他线程访问到自己ThreadLocal。通过set()方法将值存入ThreadLocal或者修改值,get()方法取出值,remove()方法移除值。
2025-03-19 11:10:46
532
原创 ConcurrentHashMap实现原理
ConcurrentHashMap是线程安全的HashMap,他在jdk1.7和1.8中有不同的实现。
2025-03-16 16:34:18
308
原创 ReentrantLock的实现原理
AQS全称抽象队列同步器,是java中的一个抽象类,它提供了一个通用框架用于实现同步器。AQS中有一个state属性,默认为0,如果被某个线程修改为1了,那么这个线程就拿到了锁,可以去访问资源。多线程来抢锁的时候,使用CAS操作来修改state的值,没有修改成功的线程会加入AQS内部的一个双向队列中阻塞等待,当锁释放时,队头线程会被唤醒,尝试自旋抢锁,没抢到就阻塞。
2025-03-16 15:27:25
198
原创 一文了解CAS
CAS全程:Compare And Swap(比较并交换),是乐观锁思想的一种体现,能在无锁的情况下保证线程安全。Java中的CAS是由native方法实现的,底层通过硬件层面保证了CAS操作的原子性。CAS是如何保证线程安全的?如下:CAS操作会去比较工作内存中的旧值和内存中的预期值是否相等,相等才会将其改成新值。如下线程A来修改a,a旧值是100,去和主内存中的a比较,发现相等了,于是在工作内存进行a++操作并同步到主内存。
2025-03-15 20:25:44
366
原创 Java中的volatile关键字
volatile是一种轻量级的同步机制,它相比于synchronized这种重量级锁更轻量,因为它不会造成线程上下文的切换,但是同步性更差,volatile关键字可以保证变量的可见性以及禁止指令重排序。
2025-03-15 19:49:56
352
原创 一文了解JVM的垃圾回收
当进行垃圾回收的时候,会暂停所有线程去完成垃圾回收。Minor GC :发生在新生代的垃圾回收,当eden区满了会触发,暂停时间较短。Full GC:对新生代和老年代进行完整的垃圾回收,当老年代内存不足时会触发,暂停时间长,要尽量避免。
2025-03-13 21:04:32
2917
原创 Spring Aop的实现方式
aop是一种面向切面编程的思想,主要就是为了降低代码的耦合度,比如我们有很多方法都需要去记录日志,如果这些方法中都去写记录日志的代码,太冗余了,于是可以用面向切面编程的思想,去定义一个切面,去横向切入到需要记录日志的地方。
2025-03-11 19:27:00
186
原创 Spring Bean的生命周期
首先Spring会去扫描xml、注解,把所有的BeanDifinition对象注册到容器中,BeanDifinition对象主要包含了类的一些信息(类名、方法、构造器、属性等)。然后筛选出单例的BeanDifinition,通过反射去实例化bean,对于原型bean是当去使用它的时候再实例化。然后再调用bean的后置处理器的after方法,Spring Aop就是在这里实现的。spring bean的生命周期主要分为四个阶段:实例化、属性填充、初始化、使用和销毁。最后使用完bean并销毁。
2025-03-10 16:58:31
211
原创 线程的生命周期
等待:调用wait方法,进入等待状态,当调用notify方法时会唤醒线程,重新进入就绪状态。阻塞:线程抢锁失败,会阻塞,当获得锁会进入就绪状态,抢到cpu时间片进入运行状态。超时等待:调用sleep方法进入休眠,休眠多久可以设置,时间到了进入就绪状态。新建:当我们去new Thread的时候,线程就处于新建状态。运行:线程抢到了cpu时间片,执行run方法。就绪:调用了start方法,线程准备运行。终止:线程执行完run方法,终止变成垃圾。
2025-03-09 16:03:18
196
原创 创建线程的四种方式
在我们需要线程执行完任务有返回值的时候,可以去实现runnale接口,需要重写call方法,在call方法内线程去执行任务,执行完成后会有返回值。需要注意的是new Thread()不能传Callable的实现类,没有这个构造方法,需要用FutureTask包装一下,然后传FutureTask进去。
2025-03-09 15:29:56
239
原创 Redisson分布式锁原理
redisson分布式锁是可重入、可重试、以及可以自动续期的。它是基于set nx互斥命令实现的,获取锁i就是去set nx,只有第一次set能成功,之后都会返回失败,释放锁其实就是去删除key。那么它是如何实现可重入、可重试、以及自动续期的呢?
2025-03-09 11:26:30
537
原创 Redis主从同步原理
从节点像主节点请求数据同步,主节点先判断从节点是不是第一次进行同步,如果是第一次的话,主节点会调用bgsave,frok一个主进程,生成RDB文件发送给从节点,从节点收到后清空本地数据,加载RDB文件。如果主节点在生成RDB的过程中,有写操作来修改数据怎么办?Redis会把这些写操作记录到repl_baklog日志中,然后发送给从节点,从节点执行命令同步数据。
2025-03-09 10:41:58
316
原创 RocketMQ的持久化机制
RocketMQ的持久化指将消息存放到磁盘中,以便可靠的存储消息以及索引消息。消息会存放到 commit log 文件中,采用顺序写写入commit log,大小为1G,满了之后会生产新的commit log文件。
2025-03-08 14:17:10
209
原创 Redis缓存过期删除策略和缓存淘汰策略
redis的缓存过期了需要根据缓存过期删除策略来删除缓存,节省内存空间。这种删除策略,当缓存过期之后,不会立刻删除,而是等我们再次去用到这个缓存的时候,才会去删除它。优点:对cpu友好,只有在使用缓存的时候才会去删除,对于用不到的缓存不会去删除。缺点:对内存不友好,一些一直用不到的缓存无法得到释放。定期去检查一些缓存是否过期,删除其中过期的缓存。优点:能有效的释放过期缓存占用的内存缺点:删除频率和时长不好决定。
2025-03-07 17:01:49
354
原创 Redis的持久化机制
在linx系统中,所有的进程都无法去操作物理内存,所以进程中会维护一个页表,它记录着虚拟内存和物理内存的映射关系,这样redis就可以去操作虚拟内存,然后关联到物理内存。,主进程在进行写操作的时候,不会直接去修改内存数据,而是拷贝需要修改的数据,去修改拷贝的数据,并且修改页表的映射关系,之后读操作就会读到拷贝的新数据。AOF默认是关闭的,需要到redis.conf中打开。来生成快照文件,sava是由redis主进程来执行,会阻塞其他命令,而bgsave由redis的子进程来执行,不会影响主进程。
2025-03-07 16:37:19
224
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅