Redis常考面试题目
Redis为什么这么快
完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
使用多路I/O复用模型,非阻塞IO;
使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
Redis支持的数据类型和使用场景
String 常规计数:微博数,粉丝数等。
Hash 适合存储对象
List 底层实现为双向链表,可反向查找和遍历。 应用场景:微博的关注列表,粉丝列表,消息列表等。
Set 可以自动去重 应用场景:共同关注、共同粉丝等。
Sorted Set 权重score使得集合中的元素可以按照score有序排列。 ...
Mysql面试高频题目
说说MySQL有哪些存储引擎、都有哪些区别
一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求。常见的存储引擎就 InnoDB、MyISAM、Memory、NDB。InnoDB 是 MySQL 默认的存储引擎,支持事务、行级锁定和外键。
InnoDB 支持事务,MyISAM不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
InnoDB 是聚簇索引,MyISAM 是非聚簇索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB 不保存表的具体行数,执行select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
InnoDB 最小的锁粒度是行锁,MyIS ...
线程进程相关面试题
如何创建线程
继承Thread类 重写run方法
实现Runnable接口 重写run方法
实现Callable接口 Callable的 call() 方法可以返回值和抛出异常
可以使用Executor框架来创建线程池
Thread 类中的start() 和 run()方法有什么区别?start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用执行,没有新的线程启动,start()方法才会启动新线程。
进程和线程首先从定义上理解就有所不同
进程是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独立运行的一段程序。
线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。在运行时,只是暂用一些计数器、寄存器和栈 。
他们之间的关系一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。 资 ...
JVM高频面试题目
简单描述一下JVM的内存模型jvm内存主要分为五个部分:方法区,java堆,java栈,程序计数器,本地方法栈。
方法区(永久代,线程共享):存储被虚拟机加载的类信息,常量,静态常量,静态方法,运行时常量池等。
java堆(线程共享):存放所有new出来的东西。 1.堆是java虚拟机所管理的内存区域中最大的一块,java堆是被所有线程共享的内存区域,在java虚拟机启动时创建,堆内存的唯一目的就是存放对象实例,几乎所有的对象实例都在堆内存分配空间。2.堆是GC管理的主要区域,从垃圾回收的角度看,由于现在的垃圾收集器都是采用的分代收集算法,因此java堆还可以初步细分为新生代和老年代。
java栈(线程私有方法级):为虚拟机执使用到的方法服务。每个方法被调用的时候都会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。局部变量表存放的是:编译期可知的基本数据类型、对象引用类型。
程序计数器(线程私有):保证线程切换后能恢复到原来的位置。在线程创建时创建,指向下一条指令的地址,执行本地方法时,其值为undefined。为了线程切换后能够恢复到正确的执行位置,每条线 ...
Java集合相关面试题
map HashMap HashTable ConcurrentHashMap (必须阅读源码,必问题目)
父类不同 HashTable 继承 Dictionary, HashMap 继承 abstractMap,它们都是Map接口的实现类 ,都是键值对集合。
最重要的区别:多线程同步特性不同 HashMap同一时间允许多个线程同时进行操作,效率相对较高 但是可能出现并发错误;Hashtable 同一时间只允许一个线程进行操作,效率相对较低 但是不会出现并发错误。
它们对于null的处理不同 HashMap 无论主键还是值对象,都可以存放null,只不过主键要求唯一,所以只能存放一个null;Hashtable对null零容忍,无论主键还是值 都不能添加null,否则直接出现异常。
它们底层实现的细节不同 HashMap 底层默认分16个小组 分组组数可以指定,但最终结果一定是2的n次方数(为什么呢)因为计算散列小组的时候 使用:x & (分组组数-1),效率高; Hashtable 底层默认分11个小组,分组组数可以任意指定,计算散列小组的时候 使用: ...
Java基础面试题
String StringBuffer StringBuilder
运行速度快慢为:StringBuilder > StringBuffer > String
操作数量较少的字符串用String,不可修改的字符串;在单线程且操作大量字符串用StringBuilder,速度快,但线程不安全,可修改;在多线程且操作大量字符串用StringBuffer,线程安全,可修改。
for循环中追加字符串 IDEA会提示使用StringBuilder
扩容机制:StringBuffer/StringBuilder在没有传参的情况下默认初始容量是16;有参数的情况下,初始容量是16+字符串的长度,并且是用append()方法追加的字符。ensureCapacityInternal()int newCapacity = (value.length << 1) + 2;增加为自身长度的一倍然后再加2;这个时候如果还是放不下,那就直接扩容到它需要的长度 newCapacity = minCapacity;
包装类 基本数据类型、 拆箱装箱、常量池缓存机制
包装类是对象,有自己的 ...