字节跳动面试问题答案

1.动态、静态链接是什么意思?

  1. 静态链接:在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代码都包含到可执行文件中去。
    优点:在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行。
    缺点:程序体积会相对大一些。
  2. 动态链接:动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序
    优点: 多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝。
    缺点: 由于是运行时加载,可能会影响程序的前期执行性能。

2.静态内部类的特点

  1. 静态内部类无需依赖于外部类,它可以独立于外部对象而存在。

  2. 静态内部类,多个外部类的对象可以共享同一个内部类的对象。

  3. 使用静态内部类的好处是加强了代码的封装性以及提高了代码的可读性。

  4. 普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。

3.StringBuffer和StringBuilder的区别

  1. StringBuffer:线程安全,StringBuilder:线程不安全。
  2. StringBuilder 的性能要远大于 StringBuffer。

4.volatile、Synchronized、Threadlocal的区别

  1. vilotile,Synchronized略
  2. ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。

5.写一条sql语句:查找工资第二名的数据

一个Customer表,一个字段Value,现请问如何查到Value中第二大的值

select max(value) from Customer where value < (select max(value) from Customer)

6.java内存模型的理解

  1. JMM是一组规范,需要各个jvm来遵守,以方便开发者可以利用这些规范更方便的开发多线程程序;
  2. 重排序:代码的实际执行顺序和在文件中的顺序不一致,存在编译器优化、cpu指令重排,好处是可以提高速度;
  3. 可见性问题:一个线程对一个变量所做的修改对另一个线程不可见
    原因:CPU有多级缓存,导致读的数据过期
    volatile:所修饰的变量具有可见性,也可以禁止指令重排,但不具备原子性
  4. 原子性:一系列的操作,要么全部执行成功,要么全部不成功,是不可分割的

7.我如果写一个类,名字和String全类名都一样,会加载成功吗,如果成功了加载的是哪个

不会加载成功,加载的依然是jar包中的String类。因为根据双亲委派机制,当需要加载java.lang.String时,会最先委派给BootstrapClassLoader来加载,而它加载的就是核心类,所以会加载jar包中的String。

8.LRU Cache了解过吗

LRU(Least Recently Used) 表示最近最少使用,其内部维护的是LinkedHashMap。
LinkedHashMap是由一个HashMap和一个双向链表组成,它有两种排序方式,一种是按照插入的顺序,另一种便是按照访问的顺序。LRU Cache便使用了按照访问的顺序排序。
在每次插入时,既在哈希表中插入节点,也在链表中插入,每次都插在头节点后面。访问一个元素后,也将它移动到头节点后面。当缓存满了,删除一个元素时,从链表的尾部删除。

发布了60 篇原创文章 · 获赞 6 · 访问量 1225

猜你喜欢

转载自blog.csdn.net/DLC990319/article/details/104909290