【面经】小米Java开发日常实习

目录

一 介绍一下你了解的设计模式

二 了解动态代理和反射吗?Java中有哪些技术应用到了反射技术

三 从输入一条 url 地址到显示,经历了什么过程

四 get 请求和 post 请求有什么不同?还有什么请求类型    

五 类加载机制

六 怎么避免加载重复的类

七 JVM 内存里面还有哪些区域

八 形成的死锁得条件有哪些

九 java 加锁有哪些方式?

十 了解对象头吗? 

十一 介绍一下 concurrentHashMap 底层原理

十二 线程池

十三 RPC 框架


一 介绍一下你了解的设计模式

【设计模式】一文带你搞懂什么是“设计模式?”_对设计模式的了解-CSDN博客

        设计模式是为了解决软件开发中常见问题的典型方案,主要分为三类:创建型、结构型、行为型。

1.创建型模式

        单例模式:保证一个类只有一个实例,并提供全局访问点。

        工厂模式:定义一个接口用于创建对象,但让子类决定实例化哪个类。

        抽象工厂模式:提供一个接口用于创建相关或依赖对象的家族,而无需明确指定具体类。

        建造者模式:将复杂对象的创建与它的表示分离,使得相同的构建过程可以创建不同的对象。

        原型模式:通过复制现有实例来创建新的对象,避免重复初始化。

2.结构型模式

        适配器模式:将一个类的接口转换成客户期望的另一个接口,解决不兼容的问题。

        桥接模式:将抽象部分与它的实现部分分离,使它们可以独立变化。

        装饰器模式:动态地给对象增加行为或功能。

        代理模式:为其他对象提供一个代理以控制对这个对象的访问。

        外观模式:提供一个简化的接口来调用一组类或方法。

        组合模式:将对象组合成树形结构来表示“部分-整体”层次结构。

        享元模式:通过共享来减少对象创建,提高性能。

3.行为型模式

        策略模式:定义一系列算法,将它们封装起来,并使它们可以互相替换。

        观察者模式:定义对象间的一对多依赖关系,使得当一个对象状态发生变化时,所有依赖对象都会收到通知并自动更新。

        状态模式:允许对象在内部状态改变时改变其行为。

        模板方法模式:定义一个操作的框架,将一些步骤延迟到子类中。

        命令模式:将请求封装为对象,从而使得用户可以使用不同的请求、队列、日志请求等方式来参数化对象。

        责任链模式:将请求沿着处理链传递,直到某个对象处理它。

        迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。

二 了解动态代理和反射吗?Java中有哪些技术应用到了反射技术

        在运行时创建代理对象,代理对象可以拦截并控制方法的执行。Java 中动态代理常通过 java.lang.reflect.ProxyInvocationHandler 来实现。

        反射是一种机制,可以在运行时动态地获取类的信息(如字段、方法、构造函数等),并且可以在运行时创建对象或调用方法。Java 中通过 java.lang.reflect 提供的 API 进行反射操作。

        反射的应用包括:

框架(如 Spring):大量使用反射机制来动态注入依赖、管理对象生命周期。

JDBC:数据库驱动程序通过反射加载数据库驱动类。

序列化与反序列化:通过反射读取对象的属性和类型。

三 从输入一条 url 地址到显示,经历了什么过程

        DNS 解析:将 URL 中的域名解析为 IP 地址。

        TCP 连接:通过三次握手建立 TCP 连接。

        发送 HTTP 请求:浏览器向服务器发送 HTTP 请求。

        服务器处理请求:服务器接收请求并生成响应,可能涉及动态页面生成或数据库查询。

        返回 HTTP 响应:服务器将响应数据(HTML、CSS、JS 等)通过 TCP 连接返回浏览器。

        浏览器渲染:浏览器解析 HTML,构建 DOM 树和 CSSOM 树,结合后生成渲染树,并布局、绘制页面。

        关闭连接:浏览器和服务器之间的 TCP 连接通过四次挥手断开。

四 get 请求和 post 请求有什么不同?还有什么请求类型  

        GET 请求:参数通过 URL 传递,数据量有限(URL 长度限制)。数据暴露在地址栏,安全性低。用于获取数据,幂等。

        POST 请求:参数通过请求体传递,数据量没有限制。数据不在 URL 中显示,相对安全。用于提交数据,非幂等。

        其他请求类型包括:PUT用于更新资源;DELETE用于删除资源;HEAD类似 GET,但不返回响应体,只获取响应头;OPTIONS;查询服务器支持的 HTTP 方法。

五 类加载机制

        Java 的类加载机制分为三个步骤:

        1.加载:通过类加载器将 .class 文件加载到 JVM 中。

        2.链接

        验证:确保类文件格式正确。

        准备:为类的静态变量分配内存并赋予默认值。

        解析:将符号引用转换为直接引用。

        3.初始化:执行类的静态代码块和赋值语句。

六 怎么避免加载重复的类

        使用双亲委派模型,Java 中的类加载器采用父类委派机制,防止同一个类被多次加载。即由子类加载器先请求父类加载器,如果父类加载器无法加载,再由子类加载器加载类,避免重复加载类。

七 JVM 内存里面有哪些区域

        方法区:存储类的元数据、静态变量、常量等。

        堆:存储对象实例和数组,GC 主要作用在这里。

        栈:线程私有,存储局部变量、操作数栈和帧数据。

        程序计数器:记录当前线程执行的字节码指令位置。

        本地方法栈:存储本地方法调用信息。

八 形成的死锁的条件有哪些

        互斥条件:一个资源每次只能被一个线程占用。

        持有并等待:线程持有资源的同时,等待其他线程持有的资源。

        不可抢占:线程持有的资源不可被强制抢占。

        循环等待:多个线程形成循环等待资源的情况。

九 java 加锁有哪些方式?

        synchronized:Java 内置锁,通过对象头的 monitor 实现,可用于方法或代码块。

        Lock 接口:如 ReentrantLock,提供更灵活的锁定机制。

        CAS (Compare-And-Swap):无锁机制,依赖于硬件支持,用于原子类(如 AtomicInteger)等。

十 了解对象头吗?

        Java 对象头是对象在内存中的布局,主要包含Mark Word:存储对象的运行时信息(如哈希码、GC 状态、锁信息等);Class Pointer:指向对象的类元数据。

十一 介绍一下 concurrentHashMap 底层原理

        JDK1.7中的ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成,即ConcurrentHashMap 把哈希桶切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。其中,Segment 继承了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色;HashEntry 用于存储键值对数据。

        在数据结构上, JDK1.8 中的ConcurrentHashMap 选择了与 HashMap 相同的数组+链表+红黑树结构;在锁的实现上,抛弃了原有的 Segment 分段锁,采用CAS + synchronized实现更加低粒度的锁。将锁的级别控制在了更细粒度的哈希桶元素级别,也就是说只需要锁住这个链表头结点(红黑树的根节点),就不会影响其他的哈希桶元素的读写,大大提高了并发度。

十二 线程池

        线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。

        使用线程池的好处包括:

  • 降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

  • 提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。

  • 提高线程的可管理性。 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

十三 RPC 框架

        RPC(Remote Procedure Call)是一种通过网络调用远程服务的技术。常见的 Java RPC 框架有:

        Dubbo:高性能的 Java RPC 框架,支持自动服务发现和负载均衡。

        gRPC:基于 HTTP/2 协议和 Protocol Buffers 序列化的高效跨语言 RPC 框架。        

        Spring Cloud:集成了多种分布式服务和 RPC 功能,便于构建微服务系统。

猜你喜欢

转载自blog.csdn.net/Liu_y_xin/article/details/141900375