这份Java面试题整整花了三个月的时间来整理,都是自己在工作中总结出来,记住多少就写多少,希望这份资料可以帮助你们。
1.什么是Redis?
答:Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器
2.Redis有哪些数据结构?
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML
3.Redis的特点什么是?
(1). 支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
(2). 支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
(3). 支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。单进程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
4.Redis的操作是原的性的,怎么保证原子性的?
对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。Redis本身提供的所有API都是原子操作,Redis中的事务其实是要保证批量操作的原子性。多个命令在并发中也是原子性的吗?不一定, 将get和set改成单命令操作,incr 。使用Redis的事务,或者使用Redis+Lua==的方式实现.
5.Redis 内部结构
(1).dict 本质上是为了解决算法中的查找问题(Searching)是一个用于维护key和value映射关系的数据结构,与很多语言中的Map或dictionary类似。 本质上是为了解决算法中的查找问题(Searching)
(2).sds sds就等同于char * 它可以存储任意二进制数据,不能像C语言字符串那样以字符’\0’来标识字符串的结 束,因此它必然有个长度字段。
(3).skiplist (跳跃表) 跳表是一种实现起来很简单,单层多指针的链表,它查找效率很高,堪比优化过的二叉平衡树,且比平衡树的实现,
(4).quicklist(5).ziplist 压缩表 ziplist是一个编码后的列表,是由一系列特殊编码的连续内存块组成的顺序型数据结构,
6.Redis的配置以及持久化方案有几种?
RDB方式
AOF方式
什么是RDB方式?
是RDB是对内存中数据库状态进行快照RDB方式:将Redis在内存中的数据库状态保存到磁盘里面,RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态(默认下,持久化到dump.rdb文件,并且在redis重启后,自动读取其中文件,据悉,通常情况下一千万的字符串类型键,1GB的快照文件,同步到内存中的 时间是20-30秒)
RDB的生成方式:
1、执行命令手动生成有两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求,BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求,创建RDB文件结束之前,客户端发送的BGSAVE和SAVE命令会被服务器拒绝
2、通过配置自动生成可以设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令,可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令
7. 使用过Redis分布式锁么,它是什么回事?
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己的脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:嗯,这小子还不错。
8. Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?
使用keys指令可以扫出指定模式的key列表。对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
9.如果有大量的key需要设置同一时间过期,一般需要注意什么?
如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些
10. Redis的同步机制了解么?
从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
1、面向对象的特征有哪些方面?
1.封装:定义与自己相关的属性和方法,隐藏实现的细节,只向外界提供最简单的编程接口。
2.继承:继承是从已有类得到继承信息创建新类的过程。继承可以提高代码的重用性,JAVA中只允许单一继承。
3.多态性:不同的类型的对象对同一消息作出不同的响应。方法重载(overload)实现的是编译时的多态性(也称为静态多态),而方法重写(override)实现的是运行时的多态性(也称为动态多态)。一般多态通过方法重写来实现。
2、访问修饰符public,private,protected,以及不写(默认)时的区别?
修饰符 当前类 同 包 子 类 其他包
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。
3、String 是最基本的数据类型吗?
答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。
4、int和Integer有什么区别?
1.int是基本数据类型, Integer是int的包装类,包装类提供了很多操作方法,如各种类型直接转换等
2.int默认值为0,integer的默认值为null
3.integer的取值范围-128到127之间4.保存方式不同:Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
5、&和&&的区别?
&运算符有两种用法:
(1)按位与;(2)逻辑与。
&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。
6、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;
通过new关键字和构造器创建的对象放在堆空间;
直接书写的100、"hello"和常量都是放在静态区中。
栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
7.数组有没有length()方法?String有没有length()方法?
数组没有length()方法,有length 的属性。
String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
8.在Java中,如何跳出当前的多重嵌套循环?
答:用break ;可以跳出多重循环。
直接结束所有的循环continue结束本次循环
9.构造方法(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载。
10.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同。
1.数据库三范式
第一范式:对属性的原子性约束,要求字段具有原子性,不可再分解;
第二范式:在满足第一范式的前提下,非主键字段不能出现部分依赖主键;
解决:消除复合主键就可避免出现部分依赖,可增加单列关键字。
第三范式:在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖。
解决:将一个实体信息的数据放在一个表内实现。
2.事务四大特性
(1).原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态
(2).一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;
(3).隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。(4).持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复
3.MySQL的事务隔离级别
(1).未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据
(2).提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。
(3).可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。
(4).串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞MySQL数据库(InnoDB引擎)默认使用可重复读( Repeatable read)
4.MySQL数据库的四类索引
(1)index ---- 普通索引,数据可以重复,没有任何限制。(即针对数据库表创建索引)
(2)unique ---- 唯一索引,要求索引列的值必须唯一,但允许有空值;如果是组合索引,那么列值的组合必须唯一。
(3)primary key ---- 主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的同时创建主键索引。
(4)组合索引 ---- 在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
(5)fulltext ---- 全文索引(基本不使用),是对于大表的文本域:char,varchar,text列才能创建全文索引,主要用于查找文本中的关键字,并不是直接与索引中的值进行比较。fulltext更像是一个搜索引擎,配合match against操作使用,而不是一般的where语句加like。
注:全文索引目前只有MyISAM存储引擎支持全文索引,InnoDB引擎5.6以下版本还不支持全文索引
索引可以提高查询的速度,但是创建和维护索引需要耗费时间,同时也会影响插入的速度,如果需要插入大量的数据时,最好是先删除索引,插入数据后再建立索引。
索引生效条件
假设index(a,b,c)
最左前缀匹配:模糊查询时,使用%匹配时:’a%‘会使用索引,’%a‘不会使用索引
条件中有or,索引不会生效
a and c,a生效,c不生效
b and c,都不生效
a and b > 5 and c,a和b生效,c不生效。
5.delete、drop、truncate区别
truncate 和 delete只删除数据,不删除表结构 ,drop删除表结构,并且释放所占的空间。删除数据的速度,drop> truncate > deletedelete属于DML语言,需要事务管理,commit之后才能生效。drop和truncate属于DDL语言,操作立刻生效,不可回滚。使用场合:当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录时(always with a where clause), 用 delete.
6.sql语句分类
DDL:数据定义语言(create drop)
DML:数据操作语句(insert update delete)
DQL:数据查询语句(select )
DCL:数据控制语句,进行授权和权限回收(grant revoke)
TPL:数据事务语句(commit collback savapoint)
7.有哪些数据库优化方面的经验?定位
查找、定位慢查询在项目自验项目转测试之前,在启动mysal数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一定时间后,通过查看日志找到慢查询语句.使用explain慢查询语句,来详细分析语句的问题.
优化手段:
创建索引:创建合适的索引,我们就可以先在索引中查询,查询到以后直接找对应的记录.分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来t化读写分高:当一台服务器不能满足需求时,采用读写分离的方式进行集群缓存:使用redis来进行缓存一些常用优化技巧
8.mysql中varchar与char的区别以及varchar(50)中的50代表的涵义?
(1).varchar与char的区别: char是一种固定长度的类型,varchar则是一种可变长度的类型.
(2).varchar(50)中50的含义 : 最多存放50个字节
(3).int(20)中20的含义: int(M)中的M indicates the maximum display width (最大显示宽度)for integer types. The maximum legal display width is 255.
9为什么要尽量设定一个主键?
主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键.设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全.
10.如果要存储用户的密码散列,应该使用什么字段进行存储?
密码散列,盐,用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率.个ID ;
(2).选择正确的存储引擎 ;
(3).使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob;
(4).使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数;
(5).使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar;
(6).尽可能使用not null定义字段(给空字段设置默认值);
(7).尽量少用text;
(8).给频繁使用和查询的字段建立合适的索引;
为了不影响观看只选取了其中的三个部分,我也整理了一份 架构师全套视频教程 和关于java的系统化资料,从Javase- ssm-springcloud,包括java核心知识点、面试专题和20年最新的互联网真题、电子书等都有,想学习Java或者转行,大学生都非常实用,免费分享给大家~有需要的朋友可以点一点下方链接免费领取!
链接:点这里!!!暗号:CSDN