作者:offer能来否
链接:https://www.nowcoder.com/discuss/423235?type=post&order=time&pos=&page=1&channel=&source_id=1
来源:牛客网
(1)==和equals区别
https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md#equals
(2)static修饰的成员变量运行时机
在类初始化的时候运行?
(3)内部类和静态内部类区别
https://www.cnblogs.com/hustdc/p/8894073.html
静态内部类:用static修饰的内部类
生成静态内部类不需要外部类的对象Outer.Inner in=new Outer.Inner();
一般非静态外部类可以随意访问其外部类的成员变量以及方法(包括声明为private的方法),静态内部类不能访问其外部类的非静态成员变量和方法
(4)为什么要重写equals方法
为了判断两个对象是否等价,因为对象等价不只是hashcode相等,属性值也得相等,此外,在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法,保证等价的两个对象哈希值也相等。
(5)HashMap底层数据结构,以及put方法和resize方法
https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%AE%B9%E5%99%A8.md#hashmap
扩容:
(6)说一下ConcurrentHashMap底层数据结构,以及如何保证线程安全的
ConcurrentHashMap 和 HashMap 实现上类似,最主要的差别是 ConcurrentHashMap 采用了分段锁(Segment),每个分段锁维护着几个桶(HashEntry),多个线程可以同时访问不同分段锁上的桶,从而使其并发度更高(并发度就是 Segment 的个数)。Segment 继承自 ReentrantLock。默认16个se
(7)说一下序列化,网络传输使用什么序列化
将数据对象转换为二进制流的过程称为对象的序列化(Serialization)。反之,将二进制流恢复为数据对象的过程称为反序列化(Deserialization)。
三种序列化方法:https://www.cnblogs.com/lzh1043060917/p/12834962.html
用JSON序列化???不会
(8)说一下泛型底层实现原理—类型擦除
https://www.nowcoder.com/tutorial/94/f5c9640c0b9a4891bc507615f1ffe170
不会,连泛型是啥都没说明白
并发
(1)说一下JUC包下的同步工具
(2)synchronized修饰方法和代码块区别
(3)volatile如何怎么保证有序性和可见性
https://www.jianshu.com/p/157279e6efdb
有序性:其中有条就是volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;有序性实现的是通过插入内存屏障来保证的。
可见性:加了volatile关键字的代码生成的汇编代码发现,会多出一个lock前缀指令。Lock指令对Intel平台的CPU,早期是锁总线,这样代价太高了,后面提出了缓存一致性协议,MESI,来保证了多核之间数据不一致性问题。
编译之后有个lock,最初是锁总线,之后缓存一致性协议,MESI,
(4)说一下线程池,以及线程池的几个核心参数,如果提交一个cpu密集型的任务怎么选取线程池
不会
(5)用volatile+synchronized写一个单例模式,用双重校验锁方法,说出两个if判断语句的作用
不会
(6)线程的几种状态,并指出在哪种状态下可以中断,中断原理
中断:
阻塞、限期等待或者无限期等待状态,其他不想看了
JVM
- 说一下几种引用方式,并说出其作用,以及垃圾回收时机(不知道)
- 一个static成员变量如何进行内存分配及赋值(属于类,类加载时候就有了)
算法题
找到一个链表的倒数第k个节点
中间等待了15分钟~~~~