一.javase
1.jdk1.8新特性
- 搜索速度更快 – 红黑树
- 行为参数化代码更少 – Lambda
- 强大的Stream API – Stream
- 便于并行 – Parallel
- 最大化减少空指针异常 – Optional
2.JVM结构原理、GC工作机制详解
JVM主要包括四个部分
1.类加载器2.执行引擎3.内存区4.本地方法接口
JVM垃圾检测、回收算法:
1.标记-清除(Mark-sweep)2.复制(Copying)3.标记-整理(Mark-Compact)4.分代收集算法
3、Map或者HashMap的存储原理
答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理
4、Java Object类中有哪些方法?
- protected Object clone()创建并返回此对象的一个副本。
- boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
- protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
- Class<?> getClass()返回此 Object 的运行时类。
- int hashCode()返回该对象的哈希码值。
- void notify()唤醒在此对象监视器上等待的单个线程。
- void notifyAll()唤醒在此对象监视器上等待的所有线程。
- String toString()返回该对象的字符串表示。
- void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
- void wait(long timeout)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
- void wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
5、Thread类有哪些方法,如何多种方式实现线程同步
Thread类的常用方法
String getName() 返回该线程的名称。
void setName(String name) 改变线程名称,使之与参数 name 相同。
int getPriority() 返回线程的优先级。
void setPriority(int newPriority) 更改线程的优先级。
boolean isDaemon() 测试该线程是否为守护线程。
void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。
static void sleep(long millis)
void interrupt() 中断线程。
static void yield() 暂停当前正在执行的线程对象,并执行其他线程。
void join() 等待该线程终止。
void run()
void start()
从Object类继承来的方法
void notify()
void wait()
同步方式:
1.同步方法
2.同步代码块
3.使用特殊域变量(volatile)实现线程同步
4.使用重入锁实现线程同步
5.使用局部变量实现线程同步
6、分布式、集群环境中,缓存如何刷新,如何保持同步?
A、缓存如何刷新?
1、定时刷新
2、主动刷新覆盖 ,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可
B、缓存如何保持同步? 这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现 ,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步
7.请写个简单的单例模式
public class Singleton {
private Singleton(){
}
private static class SingletonHolder{
private final static Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
8.事务的四个属性是
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
一致性(Consistency):当事务完成时,数据必须处于一致状态
隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性
9.分布式事务解决方案
一、两阶段提交(2PC/3PC)
二、补偿事务(TCC)
三、本地消息表(异步确保)
四、MQ 事务消息
五、Sagas 事务模型
二、sql
1.Mysql索引类型有哪些?
从数据结构角度
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE
从逻辑角度
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
2.现有一学生表结构(student-id,class-id,name),请写出统计每班有多少学生的sql语句
SELECT 班级名称,COUNT(学号) 人数
FROM 班级表 LEFT JOIN 学生表 ON 班级表.班级编号=学生表.班级
GROUP BY 班级名称
3.数据库锁有哪些,数据库死锁原因及如何避免
一. 事务之间对资源访问顺序的交替
二. 并发修改同一记录
三. 索引不当导致全表扫描
四.事务封锁范围大且相互等待
4.Mybatis 当实体属性与数据库字段不一致时会有什么问题,如实体属性多于数据库字段或着相反的情况?
答:原生态并不会报错,只是实体属性多于数据库字段时此属性不起作用,实体属性少于数据库字段时,数据库字段不映射。但用一些辅助框架,插入时是读取的实体属性,实体属性多于数据库字段时报错。
5、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)
答:看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果
6、一条sql执行过长的时间,你如何优化,从哪些方面?
1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量大的表进行历史表分离(如交易流水表)
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
7、查看mysql执行日志,看看是否有其他方面的问题
个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑
7、数据库存储日期格式时,如何考虑时区转换问题?
使用TimeStamp , 原因参照:Java编程中遇到的时区转换问题
8、 boolean类型、金额类类型、时间类型对于的实体属性与数据库字段的数据类型分别是?
Boolean ,tinyint(1);
BigDecimal,decimal(17,6) ;
Date ,dateTime/需要国家化时用timestamp;
原则实体属性都用包装类
9、 数据库的乐观锁和悲观锁是什么?
数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
原文地址:https://www.cnblogs.com/liboware/p/11964416.html