前言
长文干货提示,文章为大家完整记录了一位在北京做了3年的JAVA开发的朋友,如何通过美团的面试及拿到35K的offer,请记得点赞收藏支持哦!
文章末尾有为大家准备好的JAVA面试资料。
面试总结
JAVA基础
1. JAVA中的几种基本数据类型是什么,各自占用多少字节,Integer占几个字节.
1 2 3 4 5 |
八种基本数据类型, int ( 4 ), short ( 2 ), byte ( 1 ), long ( 8 ), float ( 4 ), double ( 8 ), char ( 2 ), boolean ( 1 ) Integer占用 32 位:Header(标记头 4 字节 + 对象指针 4 字节) + int ( 4 字节)+ 对齐( 4 ) = 16 字节 64 位:Header(标记头 8 字节 + 对象指针 8 字节) + int ( 4 字节)+ 对齐( 4 ) = 24 字节 64 位(开启指针压缩):Header(标记头 8 字节 + 对象指针 4 字节) + int ( 4 字节)+ 对齐( 0 ) = 16 字节 |
2. String类能被继承吗,为什么.
1 |
String是一个被 final 修饰的类,不能被继承 |
3. String,Stringbuffer,StringBuilder的区别.
1 2 3 |
String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为 final class ,除了hash这个属性其它属性都声明为 final ,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响. StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了 synchronized .但是保证了线程安全是需要性能的代价的.在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1. 5 发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销. StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的 char 数组(JDK 9 以后是 byte 数组). |
4. ArrayList和LinkedList有什么区别.
1 2 |
ArrayList底层是数组实现,具有数组的特性,增删慢,查询快 LinkedList底层是采用链表来实现,增删快,查询慢 |
5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序.
1 2 |
类的实例化顺序:先静态再父子 父类静态数据->子类静态数据->父类字段->子类字段->父类构造函数->子类构造函数 |
6. 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等.
1 2 3 4 5 6 7 8 9 |
最常用的Map实现类有:HashMap,ConcurrentHashMap(jdk1. 8 ),LinkedHashMap,TreeMap,Hashtable; 其中最频繁的是HashMap和ConcurrentHashMap,他们的主要区别是HashMap是非线程安全的.ConcurrentHashMap是线程安全的. 并发下可以使用ConcurrentHashMap和Hashtable,他们的主要区别是: ( 1 ). ConcurrentHashMap的hash计算公式:(key. hascode()^ (key. hascode()>>> 16 )) & 0x7FFFFFFF Hashtable的hash计算公式:key. hascode()& 0x7FFFFFFF ( 2 ). Hashtable存储方式都是链表+数组,数组里面放的是当前hash的第一个数据,链表里面放的是hash冲突的数据 ConcurrentHashMap是数组+链表+红黑树 ( 3 ). 默认容量都是 16 ,负载因子是 0.75 .就是当hashmap填充了 75 %的busket是就会扩容,最小的可能性是( 16 * 0 . 75 ),一般为原内存的 2 倍 ( 4 ). 线程安全的保证:Hashtable是在每个操作方法上面加了 synchronized 来达到线程安全,ConcurrentHashMap线程是使用CAS(compore and swap)来保证线程安全的 |
7. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计.
1 2 3 |
jdk8 放弃了分段锁而是用了Node锁,减低锁的粒度,提高性能,并使用CAS操作来确保Node的一些操作的原子性,取代了锁. 但是ConcurrentHashMap的一些操作使用了 synchronized 锁,而不是ReentrantLock,虽然说jdk8的 synchronized 的性能进行了优化, 但是我觉得还是使用ReentrantLock锁能更多的提高性能(优先使用 synchronized ,虚拟机一直在优化这个锁) |
8. 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的.
1 2 |
顺序的Map实现类:LinkedHashMap,TreeMap LinkedHashMap是基于元素进入集合的顺序或者被访问的先后顺序排序,TreeMap 则是基于元素的固有顺序(默认是hashcode,可以实现Comparable自定义排序规则). |
9. 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么.
1 |
抽象类有构造方法,接口没有;抽象类中可以有方法的实现( 8 以后接口也可以了, default 方法),类只能单继承,接口可以继承多个接口,类可以实现多个接口 |
10. 继承和组合的区别在哪.
1 2 |
继承指的是一个类继承另外的一个类的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字
|