对于大部分人而言,在找工作之前少不了准备工作,有一份全面细致面试题将帮助大家减少许多麻烦。所以准备找工作的小伙伴可以看参考一下哦!
redis 相关
redis 有几种数据结构
redis有五种数据结构,分别是String(字符串),Hash(字典),List(列表),Set(集合),Sorted Set(有序集合)
这五种数据结构是redis的五种数据结构
Redis持久化方式
redis持久化方式有两种,分别是快照和追加式文件,
-
对于快照而言,持久化会在特定的时间间隔,保存时间点的数据快照。
-
追加式文件持久化方式服务器在收到写操作的时候,在服务器启动的时候,会逐条的执行,从而重建里面的数据,写操作记录的格式和redis协议一样,以追加的方式保存。
-
两种持久化方式会长久的存在,当redis重启的时候,追加式文件则会优先用于重建数据。
Java数据结构
Java 有以下几种数据结构,
List
List 存放的是有序的可重复的。List关注的是索引,拥有一系列和索引相关的方法,查询速度快。
Set
Set 存放的是无序的不能重复的,集合中的对象,只是简单的把对象加入到集合中。
Map
Map 存放的是键值对,键可以重复,值可以重复,根据键得到值,对map集合遍历的时候,先得到set的键的集合,对set集合进行遍历,得到相应的值。
redis 锁
锁
锁一共有三种锁,分别是线程锁,进程锁,分布式锁。
线程锁
对于线程锁而言,主要用来给代码块,方法加锁,当某个方法或者代码使用锁的时候,在同一时刻,只有一个线程执行该方法或者代码块,线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现,例如synchronized是共享对象头,显示锁Lock是共享某个变量。
进程锁
为了控制同一操作系统中,多个进程访问共享资源,因为进程具有独立性,各个进程无法访问其他进程资源,因此无法通过synchronized等线程实现进程锁
分布式锁
当多个进程不在同一操作系统中,用分布式锁控制多个进程对资源的访问。
锁的自旋
锁的自旋使用的是CAS算法算法,当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将会循环等待,然后不断的判断锁能否成功的获取,直到获取锁才能够退出循环。
redis 锁基本命令
在redis里添加key作为redis锁,跑完自动进行delete。
redis 死锁解决办法
这里对redis进行死锁,通过时间控制,把redis超时作为控制,或者redis的value作为时间控制。
ArrayList 扩容
初始数组容量为10,获取到扩容的容量,复制到当前的数组。
每次扩容1.5 倍。
LinkList扩容
底层维护的是双向列表,有前后的指针进行维护。
Java 数据类型各占几个字节
byte 1个字节。
short 2字节。
int 4个字节。
long 8字节。
float 4个字节。
double 8字节
char 2字节
boolean 1字节。
如何计算
用MAX_获得
例如
Integer.MAX_
编程题
public class C1 {
public int stuId; // 学生学号
public int courseId; // 课程编号
public int score; // 分数
/**
将学生成绩列表转换成两级的Map,用于查询任意学生的任意课程成绩
参数 list : 一个学年学生一学期全部课程成绩
返回值Map的key是学生学号,value 的map key是学生的课程编号, value 该学生这门课的成绩
**/
public static Map<Integer, Map<Integer, Integer>> toMap(List<C1> list) {
}
}
答案
Map<Integer,Map<Integer,Integer>> map = new HashMap();
for(C1 tmp:list){
if(map.get(tmp.stuId) == null){
Map<Integer,Integer> grade = new HashMap();
grade.put(tmp.coureseId,tmp.score);
map.put(tmp.stuId, grade);
}
else
map.get(tmp.studId).put(tmp.coureseId,tmp.score);
}
return map;
今天的分享就到这里,因为平台限制许多内容未能呈现给大家,个人手头上的学习资料及相关经验总结有需要、感兴趣的朋友可以加下方小编微信获取“guigui758758” 也可以来我的qq群:1071760506,里面有许多java干货,希望来的是来学习一起共同努力进步的伙伴,一起加油!*