Java面试总结

小小又去面试啦,对面试题再次的总结。

redis 相关

redis 有几种数据结构

redis有五种数据结构,分别是String(字符串),Hash(字典),List(列表),Set(集合),Sorted Set(有序集合)
这五种数据结构是redis的五种数据结构

Redis持久化方式

redis持久化方式有两种,分别是快照和追加式文件,
1. 对于快照而言,持久化会在特定的时间间隔,保存时间点的数据快照。
2. 追加式文件持久化方式服务器在收到写操作的时候,在服务器启动的时候,会逐条的执行,从而重建里面的数据,写操作记录的格式和redis协议一样,以追加的方式保存。
3. 两种持久化方式会长久的存在,当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;

发表评论

电子邮件地址不会被公开。 必填项已用*标注