java面试题之个人总结(答案)

本文深入探讨Java基础、集合框架、Spring框架原理与配置、事务管理、MyBatis使用技巧、Dubbo微服务概念及数据库事务特性,涵盖Java动态代理、Spring IOC与AOP、事务隔离级别、MyBatis标签运用、Dubbo注解属性等关键知识点。
摘要由CSDN通过智能技术生成

最近面试了很多公司,就其中的技术点做个梳理,即是分享,也当做是个笔记

PS:持续更新中

 

java基础核心题

基础

JDK动态代理原理?怎么实现?

Java动态代理的作用及好处

代码实现如下:

代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxy implements InvocationHandler {


    private LiveInterface liveInterface;

    public DynamicProxy(LiveInterface liveInterface) {
        this.liveInterface = liveInterface;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if ("cal".equals(method.getName())) {
            System.out.println("调用计算方法");
            int result = (int) method.invoke(liveInterface, args);
            return result;
        }

        if ("eat".equals(method.getName())) {
            System.out.println("调用吃方法");
            String result = (String) method.invoke(liveInterface, args);
            return result;
        }
        return null;
    }
}

 

import java.lang.reflect.Proxy;

public class DynamicProxyTest {

    public static void main(String[] args) {
        LiveInterface live = new LiveImpl();
        DynamicProxy dynamicProxy = new DynamicProxy(live);
        //代理对象
        LiveInterface liveProxy = (LiveInterface) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{LiveInterface.class}, dynamicProxy);

        liveProxy.cal();
        liveProxy.eat();
    }

}

CGLIB动态代理原理?怎么实现?

 

 

Collection集合

List 

Set

Map

1、在hashmap中,怎么做能保证key的插入顺序?

使用LinkedHashMap,LinkedHashMap是HashMap的子类,通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序,即插入顺序 、 访问顺序

常用框架题

Spring

spring核心是什么?

IOC控制反转与AOP面向切面编程

spring控制反转IOC原理(流程)?

spring面向切面AOP原理(流程),一般作什么用途?

AOP事务控制

<!-- 事务控制位置,一般在业务层service -->
    <aop:config>
        <aop:pointcut id="txPointcut" expression="execution(* com.province.service..*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
    </aop:config>

1、spring 事务的基本属性 ?

传播行为,隔离级别,事务超时时间,回滚规则,是否只读

<!-- 事务属性配置 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <!-- 事务传播属性;事务隔离级别数据库默认;事务超时时间 -->
            <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" timeout="30"/>
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <!-- 事务只读属性 -->
            <tx:method name="*" read-only="true" />
        </tx:attributes>
    </tx:advice>

Spring事务管理与传播机制详解以及使用实例

spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

 

2、spring事务传播特性?

spring声明式事务管理时定义了7种传播机制。

Propagation.REQUIRED(默认):如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中。
Propagation.supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
Propagation.mandatory:使用当前事务,如果没有当前事务,就抛出异常。
Propagation.required_new:新建事务,如果当前存在事务,把当前事务挂起。
Propagation.not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation.never:以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation.nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

在java项目中使用:

注解方式:

@Transactional(propagation=Propagation.REQUIRED) 

spring 事务的传播机制看这篇就够了


3、spring事务的隔离级别

隔离级别简称(翻译)描述
DEFAULT默认使用数据库本身使用的隔离级别
ORACLE(读已提交) MySQL(可重复读)
READ_UNCOMITTED读未提交最低的隔离级别,一切皆有可能。
READ_COMMITED读已提交有幻读以及不可重复读风险。
REPEATABLE_READ可重复读解决不可重复读的隔离级别,但还是有幻读风险。
SERLALIZABLE串行化最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了

 

 

 

 

 

 

 

 

事务隔离级别中的名词解释

名词解释
脏读一个事务读到另一个事务未提交的更新数据,所谓脏读,就是指事务A读到了事务B还没有提交的数据,比如银行取钱,事务A开启事务,此时切换到事务B,事务B开启事务–>取走100元,此时切换回事务A,事务A读取的肯定是数据库里面的原始数据,因为事务B取走了100块钱,并没有提交,数据库里面的账务余额肯定还是原始余额,这就是脏读
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。
不可重复读在一个事务里面的操作中发现了未被操作的数据 比方说在同一个事务中先后执行两条一模一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读

 

 

 

 

 

 

 

4、Spring获取bean有几种方式

mybatis

1、mybatis有哪些标签,具体用法是什么?

insert、delete、update、select、resultMap、sql

if、foreach、choose、where、set

请参考mybatis全部标签

2、mybatis是如何将dao接口的调用转换到对应的sql文件上?

请参考:Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的

3、在ssm框架中,对数据库单张表,怎样自动生成代码?

可以生成实体、Dao、Mapping映射文件。

mybatis-generator-maven-plugin包以例,配置generatorConfig.xml,数据源,dao、map、Mapping路径,表名;

微服务题

dubbo

1、在dubbo框架中,java对象定义了isSuccess属性,会有什么影响?说说原理?

会导致属性获取不到,抛出异常。isSuccess属性的方法也是isSuccess(),RPC框架在反向解析的时候,以为对应的属性名称是success。

2、dubbo的注解有service、reference,里面都有哪些属性,作用是什么?

interfaceName(服务接口名)、version(服务版本)、timeout(远程服务调用超时时间(毫秒))

详细请查看Alpha峰Dubbo在XML中各配置标签属性含义

 

数据库

数据库的事务特性?

简称:ACID

原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。

隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

JVM虚拟机

1、如何解决java内存溢出问题?

配置jvm启动参数,加大内存;

检查日志,定位内存溢出问题;

代码版本控制

svn

git

1、git中有哪些命令?作用是什么?

add、commit 、push、pull、merge、reset、fetch

添加到暂存区、提交暂存区代码到本地git仓库、将本地git仓库代码上传到远端

详细请参考脚本之家的Git命令的简单整理大全

设计模式

1、设计模式有哪些?并写代码实现一个设计模式?(至少写3~5种;单例、工厂除外)

代理模式、责任链模式、观察者模式、命令模式、模板模式

说细请参考菜鸟教程的设计模式

应用实践题

1、高并发下如何做扣减余额的操作。比如常见的场景是:1、企业账户送流量或红包,用户签到领取;2、充值,打赏主播

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值