Collection与Map
集合框架概述数组的特点与弊端特点
数组一旦初始化,长度就已经确定了
数组中的多个元素是依次紧密排列的,有序的,可重复
数组一旦初始化完成,其元素的类型就是确定的,不是此类型的元素,就不能添加到数组中
元素的类型既可以是基本数据类型,也可以是引用数据类型
弊端
数组一旦初始化,长度就已经不可变了
数组中存储数据特点的单一性,对于无序的,不可重复的场景的多个数据就不行了
数组中可用的方法,属性都极少
针对于数组中元素的删除,插入操作,性能较差(尾部添加性能并不差)
Java集合框架体系java.util.Collection:存储一个一个数据
List
存储有序的,可重复的数据
ArrayList
LinkedList
Vector
Set(底层其实就是Map,只使用了Map的键,来保证唯一,不可重复)
存储无序的,不可重复的数据
HashSet
LinkedHashSet
TreeSet
java.util.Map:存储一对一对数据
HashMap
LinkedHashMap
TreeMap
Hashtable
Properties
Collection接口
ad ...
Java比较器
基本数据类型需要比较大小的话,可以直接使用比较运算符,但是引用数据类型是不能直接使用比较运算符来比较大小的
自然排序自然排序Comparable
如果数组中是基本数据类型的比较
12345678@Testpublic void test1() { String[] arr = new String[]{"Tom", "Jerry", "John", "Atom", "Bomb"}; Arrays.sort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }}
就能够使用Arrays.sort()来进行正常的排序
如果数组中的是引用数据类型,就会报错
1234567891011121314@Testpublic void test2() { Product[] arr = n ...
JVM面经
JVM相关面试题1 JVM组成1.1 JVM由那些部分组成,运行流程是什么?
难易程度:☆☆☆
出现频率:☆☆☆☆
JVM是什么
Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境)
好处:
一次编写,到处运行
自动内存管理,垃圾回收机制
JVM由哪些部分组成,运行流程是什么?
从图中可以看出 JVM 的主要组成部分
ClassLoader(类加载器)
Runtime Data Area(运行时数据区,内存分区)
Execution Engine(执行引擎)
Native Method Library(本地库接口)
运行流程:
(1)类加载器(ClassLoader)把Java代码转换为字节码
(2)运行时数据区(Runtime Data Area)把字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层系统去执行,而是有执行引擎运行
(3)执行引擎(Execution Engine)将字节码翻译为底层系统指令,再交由CPU执行去执行,此时需要调用其他语言的本地库接口(Native Method L ...
并发编程面经
文档说明
在文档中对所有的面试题都进行了难易程度和出现频率的等级说明
星数越多代表权重越大,最多五颗星(☆☆☆☆☆) 最少一颗星(☆)
Java多线程相关面试题1.线程的基础知识1.1 线程和进程的区别?
难易程度:☆☆
出现频率:☆☆☆
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。
当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
一个进程之内可以分为一到多个线程。
一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。在 windows 中进程是不活动的,只是作为线程的容器
二者对比
进程是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务
不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间
线程更轻量,线程上下文切换成本一般上要比进程上下文切换低(上下文切换指的是从一个线程切换到另一个线程 ...
Ciy Mag68驱动使用教程
前言刚换了ciy mag68,这把键盘应该算是船壳68的终章了吧
详细配置:
这里说记录一下这驱动的使用方式
驱动官网下载
驱动界面
全局设置全局设置可以调整休眠时间,按键去抖等功能
按键指派这个就是重头戏了,这个界面也是非常简陋啊
分为默认层,FN1层,FN2层,Tap层
如果修改默认层,就是直接修改了键盘默认的按键了,可以在下方选择一个目标按键,然后点击键盘图上的某个按键,即可修改键盘上的键值为目标按键,比如你可以将q改成a(除非你有这么闲)
FN1层
这一层操作空间就大了,比如我的这里是FN+rAlt是截图,要用到组合键
操作步骤
选择一个要绑定的按键,比如alt
勾选上Win,点击请输入一个单键或组合键下面的输入框,然后按Print
即可给右alt绑定上全屏截图键(Win+print)
宏驱动是支持宏定义的,只需要在宏编辑面板设置一个宏,然后在按键指派面板继续上面的绑定就行了
最后编辑完别忘了点击右下角的保存按钮
驱动会更新键盘的数据,如果发现没有变化,驱动关了再开说不定就好了
感觉驱动有些bug,比如给字母区的按键绑定fn组合键,就可能不能用,希望后期能完善些吧.
集合面经
Java集合相关面试题导学这次课程主要涉及到的是List和Map相关的面试题,比较高频就是
ArrayList
LinkedList
HashMap
ConcurrentHashMap
ArrayList底层实现是数组
LinkedList底层实现是双向链表
HashMap的底层实现使用了众多数据结构,包含了数组、链表、散列表、红黑树等
在讲解这些集合之后,我们会讲解数据结构,知道了数据结构的特点之后,熟悉集合就更加简单了。在讲解数据结构之前,我们也会简单普及一下算法复杂度分析,让大家能够评判代码的好坏,也能更加深入去理解数据结构和集合。
1 算法复杂度分析1.1 为什么要进行复杂度分析?我们先来看下面这个代码,你能评判这个代码的好坏吗?
123456789101112/** ** *求**1~n**的累加和 ** @param* *n ** @return*/public int sum(int n) { int sum = 0; for ( int i = 1; i <= n; i++) { sum = sum + i; ...
框架面经
框架篇面试题-参考回答
面试官:Spring框架中的单例bean是线程安全的吗?候选人:
嗯!
不是线程安全的,是这样的
当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。
比如:我们通常在项目中使用的Spring bean都是不可可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。
如果你的bean有多种状态的话(比如 View Model对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用由“singleton”变更为“prototype”。
面试官:什么是AOP
候选人:
aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等 ...
Mysql面经
MySQL面试题-文稿
面试官:MySQL中,如何定位慢查询?
候选人:
嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个sql出了问题
如果,项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。
面试官:那这个SQL语句执行很慢, 如何分析呢?
候选人:如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看s ...
索引的数据结构
1 为什么使用索引索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一半教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章,Mysql中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关顺序,如果不符合则需要全表扫描,即需要一条一条底地查询记录,知道找到与条件符合的记录如上图所示,如果没有索引,数据离散分布,那么找到数据将会非常消耗时间,如果数据顺序摆放,那么也需要从1开始找到第6个,依然非常耗时,如果我们不借助任何索引结构帮助我们快速定位数据的话,我们查找Col2=89这条记录,就要逐行去查找
假如给数据使用二叉树这样的数据结构进行存储,如下图
这时再去查找Col2=89这条记录,只需要查找两次,查询速度提高了
这就是为什么我们要建索引,目的就是为了减少磁盘I/O的次数,加快查询速率
2 索引及其优缺点Mysql官方对索引的定义为:索引(index)是帮助Mysql高效过去数据的数据结构
索引的本质:索引是数据结构,可以简单理解为排好序的快速查找数据结构,满足特定查找算法,这些数据结构以某 ...
Java八股文
现代八股
1 Redis篇
Redis使用场景
缓存(穿透,击穿,雪崩 | 双写一致,持久化 | 数据过期,淘汰策略)
分布式锁(setnx,re’disson)
计数器
保存token
消息队列
延迟队列
1.1 缓存穿透
例如,一个get请求: api/new/getById/1
缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
穿透穿透,可以理解为请求的数据穿透了redis,还是动用了mysql,导致缓存没起到作用
解决方案一:缓存空数据,查询返回的数据为空,扔把这个空结果进行缓存优点:简单缺点:消耗内存,可能会发生不一致的问题
解决方案二:布隆过滤器优点:内存占用较少,没有多余的key缺点:实现复杂,存在误判
布隆过滤器bitmap(位图):相当于一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1布隆过滤器的作用:布隆过滤器可以用于检索一个元素是否在一个集合中两种实现:redisson,guava
但是布隆过滤器也存在误判的可能误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时也带来了更 ...