快手一面(高级java)面试真题分享

简介: ArrayList 对于随机位置的add/remove,时间复杂度为 O(n),但是对于列表末尾的添加/删除操作,时间复杂度是 O(1). LinkedList对于随机位置的add/remove,时间复杂度为 O(n),但是对于列表 末尾/开头 的添加/删除操作,时间复杂度是 O(1).

1 ArrayList LinkedList 区别


 ArrayList

  • 采用数组的方式来存储对象
  • 非线程安全
  • 每次按照1.5倍(位运算)的比率通过copeOf的方式扩容
  • 初始数组容量为10


 LinkedList

  • 基于双向链表机制实现
  • 非线程安全的


2 ArrayList、LinkedList 的boolean add(E e) 、E remove(int index)、void add(int index, E element) 三个方法,分别的时间复杂度


 ArrayList:

  • add(E e)  在不考虑扩容的情况下时间复杂度为:O(1)
  • add(int index,E element)  时间复杂度为:O(n)  在第几个元素后面插入,后面的元素需要向后移动
  • remove(int index)  时间复杂度为:O(n)   在第几个元素后面插入,后面的元素需要向后移动


LinkedList:

  • add(E e)  时间复杂度为:O(1)
  • add(int index,E element)  时间复杂度为:O(n)  需要先查找到第几个元素,直接指针指向操作
  • remove(int index)  时间复杂度为:O(n)

 

 总结:


  • ArrayList 对于随机位置的add/remove,时间复杂度为 O(n),但是对于列表末尾的添加/删除操作,时间复杂度是 O(1).
  • LinkedList对于随机位置的add/remove,时间复杂度为 O(n),但是对于列表 末尾/开头 的添加/删除操作,时间复杂度是 O(1).


3 HashMap 数据结构,1.8为什么用红黑树?


    参考系列文章:经典面试题之HashMap(一)


4 HashMap 求hash值的算法?  

 

      参考系列文章 : 经典面试题之HashMap(二)


5 写代码:实现一下HashMap的put方法


     这个题我说实话,我自己是无法完整的写出来,但大致思路是能说得上来。所以,如果我是面试官的话,要求至少是把思路说出来。能完全写出来的佩服,因为put方法还牵扯很多上下文的信息,这些都记住不易。


      参考系列文章:一次性搞定HashMap面试


6 说明一下java的异常体系


27.png


image.png


7  Redis 怎样实现分布式锁? setnx  和 set区别


    用setnx 可以实现分布式锁


    set:

  • 将字符串值 value 关联到 key 。
  • 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。

   

    setnx:

  • 将 key 的值设为 value ,当且仅当 key 不存在。
  • 若给定的 key 已经存在,则 SETNX 不做任何动作。
  • SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。


8 一个接口调用次数 ,如果用 static long counter;counter++; 统计有什么问题没有?如果用volatile修饰呢?


    有问题,如果在多线程环境下,会出现数据不对的情况。

    如果用volatile也不能解决这个问题,因为volatile 虽然能够保证有序性和可见性,但就这个例子来讲,运算的结果已经依赖当前变量的值了(counter++) 这样是不能使用volatile的,如果用了,结果也是不对。原因是在counter++中,这条语句编译后的字节码指令不是一句,在多线程环境下其他线程可能已经把值改了,操作数栈顶的值可能就成了过期的数据。


    那应该怎么办呢?

    可以用原子类操作,比如 AtomicInteger


    AtomicInteger的原理?

    主要是利用了CAS


    描述下CAS过程和原理?


所谓CAS,即“比较与交换”(Compare-and-swap),是最常见的乐观锁实现方式,看官应该对这个概念很熟悉。一次CAS过程是原子的,包含3个操作数:

  • 需要访问的内存地址V;
  • 该内存地址中存储的预期值A;
  • 希望向该地址写入的新值B。

当且仅当V中的值与A相同时,其值才会更新成B,否则就不执行任何动作。


     CAS通过调用JNI的代码实现的。JNI:Java Native Interface为JAVA本地调用,允许java调用其他语言。而compareAndSwapInt就是借助C来调用CPU底层指令(Atomic::cmpxchg(x,addr,e))实现的。


    CAS存在的问题?

    如果CAS失败,会一直进行尝试。如果CAS长时间一直不成功,可能会给CPU带来很大的开销。

   

9  讲一讲熟悉的项目

相关文章
|
5天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
10天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
15天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
11天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
35 4
|
12天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
53 4
|
1月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
83 1
Java面试题之Java集合面试题 50道(带答案)
|
24天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
52 5
|
23天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
19 1
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3
|
1月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
97 0
Java面试题之cpu占用率100%,进行定位和解决