1、抽象类和接口
抽象类:
要想了解抽象类先看一下抽象方法,抽象方法是一个特殊的方法,他只有声明没有具体的实现。抽象方法用abstract关键字修饰。有抽象方法的类就就是抽象类,抽象类也有abstract关键字修饰。
需要注意的是——
- 抽象类的存在就是为了继承,所以用private方法来修饰抽象方法。
- 包含抽象方法的类叫做抽象类,但并不是抽象类里只有抽象方法。
- 子类继承了抽象类必须实现父类的抽象方法,如果没有实现,那么子类也将会是抽象类。
- 抽象类不能用来创建对象。
接口:
接口用关键字interface来实现,接口指的是调用别人的方法或者函数。接口可以看出java是一种对行为的抽象。
接口需要注意的是——
- 接口中可以有变量和方法,并且接口中的变量会被隐式的被public static final来修饰(并且只能用public static final来修饰),方法会隐式的被public abstract来修饰,并且只能用来public abstract来修饰。也就是说接口中所有的方法不能有实现方法,也就是说接口中的方法都是抽象方法。
- 如果要写这个接口的实现方法,需要定义一个实现类,并且通过implements来实现接口中的方法。
2、Redis Pttl 命令
Redis Pttl 命令以毫秒为单位返回 key 的剩余过期时间。
3、如何保证数据库与Redis数据一致
一般做法:只需要在数据存入缓存的时候加上失效时间,这样到一定时间之后,自然会重新查数据库存入缓存,此时两边数据就一致了。
时效性做法:在更新数据的时候重新放入缓存,或者在数据更新时直接删除缓存,那么在下次查询时再重新写入缓存就可以了。
4、如何向快速redis导入大批量数据
使用Luke协议
使用正常模式的Redis客户端进行大容量插入是不明智的,因为一个个的插入会有大量的时间浪费在每一个命令往返时间上。
使用管道(pipelining)还比较靠谱,但是在大量插入数据的同时又需要执行其他新命令时,这时读取数据的同时需要确保尽可能快的写入数据。
只有一小部分的客户端支持非阻塞/输出(non-blocking I/O),并且并不是所有客户端能以最大限度的提高吞吐量到高效的方式来分析答复。
5、java类单继承,接口可以多实现;但是接口间可以多继承。
6、主键和唯一索引的区别
- 主键是一种约束,唯一索引是一种索引;
- 主键创建后一定包含一个唯一性索引,唯一性索引不一定是主键;
- 唯一性索引列允许空值, 主键不允许;
- 主键可被其他表引为外键,唯一索引不能;
- 一个表只能创建一个主键,但可创建多个唯一索引。
7、数据库视图与连接查询
视图是基于 SQL 语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。只保存SQL逻辑,不保存查询结果 。一般用于会在多个地方用到同样的查询结果,或者该查询结果使用的SQL语句较复杂。
- 视图必须在数据库中建立,离开数据库就失去了数据来源,脱离数据库的视图是没有意义的;而查询可以脱离数据库以独立的文件形式存在.
- 查询的结果可以以多种的形式输出,而视图只能以虚拟表的形式浏览和使用.
- 查询只能从数据库中读取数据,不能修改原始数据;而视图可以修改更新数据库
8、常用集合类型
List集合:
- ArrayList是基于索引的数据接口,底层是动态数组,查询快,增删改的速度较慢
- LinkedList是以元素列表的形式存储它的数据,底层是列表,查询慢增删快,
- LinkedList比ArrayList更占用内存因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
- Set集合:HashSet、TreeSet、LinkedHashSet,一般来说,如果我们需要保证集合元素是唯一的,就用set集合,在工作中常用的就是HashSet
Map集合:
- HashMap是最常用的Map,他根据键的HashCode值存储数据,根据键可以直接获取他的值,具有很快的访问速度遍历时,取到的数据顺序是随机的;最多只允许一条记录的键为Null,而可以允许多个记录的值为null;不支持线程同步,是非线程安全的
- HashTable与HashMap类似,他不允许记录的键或者值为空,支持线程同步,所以在写入时较慢,HashTable已经被禁用。
- 如果考虑线程安全的问题时用ConcurrentHashMap,我们很多时候把ConcurrentHashMap用于本地缓存