友邦咨询(成都)- 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圣经
