小米Java面试

该博客围绕Java面试展开,涵盖面向对象特性、让HashMap线程安全的方法、synchronized原理、线程池核心参数、联合索引、GET/POST区别、缓存雪崩、Spring bean配置、Java集合框架基础接口以及MyBatis分页等技术问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、面向对象特性

封装、继承、多态
   封装和继承目的都是为了代码重用,多态目的是为了接口重用。
封装
    封装是把客观事物抽象成类,并且把自己的属性和方法让可信的类或对象操作,对不可性的隐藏。
继承
    继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态
    重载(Overload):是一个类中多态性的一种表现,指同一个类中不同的函数使用相同的函数名, 但是函数的参数个数或类型不同。可以有不同的返回类型;可以有不同的访问修饰符; 可以抛出不同的异常。调用的时候根据函数的参数来区别不同的函数。
   重写(Override): 是父类与子类之间的多态性,是子类对父类函数的重新实现。函数名和参数与父类一样,子类与父类函数体内容不一样。子类返回的类型必须与父类保持一致;子类方法访问修饰符的限制一定要大于父类方法的访问修饰(public>protected>default>private); 子类重写方法一定不能抛出新的检查异常或者比被父类方法申明更加宽泛的检查型异常。

2、 怎么让hashmap线程安全

我们都知道。HashMap是非线程安全的(非同步的)。那么怎么才能让HashMap变成线程安全的呢?
我认为主要可以通过以下三种方法来实现:
1.替换成Hashtable,Hashtable通过对整个表上锁实现线程安全,因此效率比较低
2.使用Collections类的synchronizedMap方法包装一下。方法如下:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)  返回由指定映射支持的同步(线程安全的)映射
3.使用ConcurrentHashMap,它使用分段锁来保证线程安全
通过前两种方式获得的线程安全的HashMap在读写数据的时候会对整个容器上锁,而ConcurrentHashMap并不需要对整个容器上锁,它只需要锁住要修改的部分就行了

3、synchronized原理

原子性
    所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
可见性
    可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。
有序性
    有序性值程序执行的顺序按照代码先后执行。
可重入性
    synchronized和ReentrantLock都是可重入锁。当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,这种情况属于重入锁。通俗一点讲就是说一个线程拥有了锁仍然还可以重复申请锁。

4、线程池核心参数

corePoolSize:核心线程数
    线程池中的常驻线程数量,也叫固定线程数

maximumPoolSize:最大线程数
    线程池中能够容纳的同时执行的最大线程数

KeepAliveTime:空闲线程存活时间
    指的是多余的空闲线程的存活时间。当线程池中的线程数量超过corePoolSize
    (固定线程数)时,并且当其空闲时间达到keepAliveTime时多余的线程
    会被销毁掉,直到只剩下corePoolSize个线程为止

TimeUnit:时间单位
    keepAliveTime的单位

BlockingQueue:工作队列
    任务队列,被提交但还没有执行的任务就会被存入任务队列中

TheadFactory:线程工厂
    线程工厂,表示生成线程池中工作线程的工厂,一般我们使用默认的即可

RejectedExecutionHandler
    拒绝策略,指的是当工作队列满了,并且工作线程大于等于线程池中的
    最大线程数 (maximumPoolSize) 时,如拒绝请求的策略
    默认的策略是AbortPolicy,也就是直接抛出异常。

5、联合索引

联合索引的最左前缀匹配指的是where条件一定要有联合索引的第一个字段
是否走联合索引与where条件的顺序无关,只与字段有关
所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,
那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,
当遇到范围查询(>、<、between、like)就会停止匹配。
联合索引大致类似上面的B+树结构,所以当索引的维护其实是以第一个字段来优先排
序的,如果你的查询条件里没有第一个字段就没法通过索引比较来定位数据

6、GET /POST 区别

GET - 从指定的资源请求数据。能被缓存。
POST - 向指定的资源提交要被处理的数据。不能缓存。
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。
在发送密码或其他敏感信息时绝不要使用 GET !
POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
GET 请求刷新服务器或者回退没有影响,POST 请求回退时会重新提交数据请求。

7、缓存雪崩

当某一个时刻出现大规模的缓存失效的情况,
那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,
如果在高并发的情况下,可能瞬间就会导致数据库宕机。
这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。
这就是缓存雪崩。

8、Spring的bean是单例吗?怎么配置多例

Spring的bean默认都是单例的,某些情况下,单例是并发不安全的,以Controller举例,
问题根源在于,我们可能会在Controller中定义成员变量,如此一来,多个请求来临,
进入的都是同一个单例的Controller对象,并对此成员变量的值进行修改操作,
因此会互相影响,无法达到并发安全(不同于线程隔离的概念,后面会解释到)的效果。
配置多例:
<bean id="user" class="..." scope="prototype"/>
多例模式:任何一个实例都是新的实例,调用getBean时,就new一个新实例

9. Java 集合框架的基础接口有哪些

Collection 为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java 平台不提供这个接口任何直接的实现。
Set 是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。
List 是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List 更像长度动态变换的数组。
Map 是一个将 key 映射到 value 的对象.一个 Map 不能包含重复的 key:每个 key 最多只能映射一个 value

10、Mybatis 是如何进行分页的?分页插件的原理是什么?

1)Mybatis 使用 RowBounds 对象进行分页,也可以直接编写 sql实现分页,也可以使用 Mybatis的分页插件。
2)分页插件的原理:实现 Mybatis 提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql。
举例:select * from student,拦截 sql 后重写为:select t.* from (select * from student)t limit 0,10
### 小米外包项目 Java 开发工程师面试题汇总及答案解析 #### 关于Bean的生命周期和Spring框架中的常见问题 在Spring框架中,理解`bean`的生命周期对于开发人员来说至关重要。当一个`bean`被实例化时,会经历一系列初始化方法调用,这些方法可以由开发者自定义来执行特定逻辑[^1]。 - **前置处理器**:可以通过实现`InitializingBean`接口或使用`@PostConstruct`注解的方法,在`bean`属性设置完成后立即运行。 - **销毁阶段**:同样地,通过实现`DisposableBean`接口或是利用`@PreDestroy`注解指定的方法,在容器关闭之前清理资源。 针对循环依赖的问题,Spring提供了多种解决方案,比如延迟加载(`lazy-init`)、构造函数注入替代setter注入等方式减少此类情况的发生;而对于分布式系统的构建,则涉及到`Spring Cloud`组件的选择与配置优化等方面的知识点。 #### Android平台OpenGL ES绘图机制的理解 对于移动应用特别是涉及图形处理的应用程序而言,了解底层API如OpenGL ES的工作原理非常重要。具体到Android平台上使用的`GLSurfaceView`类具有如下特点: - 它负责创建并管理用于绘制OpenGL场景所需的特殊内存区域——即所谓的surface; - 同时也掌管着EGL显示对象,使得OpenGL能够将渲染结果输出至该surface之上; - 支持后台线程上的持续重绘操作而不干扰主线程的任务调度,从而提高了应用程序响应速度和用户体验质量[^2]。 #### 动态代理模式及其应用场景分析 动态代理允许程序员不修改原有业务逻辑的前提下增加额外功能,这通常借助Java反射机制完成。下面是一个简单的例子展示了如何基于给定的目标对象创建其对应的代理版本,并在其前后添加日志记录或其他横切关注点的操作[^3]: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxyHandler implements InvocationHandler { private final Object targetObject; public DynamicProxyHandler(Object obj) { this.targetObject = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before calling " + method.getName()); try { return method.invoke(targetObject, args); } finally { System.out.println("After called " + method.getName()); } } } ``` 此代码片段实现了基本的日志打印功能,实际工作中还可以扩展为权限验证、性能监控等多种用途。 #### 面向大型互联网企业的技术栈准备建议 为了更好地应对来自不同公司的挑战,除了掌握核心编程技能外,还需要熟悉一些通用的技术概念和服务端架构设计原则。例如,在参与小米这样的企业级项目的招聘过程中,可能会遇到有关微服务治理方案(如`Spring Cloud`)、数据库高可用部署策略等方面的询问[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值