北京JAVA开发3年,拿到美团35K的offer面试心得

本文是一位在北京拥有3年经验的JAVA开发者分享的美团面试经历,涵盖了JAVA基础、JVM、开源框架、操作系统、多线程、TCP与HTTP等多个方面,深入解析了面试中遇到的问题和答案,旨在帮助读者提升面试技巧和专业能力。
摘要由CSDN通过智能技术生成

前言

长文干货提示,文章为大家完整记录了一位在北京做了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*075),一般为原内存的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中此类关系通过关键字

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值