
精华帖
文章平均质量分 89
Alphr
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
整理了一篇关于java集合的文章,有图有真相
文章目录1.概述2.集合框架图2.1 Collection系2.2 Map系3.Collection接口4.Foreach与迭代器4.1迭代器执行原理4.2使用for循环还是迭代器Iterator对比5.List5.1 List概述5.2 ArrayList5.3 LinkedList5.4 Vector5.5 ArrayList和LinkedList5.6 ArrayList和Vector6.Set6.1 概述6.2 HashSet6.3 LinkedHashSet6.4 TreeSet7.List和Se原创 2020-06-19 23:08:37 · 479 阅读 · 0 评论 -
springMVC处理一个请求的过程-源码详解
文章目录1.springMVC如何寻找对应的controller?2.将method封装到map中2.适配器处理3.处理Handler的参数4.参数处理细节总结:贴上我们用来测试的代码:很简单,就是一个注解的controller,只要从浏览器输入对应的路径,这个方法就会拦截这个请求,进而开始具体的处理1.springMVC如何寻找对应的controller?我们先列出大概的流程,之后会进行详解springmvc中最重要的就是前端处理器,也就是DispatcherServlet了,它会拦截浏原创 2020-06-17 22:53:23 · 471 阅读 · 0 评论 -
mybatis源码解析-如何执行查询操作
//1.通过输入流解析xml配置文件InputStream inputstream = Resources.getResourceAsStream("xxx.xml")SqlsessionFactory sqlsessionfactory = new SqlsessionFactoryBuilder().build(inputstream);//2.获取和数据库的链接,创建会话SqlSession openSession = sqlsessionfactory.openSession();//3.原创 2020-06-07 19:41:11 · 367 阅读 · 0 评论 -
mybatis源码解析-getMapper
之前两篇文章:mybatis源码解析-SqlsessionFactorymybatis源码解析-获取Sqlsession介绍了在mybatis运行中的前两步的执行过程和原理,继续摆出我们的demo://1.通过输入流解析xml配置文件InputStream inputstream = Resources.getResourceAsStream("xxx.xml")SqlsessionFactory sqlsessionfactory = new SqlsessionFactoryBuilder(原创 2020-06-07 16:45:00 · 304 阅读 · 0 评论 -
mybatis源码解析-获取Sqlsession
上篇文章讲了mybatis是怎么创建SqlSessionFactory的:mybatis源码解析-SqlsessionFactory,简单来说就是通过构造模式读取xml配置文件封装到Configuration对象中,返回一个默认的DefaultSqlSessionFactory对象,需要注意的是我们写的每一个mapper映射文件在配置类中定义好了之后会被解析进Configuration中,并且mapper映射文件中的增删改查标签都有与之对应的MappedStatement对象封装,我们还是摆出hello w原创 2020-06-07 16:12:00 · 281 阅读 · 0 评论 -
mybatis源码解析-SqlsessionFactory
我们通过hello world来调试mybatis源码,先写一段伪代码://1.通过输入流解析xml配置文件InputStream inputstream = Resources.getResourceAsStream("xxx.xml")SqlsessionFactory sqlsessionfactory = new SqlsessionFactoryBuilder().build(inputstream);//2.获取和数据库的链接,创建会话SqlSession openSession =原创 2020-06-07 10:20:35 · 306 阅读 · 0 评论 -
关于GC垃圾回收及其算法的一点思考
在学过java一些有关GC以及相关算法后,对一些概念以及GC与垃圾回收算法的关系有点混乱,觉得有必要好好总结一下了,虽然GC诞生的时间比java早,并且GC并不是java语言所独有的,但垃圾收集机制是java语言的招牌能力,极大的提高了开发效率,并且成为现代语言的标配,因此我们必须深入学习java的垃圾收集机制1.什么是GC,什么是垃圾,为什么需要GCGC是指垃圾回收机制,所谓垃圾是指在运行程序中没有任何指针指向的对象当一个对象不能再被复后续程序所引用到时,这个对象所占用的内存空间就没有存在的意义了,原创 2020-05-24 19:10:29 · 345 阅读 · 0 评论 -
jvm中对象是怎么存储的,对象的内存布局是怎样的
对象通过new,反射,clone等方式创建完毕后被存储到堆中,那么对象是以什么样的方式存储在堆中的?对象的内存布局对象在堆内存的内存布局主要有三部分,即对象头,实例数据,对其填充对象头对象头主要包含两部分的内容,一个叫运行时元数据(mark word),一个叫类型指针1.运行时元数据:哈希值(hashcode):对象在堆空间中都有一个首地址值,栈空间的引用根据这个地址指向堆中的对象,这就是哈希值起的作用GC分代年龄:对象首先是在Eden中创建的,在经过多次GC后,如果没有被进行回收,就会在原创 2020-05-23 09:40:33 · 1500 阅读 · 1 评论 -
jvm-堆详解
文章目录1.堆概述2.堆内存细分2.1设置堆内存大小2.2新生代和老年代3.对象分配过程3.1对象分配特殊情况4.几种垃圾收集比较4.1Minor GC4.2Major GC4.3Full GC5.为什么要分代6.本地线程缓冲TLAB6.1为什么要有TLAB(Thread Local Allocation Buffer)6.2什么是TLAB7.堆是否是对象存储的唯一选择7.1逃逸分析7.2栈上分配7.3同步省略7.4标量分配1.堆概述方法区和堆是线程共享的,是每个进程唯一的,一个java程序对应一个进原创 2020-05-22 17:08:27 · 780 阅读 · 1 评论 -
深入剖析ThreadLocal线程局部变量
文章目录1.简介2.每个线程的变量副本是存储在哪里的3.通过源码分析ThreadLocal具体实怎样工作的3.1set方法3.2get方法4.变量副本【每个线程中保存的那个map中的变量】是怎么声明和初始化的5.不同的线程局部变量,比如说声明了n个(n>=2)这样的线程局部变量threadlocal,那么在Thread中的threadlocals中是怎么存储的呢?threadlocalmap中是怎么操作的?6.总结1.简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行原创 2020-05-21 22:38:13 · 519 阅读 · 0 评论 -
理解java并发中的线程池
文章目录1.线程池的出现1.线程池的出现任何程序的运行和都与要耗费资源,因为程序是在操作系统上运行的,涉及到与操作系统的交互,比如我们常用的数据库连接池,没有使用池化技术之前,每一个链接的创建和关闭都需要耗费资源,现在运用池化技术,将链接的创建关闭交给池统一处理,就可以达到节约资源,减少系统消耗的目的,类似数据库连接池,线程也有自己的线程池一个线程池中包含许多准备运行的空闲线程,将Runnable对象交给线程池,当使用线程池时,就会调用其中的线程,执行run方法,当run方法执行完毕,线程不会死亡,而原创 2020-05-21 20:46:22 · 561 阅读 · 0 评论 -
Java内存模型-JMM解析
1.前言在解析JMM之前,我们首先要明确,java并发编程说到底就是为了处理两个关键问题:线程之间通信线程之间同步我们先简要概述一下,在彻底了解了java内存模型之后,我们可以往更深层次进行探究,那么开始:线程通信指线程之间的信息交互,由于线程里的内容是线程私有的,所以必须通过一些手段达到信息交换的目的,这里有两种:共享内存和消息传递,其中共享内存会在本文重点介绍,并且也是java...原创 2020-04-27 22:41:16 · 348 阅读 · 0 评论 -
JUC并发-CAS原子性操作和ABA问题及解决
在多线程条件下(A,B两个线程),假如i = 2,我们想通过i++的方式让 i 的值变为4,可能执行不成功,因为i++不是原子性操作,在底层不是表面上的i++一步完成,而是分成几步来操作,所以两个线程很可能拿到的值都是2,最终结果可能为3,所以在进行这种操作的时候,一般是 加锁来实现,但加锁会使效率低下,因此,从jdk5开始,java提供了java.util.concurrent.atomic包来...原创 2020-04-26 22:15:20 · 508 阅读 · 0 评论 -
通过字节码分析-java静态方法为何不能被重写,重写和重载的本质
在进行文章论点分析之前,我们先要回顾一下方法调用过程,阅读本文需要对jvm有一定了解方法调用方法调用一般发生在一个方法调用另一个方法中,所有方法的执行过程都是通过栈来完成,栈帧的出栈/入栈对应着方法的调用和卸载,在程序运行时,方法调用是最普遍,最频繁的的操作之一,下图揭示了jvm中方法调用的模型图方法调用分类jvm在运行中会把符号引用转化为方法的直接引用对于在编译期就确定,且在运行过...原创 2020-04-23 15:20:24 · 1144 阅读 · 0 评论 -
深入理解java虚拟机类加载机制,通俗易懂
java源文件经编译后以.class的文件形式存在本地磁盘上,在Class文件中描述的各类信息最终都需要加载到虚拟机中之后才能被运行和使用1.类加载机制在jvm中的位置1.类加载过程虚拟机把类的数据从.class文件加载到内存,并对class文件中的数据进行校验、转换、解析、初始化等操作后,最终形成可以被虚拟机识别并使用的Class对象的过程就叫做“虚拟机的类加载”,主要包括为3大阶段。...原创 2020-04-20 21:34:23 · 550 阅读 · 0 评论 -
java为什么匿名内部类的参数引用时final?final局部变量的生命周期
https://blog.csdn.net/tianjindong0804/article/details/81710268原创 2020-04-18 12:56:44 · 709 阅读 · 0 评论 -
为什么学习Spring,什么是Spring,什么是IOC,什么是DI,什么是容器
什么是SpringSpring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以IoC(nverse Of Control:反转控制) 和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的...原创 2020-03-03 14:46:02 · 713 阅读 · 0 评论 -
jdk1.8之后的String.intern()方法内存分析
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样才能搞懂1.字符串常量池划分jvm对字符串常量池在不同jkd版本有不同的划分,这里用hotspot来分析,文章后部分会使用,主要有以下三种方式大致划分为这几个部分...原创 2020-04-05 14:10:55 · 2201 阅读 · 10 评论 -
单核cpu多核cpu如何执行多线程
花了很多时间来整理这方面的相关内容程序和进程程序: 为完成特定任务,用某种语言编写的一组指令集合,即一段静态的代码进程: 是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,比如电脑上的各种运行中的软件进程和线程进程可进一步细化为线程,是一个程序内部的一条执行路径,比如杀毒软件中的体检,杀毒,清理等都是一个进程中的多个线程一个进程同一时间并行多个线程,多线程是程序有多...原创 2020-03-31 11:19:00 · 8862 阅读 · 0 评论 -
spring-boot-starter原理及自定义
前言在我们做项目时会用到许多场景启动器,我们只需要引入对应的starter就可以使用相应的功能,我们可以在配置文件中根据需要修改一些属性,我们也可以自定义一些starter来使用,首先我们需要直到starter的原理原理1.我们以WebMvcAutoConfiguration为例,看这个类上标注的注解@Configuration //指定这个类是一个配置类@ConditionalOn...原创 2020-03-24 12:56:44 · 547 阅读 · 0 评论