Java后端开发面试题(含答案)
在广州一个小公司(BOSS标注是20-99人,薪资2-3k左右),直接面试没有笔试,按流程自我介绍,然后直接拿着简历问项目场景,问题是结合场景题和八股文。废话不多说,直接分享面试题目个大家做参考。
1、List和Map的区别?
(1)接口和继承关系:List继承自Collection接口,属于单列集合,用于存储单个元素序列。常见的实现类包括ArrayList、LinkedList和Vector;Map是一个独立接口,属于双列集合,用于存储键值对数据。常见的实现类包括HashMap、TreeMap、LinkedHahMap、ConcurrentHashMap;
(2)存储结构和元素特性:List具有有序性和可重复性,元素按插入顺序存储,ArrayList支持通过索引直接访问;Map每个键对应一个值,键不可重复,值可以重复。大部分实现类不保证顺序,但LinkedHashMap维护插入顺序,TreeMap按键排序;
2、JWT和Token的区别?
Token 是一个广义的概念,它指的是一种代表用户身份或会话状态的字符串,常用于身份验证和授权。在登录成功后,服务器会生成一个 Token 发给客户端,客户端在之后的请求中携带这个 Token,用于证明自己的身份。
而 JWT 是一种具体的 Token 实现格式,全称是 JSON Web Token。它是一种基于 JSON 的开放标准(RFC 7519),由三部分组成:Header(头部)+ Payload(载荷)+ Signature(签名),用.
连接。JWT 不仅能携带身份信息,还可以加密签名,具有自包含、跨平台、可验证等特点。
总结一句话:
Token 是一种机制,JWT 是 Token 的一种实现方式。所有的 JWT 都是 Token,但不是所有的 Token 都是 JWT。
3、sleep和wait的区别?
wait和sleep方法都是用来暂停线程的执行,但他们有很大的区别如下:
(1)归属类不同:wait方法是Object类中的一个方法,被finally修饰,不可被重写,因此每个对象都可以调用wait方法;而sleep是Thread类中的一个静态方法,只能通过Thread类来调用;
(2)醒来机制不同:wait()方法用于让当前线程进入等待状态,直到有其他线程调用该对象的notify()或notifyAll()方法;wait(long)和sleep(long)方法用于使当前线程暂停执行指定的时间,然后恢复运行;
(3)锁特性不同(重点):wait方法的调用是基于对象的监视器锁实现的,只能放在同步代码块或同步方法中,wait方法执行后会释放对象锁;而sleep没有这个限制,sleep如果在synchronized代码块中执行,并不会释放对象锁;
4、synchronized和Lock有什么区别?
(1)底层实现和使用:synchronized是关键字,源码在JVM中的本地方法区,用C++实现的,基于对象的监视器锁实现的,它可以用来修饰方法或代码块,确保同一时刻只有有一个线程访问该方法或代码块;而Lock是个接口,源码有JDK提供,用Java语言实现的,基于AQS抽象队列同步器实现的,需要显示创建实现了Lock接口的对象,比如ReentrantLock;
(2)锁的获取和释放:synchronized锁的获取和释放是隐式的,当一个线程进入synchronized块时会自动尝试获取锁,没有获得锁会被阻塞直到获取锁,线程离开就会自动释放锁;而Lock的获取和释放都需要显式的设置,调用lock.lock() 来获取锁,调用lock.unlock()来释放锁;
(3)功能层面:二者都属于悲观锁,都具备基本的互斥、同步功能。但Lock提供了很多synchronized不具备的功能,比如公平锁,可中断,可超时,多条件变量;Lock有适合不同场景的实现,如ReentrantLock,ReentranReadWriteLock;
(4)性能方面:在没有线程竞争情况下,synchronized做了很多优化,如偏向锁,轻量级锁,使用CAS操作减少了性能开销;如果竞争比较激烈,Lock的实现通常会提供更好的性能(比如尝试锁、定时锁);
(5)尝试获取锁机制:synchronized获取锁是不可中断的,如果一个线程无法获取锁,他会一直等待直到获取锁;而Lock是可中断的,可以调用tryLock()方法尝试获取锁,并在指定时间内等待,等待时间过后就放弃获取锁实现其他逻辑
5、前后端连桥需要注意什么?
(1)接口规范统一:定义好清晰的API文档,包括请求方式、URL、参数和响应接口等,前后端对参数名、数据格式、返回字段必须达成一致;
(2)跨域处理:当前端和后端不在同一域名或端口下时,后端需要开启CORS支持,设置响应头如 Access-Control-Allow-Origin
(3)数据格式一致:请求体一般采用application/json,避免默认application/x-www-form-urlencoded带来的数据解析问题;确保前后端对于布尔型、数字、时间等数据类型解析一致;
(4)鉴权与安全:登陆成功后建议使用Token进行认证,前端每次请求携带Token(通常放在请求头Authorization中),注意Token过期处理、刷新机制、接口权限校验。