Map排序问题
场景描述导出Excel,标题没有按照规则排序,如图(红框的展示结果同导出的Excel)
排序规则,由数据库给出,根据给定的sortTag进行排序
问题分析:该集合(keysdata)类型为Map<String,LinkedHashMap<String,List<Object>>>,需要对其中的LinkedHashMap<String,List<Object>>进行排序,而该列的首行并不需要参与排序。该排序相当于用另一个集合的数据对该集合进行排序
思路
首先需要新建一个map集合对象,用于存放生成的数据,为什么不能将生成的数据直接生成于原有集合上?LinkedHashMap只保证顺序,不保证有序,在原有集合上更新数据并不会改变结果顺序(Map特性。虽然结果是有序的)
其次需要一个数组用来判断排序的大小(可以理解为一个辅助数组),这里不能直接使用int,因为lambda不能直接使用外部定义的局部变量,java线程模型中栈帧的私有很可能会导致并发问题。可以使用原子类AtomicInteger进行替换,但不适合该计算场景,也过于复杂了 ...
一问一答之JVM
说下JVM的内部组成与作用
jvm包括两个子系统和两个组件,可以看图两个子系统为类加载器和执行引擎两个组件为运行时数据区域和本地接口
联系:编译器会讲java代码转为class字节码,类加载器将字节码加载到内存中,放在方法区内,字节码是JVM的一套指令集规范,并不能作用于操作系统,需要由jvm的解释执行引擎翻译为cpu的底层指令,整个过程需要调用本地方法库来实现这个功能
简单来说就是堆栈方法区和程序计数器
程序计数器作用
读取指令,实现流程控制(选择、循环、顺序、异常处理)
多线程情况下,记录线程当前位置
唯一不会出现OOM的地方,随线程生命周期决定
虚拟机栈会出现两个错误。StackOverFlowError 和 OutOfMemoryError
StackOverFlowError: 若 Java 虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误。
OutOfMemoryError: Java 虚拟机栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存 ...
面试经历
个人篇说说个人情况,普通本科,软件工程,从传统的计算机软件行业起步,一年后找工作实现了Double,虽然对于互联网“人均水平”来讲不值一提。但对于我来说一直在按照制定的计划中稳步进行。IT最大的魅力就在于此,不是人人都是985,211,但可以通过自己的能力获得一个不错的待遇,这篇文章一是用作为个人记录,二是作于分享,自己本身优秀就没必要看下去了
跳槽想法主要是没有成长吧,对于一个应届毕业生来讲,其实学校基本已经定义了你的一个“身价”,薪资这块不是当前阶段纠结的点,选一个好的平台是无比重要的,我刚毕业可能也没意识到这一点,想着在北京能有份开发工作就不错了。我第一份工作是做一个企业应用方向的,比较稳定,技术挑战少。而且公司比较扣,我也没什么好讲的,干的这些活确实不值得拿一个高薪
需要做些什么程序员也就三五年方向选择期,后面基本就在一个行业深耕了,所以前期的方向和积累很是重要。我老东家比较好的一点是朝九晚五,留给我的时间很多,我可以利用这个时间去积累一些东西,说起来容易,坚持不易。我做了这些,考证(软考),搭建个人博客,写原创文章,夯实基础(算法,设计模式)。原本想着做开源项目github攒 ...
JVM笔记
内存分配数据区域1.8之前
线程共享:堆、方法区
线程私有:本地方法栈、虚拟机栈、程序计数器
1.8之后
线程共享:堆、元空间
线程私有:本地方法栈、虚拟机栈、程序计数器
程序计数器作用
读取指令,实现流程控制(选择、循环、顺序、异常处理)
多线程情况下,记录线程当前位置
唯一不会出现OOM的地方,随线程生命周期决定
虚拟机栈会出现两个错误。StackOverFlowError 和 OutOfMemoryError
StackOverFlowError: 若 Java 虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误。
OutOfMemoryError: Java 虚拟机栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
每次调用方法都会创建栈帧(包括局部变量表、操作数栈、动态链接、返回地址)
用来保存局部变量、参加方法计算与返回
本地方法栈
使用Native方法服务,也会出现上述两种错误
Nat ...
后端的vue笔记
下面是我作为后端对vue的看法后端程序员应该对vue了解多少
前言vue知识点总结,我认为的后端需要了解的程度,学习永远是学的多,会的少。学的尽可能的往深里研究,毕竟以后也没这机会了
前置需要掌握一定的ES6相关语法,我这里也总结了一点,可以去网上了解更多
es6属性的简写
什么时候方法的()可以省略必须满足两个条件,类似下图
事件监听
方法没有参数
当条件为false的时候,v-if不会存在dom中,v-show会出现,加了一个样式dispaly:none。就是F12查看的时候有没有 使用建议:如果频繁切换使用v-show,只切换一次v-if
let i in 遍历的对象,此时i是当前索引 let i of 遍历的对象,此时i是当前对象
如果需要以下三个需求应该怎么写代码
筛选数组中小于100的数字
将筛选出的结果x2
将结果进行相加
最直接的方法就是套的写,官方叫做链式编程,也叫函数式编程
1234567let total = nums.filter(function(n){ return n < 100 }).map(fu ...
Java中的注解是如何发挥作用的
注解是干什么的注解本身不提供作用,注解只能是被看作元数据,它不包含任何业务逻辑。注解更像是一个标签,一个声明,表面被注释的这个地方,将具有某种特定的逻辑。
注解常见的种类常见的注解有三大类:JDK的,自定义的,第三方的(比如框架)
注解三板斧定义、使用、读取
定义:包括名字,能用到哪些地方,有效期,是否可以被继承
使用:定义好之后在允许的地方使用标注即可
光有前两步,没什么用,如最熟悉的@Override注解,为什么能验证重写是否有效,怎么不是验证重载?spring的@Autowired为什么是注入作用,而不是输出一句话?显然,他们在程序中做了实现,使得其注解具有各自的作用,也具有了意义,而赋予灵魂的一步就是读取
读取:让注解发挥作用,给注解注入灵魂
注解前置知识首先是元注解,Java中提供了四个
@Documented | @Retention | @Target | @Inherited
分别解释下
@Documented
代表着此注解会被javadoc工具提取成文档
@Retention:
代表该注解的有效期
SOURCE 表示编译期,如@Override,只做编译时的提 ...
springboot启动过程
这个图做的很好:SpringBoot启动结构图
springboot启动分为构造器部分和run部分
构造器123456789101112131415161718public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { //初始化资源加载器 this.resourceLoader = resourceLoader; //断言资源加载器不为null,否则报错 Assert.notNull(primarySources, "PrimarySources must not be null"); //初始化资源 this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); //推断当前的web应用类型(非WEB / SERVLET / REACTIVE) this.webApplicationType = ...
springboot自动配置原理
在使用springboot进行开发的时候,只需要在application.properties中进行参数配置,不配置也会有一个默认值,tomcat,映射关系都不用配置了,那么spring是如何实现自动配置的呢?
springboot如何实现自动装配自动配置的。这都要归功于springboot强大的注解功能,也是springboot的一大特点
举例:在springboot主运行程序中,下面是常见的springboot启动类
123456@SpringBootApplicationpublic class SpringbootSrcApplication { public static void main(String[] args) { SpringApplication.run(SpringbootSrcApplication.class, args); }}
看起来平平无奇,但为什么一运行main方法就会启动容器?
spring会在启动的时候new自己—>new SpringApplication(primar ...