7.腾讯全栈一面

  1. 算法题:

    • 高精度加法:

    高精度加法通常用于处理超出普通数据类型(如int, long)能表示范围的整数加法。可以使用vectorstring来表示大整数,并实现加法。

    • 括号匹配:

    使用栈来匹配括号是一种常见的方法。对于每个左括号,将其推入栈中;对于每个右括号,检查栈顶元素是否是相应的左括号,如果是则弹出栈顶元素,否则括号不匹配。

  2. Java内容:

    • 2.1 数组和链表的区别:

    数组是连续的内存空间,因此它支持通过索引快速访问元素,但插入和删除操作需要移动大量元素。链表由节点组成,每个节点包含数据和指向下一个节点的指针,因此链表插入和删除操作效率较高,但不支持快速随机访问。

    • 2.2 List的实现:

    Java中的List接口有多种实现,包括ArrayListLinkedListVectorStackArrayList基于动态数组实现,LinkedList基于双向链表实现,VectorArrayList类似但线程安全,StackVector的一个子类,用于实现栈数据结构。

    • 2.3 常见的集合类:

    Java集合框架包括SetListQueueMap等接口及其实现类。常见的实现类包括HashSetTreeSetArrayListLinkedListPriorityQueueHashMapTreeMap等。

    • 2.4 存储有序且不重复的数据:

    可以使用TreeSet,它基于红黑树实现,能够保证元素的有序性和唯一性。

    • 2.5 线程安全的Map及实现原理、扩容机制:

    ConcurrentHashMap是线程安全的Map实现。它通过分段锁(Segmentation)来降低锁的粒度,提高并发性能。每个Segment相当于一个小的HashMap,内部维护着一个独立的锁。扩容时,会创建一个新的数组,并将旧数组中的元素重新映射到新数组中。

    • 2.6 Java的锁:

      • synchronized:内置锁,可重入,通过monitor对象实现。

      • 乐观锁:通常通过版本号实现,假设没有冲突,在更新数据前检查版本号是否变化。

      • 悲观锁:如ReentrantLock,它是一个显式锁,提供比synchronized更丰富的功能,如可中断的锁获取、尝试非阻塞地获取锁等。

  1. Redis内容:

    • 3.1 Redis的数据类型:

      • String:简单的键值对。

      • List:按照插入顺序排序的字符串列表。

      • Set:无序集合,元素唯一。

      • ZSet(Sorted Set):有序集合,每个元素都有一个分数,根据分数排序。

      • Hash:键值对的集合,适合表示对象。

    • 3.2 分布式锁实现的原理和方案,程序崩了怎么办:

      • 原理:使用Redis的SETNX命令(现在推荐使用SET命令带NXPX选项)来设置一个键,如果键不存在则设置成功,返回1,否则设置失败返回0。设置成功后,该键就代表获取了锁。为了防止程序崩溃导致锁无法释放,通常会为锁设置一个过期时间(使用PX参数),这样即使程序崩溃,锁也会在过期后自动释放。
  • 3.3 Zset设计用户行为限流:

可以使用Redis的ZSet来设计一个简单的限流系统。为每个用户维护一个ZSet,以时间戳作为分数,将用户的行为作为成员。当用户进行操作时,可以检查ZSet中最早的行为是否在时间窗口之外,如果是,则移除,然后添加新的行为。通过这种方式,可以限制用户在特定时间窗口内的行为次数。

  • 3.4 命令查看Redis信息:

使用INFO命令可以查看Redis服务器的各种信息和统计数据,如内存使用情况、客户端连接数、持久化状态等。

  • MySQL内容:

    • SQL题目:由于没有具体的题目,无法提供具体的SQL语句。但一般来说,UPDATE语句用于修改表中的数据,GROUP BY语句用于对结果集进行分组。

    • 索引有哪些、什么时候加索引、怎么加索引:

      • 索引类型:主键索引、唯一索引、普通索引、全文索引、复合索引等。

      • 何时加索引:在经常需要搜索、排序、分组的列上添加索引,可以提高查询效率。

      • 如何加索引:使用CREATE INDEX语句来创建索引,例如:

        CREATE INDEX idx_column1 ON table_name (column1);
        
    • 如何提高查询效率:

      • 优化SQL语句,避免使用子查询和复杂的连接。

      • 使用合适的索引。

      • 减少数据检索量,如使用LIMIT限制返回结果的数量。

      • 分析查询计划,使用EXPLAIN语句查看查询的执行计划。

    • MySQL的锁:

      • 表锁:锁定整张表,适用于MyISAM存储引擎。

      • 行锁:只锁定需要的行,适用于InnoDB存储引擎。

  1. 简历上的和其它:

    • 通信协议、TCP的好处:

      • 可靠传输:通过序列号、确认应答、重传机制等确保数据的可靠传输。

      • 流量控制:通过滑动窗口算法来控制发送方的发送速率,避免网络拥塞。

      • 拥塞控制:通过慢启动、拥塞避免、快速重传和快速恢复等算法来避免网络拥塞。

    • 如何自定义Starter:

    创建一个Spring Boot Starter通常需要以下步骤:

    • RocketMQ如何避免重复消费:

    RocketMQ提供了消息幂等性保证,可以通过以下方式避免重复消费:

    • GC垃圾回收的流程、原理:

    Java虚拟机中的垃圾回收主要包括以下几个阶段:

    • 线程池的参数有哪些,怎么用:

    线程池的主要参数包括:

    • AOP是什么,有什么用,怎么用,口述一个记录日志的使用过程,如何设计一个AOP,设计模式:

      • AOP(Aspect-Oriented Programming):面向切面编程,是一种编程范式,用于将横切关注点(如日志、事务、安全)与业务逻辑分离。

      • 用途:用于在不修改业务逻辑代码的情况下,增加额外的功能。

      • 使用:在Spring框架中,可以通过定义切面(Aspect)、通知(Advice)、切点(Pointcut)来使用AOP。

      • 日志记录使用

过程示例:

// 定义一个切面
@Aspect
@Component
public class LoggingAspect {
    // 定义切点
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceLayerMethods() {}
    // 定义通知
    @Before("serviceLayerMethods()")
    public void logMethodEntry(JoinPoint joinPoint) {
        // 获取方法签名
        String methodName = joinPoint.getSignature().getName();
        // 获取方法参数
        Object[] args = joinPoint.getArgs();
        // 记录日志
        System.out.println("Entering method: " + methodName + " with arguments " + Arrays.toString(args));
    }
    @AfterReturning(pointcut = "serviceLayerMethods()", returning = "result")
    public void logMethodExit(JoinPoint joinPoint, Object result) {
        // 获取方法签名
        String methodName = joinPoint.getSignature().getName();
        // 记录日志
        System.out.println("Exiting method: " + methodName + " with result " + result);
    }
}

在这个例子中,我们定义了一个切面LoggingAspect,它包含一个切点serviceLayerMethods,这个切点匹配com.example.service包下的所有方法。我们定义了两个通知:logMethodEntry在方法执行前记录日志,logMethodExit在方法执行后记录日志。

如何设计一个AOP:

  1. 确定切面:识别出需要在哪些地方添加横切关注点。

  2. 定义切点:使用AspectJ表达式语言定义切点,以确定哪些方法将被拦截。

  1. 实现通知:根据需要实现@Before、@After、@AfterReturning、@AfterThrowing、@Around等通知。

  2. 绑定通知和切点:将通知与切点关联起来,确保在正确的时机执行通知逻辑。

设计模式:

AOP本身就是一种设计模式,它通常与以下设计模式结合使用:

  • 代理模式(Proxy Pattern):通过代理对象来控制对原始对象的访问。

  • 责任链模式(Chain of Responsibility Pattern):通过一系列处理者来处理请求,每个处理者都有机会处理请求。

  • 策略模式(Strategy Pattern):定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。

在实现AOP时,Spring框架使用了代理模式,通过代理对象来拦截方法调用,并执行通知逻辑。

以上是对AOP相关内容的详细解释。在实际应用中,AOP提供了一种非常灵活的方式来增加和维护横切关注点,从而使得业务逻辑代码更加简洁和聚焦。

#秋招提前批启动你开冲了吗##简历中的项目经历要怎么写##牛客创作赏金赛##我的成功项目解析##我的失利项目复盘#
Java大中厂秋招八股一本通 文章被收录于专栏

八股文分类整理 老哥们点点赞,订阅一下,纯福利做数据。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务