友邦咨询(成都)- Java开发 一面 面经

1. 英文自我介绍

面试官要求用英文做自我介绍,主要包括个人基本信息、教育背景、技术栈、项目经验以及为什么应聘这个岗位。建议准备2-3分钟的英文介绍,突出自己的技术能力和学习能力。

2. Java面向对象的三大特性是什么?

Java面向对象的三大特性是封装、继承和多态。

封装:将数据和操作数据的方法封装在类中,通过访问修饰符(private、protected、public)控制访问权限,隐藏内部实现细节,只暴露必要的接口。这样可以提高代码的安全性和可维护性。

继承:子类可以继承父类的属性和方法,实现代码复用。Java使用extends关键字实现继承,支持单继承,但可以通过接口实现多重继承的效果。继承体现了"is-a"的关系。

多态:同一个方法调用可以有不同的执行结果。多态分为编译时多态(方法重载)和运行时多态(方法重写)。运行时多态通过父类引用指向子类对象实现,调用方法时根据实际对象类型执行相应的方法。多态提高了代码的灵活性和扩展性。

3. List、Set、Map的区别是什么?

这三个都是Java集合框架中的接口,但用途不同:

List:有序集合,允许重复元素,可以通过索引访问元素。常用实现类有ArrayList(基于数组,查询快)、LinkedList(基于链表,插入删除快)、Vector(线程安全但性能较低)。适用于需要保持元素顺序或需要通过索引访问的场景。

Set:无序集合(LinkedHashSet除外),不允许重复元素。常用实现类有HashSet(基于HashMap,无序)、LinkedHashSet(保持插入顺序)、TreeSet(基于红黑树,自动排序)。适用于需要去重或判断元素是否存在的场景。

Map:键值对集合,key不允许重复,value可以重复。常用实现类有HashMap(无序,允许null)、LinkedHashMap(保持插入顺序)、TreeMap(按key排序)、Hashtable(线程安全但过时)。适用于需要通过key快速查找value的场景。

4. Hashtable和HashMap的区别?

主要区别有以下几点:

线程安全:Hashtable是线程安全的,方法都加了synchronized关键字,但性能较低;HashMap是线程不安全的,性能更好。如果需要线程安全,建议使用ConcurrentHashMap。

null值:HashMap允许一个null key和多个null value;Hashtable不允许null key和null value,否则会抛出NullPointerException。

初始容量和扩容:HashMap默认初始容量是16,扩容时变为原来的2倍;Hashtable默认初始容量是11,扩容时变为原来的2倍+1。

继承关系:HashMap继承自AbstractMap;Hashtable继承自Dictionary类。

效率:HashMap效率更高,因为没有同步开销。

迭代器:HashMap使用Iterator迭代器,是fail-fast的;Hashtable使用Enumerator,不是fail-fast的。

实际开发中,Hashtable基本已经被淘汰,推荐使用HashMap或ConcurrentHashMap。

5. MySQL事务的特性和隔离级别有哪些?

事务的四大特性(ACID):

原子性(Atomicity):事务是最小的执行单位,要么全部成功,要么全部失败回滚,不会出现部分成功的情况。通过undo log实现。

一致性(Consistency):事务执行前后,数据库从一个一致性状态转换到另一个一致性状态,数据的完整性约束不被破坏。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务。通过锁机制和MVCC实现。

持久性(Durability):事务一旦提交,对数据库的改变是永久性的,即使系统故障也不会丢失。通过redo log实现。

四种隔离级别(从低到高):

读未提交(Read Uncommitted):可以读取其他事务未提交的数据,会出现脏读、不可重复读、幻读问题。

读已提交(Read Committed):只能读取已提交的数据,解决了脏读,但仍有不可重复读和幻读问题。Oracle默认级别。

可重复读(Repeatable Read):同一事务中多次读取同一数据结果一致,解决了不可重复读,但可能有幻读。MySQL默认级别,通过MVCC和间隙锁解决了幻读。

串行化(Serializable):最高隔离级别,事务串行执行,完全避免并发问题,但性能最差。

实际使用中,MySQL默认的可重复读级别能满足大部分需求。

6. MySQL索引相关知识

索引是帮助MySQL高效获取数据的数据结构,类似于书的目录。

常见索引类型:

主键索引(Primary Key):唯一且不能为null,一个表只能有一个主键索引。

唯一索引(Unique):索引列的值必须唯一,但允许null。

普通索引(Index):最基本的索引,没有限制。

全文索引(Fulltext):用于全文搜索,只有MyISAM和InnoDB(5.6+)支持。

组合索引:多个字段组合建立的索引,遵循最左前缀原则。

索引的数据结构:

InnoDB使用B+树,所有数据存储在叶子节点,叶子节点之间有指针连接,适合范围查询。

主键索引(聚簇索引)的叶子节点存储完整的行数据,辅助索引的叶子节点存储主键值,需要回表查询。

索引的优缺点:

优点:大大加快查询速度,减少IO次数;可以加速表与表之间的连接;使用分组和排序时可以显著减少时间。

缺点:占用存储空间;降低更新表的速度,因为需要维护索引;需要花时间研究建立最优的索引。

7. Thread类中有哪些方法?什么场景会出现线程不安全?

Thread类的常用方法:

start():启动线程,JVM会调用该线程的run方法。

run():线程执行的代码逻辑,不能直接调用,否则就是普通方法调用。

sleep(long millis):让当前线程休眠指定时间,不释放锁。

join():等待该线程执行完毕,当前线程才继续执行。

yield():让出CPU时间片,让其他线程有机会执行。

interrupt():中断线程,设置中断标志位。

isAlive():判断线程是否还活着。

setName()/getName():设置/获取线程名称。

setPriority()/getPriority():设置/获取线程优先级。

线程不安全的场景:

多个线程同时修改共享变量:比如多个线程对同一个计数器进行++操作,因为++不是原子操作,会导致结果不正确。

集合类的并发修改:ArrayList、HashMap等非线程安全的集合在多线程环境下会出现问题。

单例模

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务