查漏补缺第一弹

查漏补缺第一弹

  1. equals == hashcode
    首先 == 比较的是值,基本类型比较的是值,引用类型比较的是地址。
    equals 和 hashcode的关系。
    equals可以重写,可以根据我们的业务需求返回结果,一般重写equals就必须重写hashcode()。流程是,先比较hashcode(),如果结果相同再去比较equals(),如果两个都相同就是发生冲突。我们不希望出现equals()结果相同,hashcode()结果不同的情况。

  2. ThreadLocal的原理

    1. ThreadLocal出现,是为了保证每一个线程都有一个变量的副本,实现数据的隔离。每一个线程都有ThreadLocalMap,里面存放着变量副本。
      ThreadLocal vs Synchronized
    2. ThreadLocal本质上,是为了每一个线程创建了一个数据的副本,所以多线程在同一时间段内,访问的变量是不同的。而Synchroniezd是通过锁的机制实现了数据的共享,在同一个时间段内,多个线程访问的变量是相同的,这就是两者最本质的区别。
    3. ThreadLocal在我眼中是用空间换时间,而Synchronized是用时间换空间。
  3. I/O模型大讲解
    在这里讲解一下:同步和异步的区别。同步是指A调用B,B完成一系列操作后,回应A。而异步是指,A调用B,B先返回给A告诉请求已经收到,再去处理A的请求,最后通过回调函数的方法通知A结果。

    1. BIO模型:同步阻塞模型,进程/线程发起IO请求之后,一直阻塞自身,等到数据准备好,再读取数据。
    2. NIO模型:同步不阻塞模型:发起IO请求后,不阻塞自身,会不断询问CPU自身的数据是否准备好,准备好再读取数据。
    3. I/O多路复用:所有的IO请求被注册到一个选择器中,选择器会定期去查看是否有数据准备好,准备好就让对应的进程读取数据。
    4. 异步IO:进程发起IO请求,等到数据准备好通知发起请求的进程,进程读取数据。
  4. notify()底层原理
    说notify()就必须搭配wait()一起说。wait()和sleep()不同,sleep是不释放锁资源的,而wait是释放锁资源的。只有占有锁资源的线程才可以wait,将自身的waitset设置成waiting状态。通过notify(),可以将waitset为waiting状态的线程唤醒,重新加入锁资源竞争的队列。

  5. Mysql慢查询优化思路,通过log定位到执行慢的SQL语句,通过explain观察SQL是否可以优化。

    1. SQL优化的思路:索引是否设置的合理(比如where条件的字段是否添加了索引,添加索引字段的区分度大不大等),索引是否失效了。
    2. 用between替换in
    3. 用批量插入的insert代替单挑插入的Insert
  6. hashmap扩容算法的时间复杂度为O(n)。

  7. TLS四次握手
    HTTPS就是在HTTP和TCP之间加了一层TLS四次握手,作为加密

    1. 第一次握手:客户端发送:1. 一个随机数client-random。2. 支持的TLS版本。3. 支持的密码套件列表。
    2. 第二次握手:服务端收到客户端发送的信息,确认好支持的版本号,选择一个密码套件,发送一个随机数server-random,和数字证书。
    3. 第三次握手:客户端验证数字证书的正确性,再生成一个随机数pre-master通过公钥加密发送给服务端,双方再通过pre-master生成一个对称密钥,之后的通信通过这个密钥加密。客户端发送通过这个密钥加密的一个摘要
    4. 服务端同理,拿到pre-master之后,也是生成一个摘要发送给客户端。两边确认没有问题之后,就可以开始发送数据了。
  8. Mysql的最左匹配原则。比如Mysql创建了索引 key idx_abc(a,b,c),相当于创建了索引a ,(a,b),(a,b,c)。

  9. java中实现同步的几个方法

    1. Sychronized + notify + wait
    2. ReentrantLocal + Conditional
    3. Semaphore信号量
  10. Mysql的主键要求严格自增吗。
    首先,Mysql的主键是要求自增的。因为B+树作为索引的数据结构,如果主键不是自增的,就会插入数据的时候就必须去寻找合数的位置,而插入的是自增的数据,只需要在末尾插入数据即可。
    其次,建议主键所对应的字段越小越好,因为Innodb非聚餐索引第叶子节点存放的是主键对应的列。如果主键对应的列太大会占据较多的空间。

  11. UDP可靠传输的思路:在应用层,模拟seq/ack机制、超时重传机制等。

  12. HashMap的线程安全思路:1. 使用HashTable。2. 使用CurrentHashMap。3. 使用Collection.sychronizedHashMap方法放回线程安全的HashMap.

  13. Token、Session、Cookie:

    1. Session:当客户端发起请求,服务器就针对客户端的请求,在自身生成一个session记录,给客户端发一个sessionId,当下次客户端再次访问的时候,携带这个sessionId即可。但是会造成服务器压力过大的问题。
    2. Cookie:只有浏览器能用,数据存放在客户端这一方面,用户请求携带cookie,服务器就直接验证。一般来说Cookie和Session一起使用。
    3. Token:是为了缓解Session的服务器压力过大的问题。通过加密算法生成令牌发给用户,用户请求时携带令牌即可。但是会造成一个问题CPU压力过大。
    4. JWT就是一个生成Token的方法,数据传输的时候会通过base64加密。
      1. Header
      2. playload
      3. signature
  14. AQS的原理
    核心思想,空闲让进,忙则等待。

    1. 采用了FIFO思想,维护了一个voliate修饰的state变量和一个CLH队列。state = 0,表示资源空闲可以放进,如果state=1,表示资源不空闲,这个时候就提取信息变成一个node加入CLH队列了,这个队列是先进先出的。
  15. Atomic原子类底层通过:CAS操作+自旋保证正确性。

  16. 类加载机制

    1. 加载,将.class文件加载进入内存,生成一个class对象
    2. 验证,验证class对象是否正确,会有类似语法的校验、文件格式的校验
    3. 准备,将static修饰的变量赋值,这个赋值赋的是默认值,而不是人为定义的值
    4. 解析,将符号引用变成直接引用
    5. 初始化,static修饰的变量替换成人为定义的值
  17. minor gc与full gc的联系
    所谓的空间担保机制。在发生minor gc的时候,会先使用空间担保机制,保证老年代有足够的空间去装载本次会进入老年代的对象。如果没有就会发生full gc。

  18. 双亲委派机制

    1. 当一个类加载器接受到一个类加载的请求的时候,会委派给自己的父类进行类的加载,当父类不能加载的时候会一级一级委派给子类加载器加载。
    2. 优点:避免加载同一个类、防止修改Java中的类
  19. Innodb和myisam的区别

    1. Innodb支持事务而Myisam不支持
    2. Innodb支持行锁而Myisam不支持
    3. Innodb支持外键而Myisam不支持
      20 Mysql中的锁
    4. 全局锁:锁住的是数据库中的所有表
    5. 表锁:
      1. 意向锁:分为意向排它锁和意向共享锁。主要目的是为了减少加表锁的时候对行锁的校验。
      2. 独占写锁
      3. 共享读锁
    6. 行锁:
      1. 记录锁
        1. 排它锁
        2. 共享锁
      2. 间隙锁
      3. 记录锁+间隙锁 解决幻读问题
  20. 指令指的是,源码与指令执行的顺序不一致,但是结果一致,在单线程中没有问题,在多线程可能引发问题

  21. 当进程切换到内核态是发生了系统调用

  22. CPU的上下文切换是指:

    1. 保存上一个进程的现场,程序计数器,寄存器的数据等等存放到进程的内核空间
    2. 加载新进程的程序计数器,寄存器信息等
    3. 执行指令
      OS在分配虚拟内存的时候,给地址划分了内核去和用户区域,上下文存在内核区这一块儿

你可能感兴趣的:(java,数据库,开发语言)