前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >快手校招一面讲解

快手校招一面讲解

作者头像
GeekLiHua
发布2025-01-21 14:11:30
发布2025-01-21 14:11:30
510
举报
文章被收录于专栏:JavaJava

Java基础题讲解

1 jre和jdk的区别

jre是java的运行环境,他包含了java程序运行所需要的库,jdk是java的开发环境,如果要运行java应用只需要安装jre就可以了,jdk在jre基础上还包含了java编译器javac,java调试器jdb.

2讲讲java类加载

java程序运行时,当需要使用某个类的时候,jvm需要检验该类是否被加载到了内存中,如果没有加载,则通过类加载器将类的字节码文件加载到内存中,并在堆中生成对应的class对象,然后将该class对象放到方法区。

3.类加载器

在java中最顶层的类加载器是引导类加载器Bootstrap classloader,他是jvm的一部分通过本地的代码实现的,无法在java代码中获取其引用,还有扩展加载器,包括Extension classloader负责加载java的扩展库,还有程序加载器Application ClassLoader,系统类加载器SystemClassLoader。

4.说一说知道哪些集合

在java集合主要包括List,Set,Map,Queue,Stack,对于列表List又包含,ArrayList,LinkedList,Vector这些可以包含重复元素,Set集合包括Hashset,TreeSet,LinkedHashSet。Map包括HashMap,TreeMap等等,queue是先进先出的,包含ArrayDeque,LinkedList,还有优先级队列PriorityQueue,Stack是后进先出的

5 ArrayList和LinkedList

ArrayList和LinkedList之间的区别就是数组与链表之间的区别,ArrayList支持随机访问,查的效率高,插入删除效率低,而且占用内存相比LinkedList少,不需要存储额外的指针信息,LinkedList就是反过来的。

6.插入元素时间复杂度

ArrayList是O(n),LinkedList是O(1)

7.新建一个ArrayList会分配内存嘛

如果不指定内存大小,默认会给一个10大小的内存

8. ArrayList扩容的时机

当ArrayList插入一个新元素的时候如果插入这个元素就会让ArrayList满了,那么就会进行扩容大小是原来的1.5倍,创建一个新的ArrayList把原来的数据复制过去,旧的就被垃圾回收了。

9. ArrayList什么时候缩容

当调用remove方法的时候可能就会缩容,当移除元素后,检查当前元素数量是否低于内部数组容量的一定比例(默认是50%)如果是,就会缩容,把元素复制到新数组中,然后把旧的丢弃节省空间,也可以通过trimTosize这个方法手动进行缩容,让底层数组大小与当前元素数量相匹配的最小容量,以减少内存浪费。

10.LinkedList插入int

java编译器会把int转换成Integer.

11.谁实现int装包的,是List吗

是java编译器进行的,是java编译器进行的自动装箱,而不是List

12. ArrayList线程安全吗,说说你知道的线程安全的List

ArrayList不是线程安全的,线程安全的有Vector,copyonwriterArrayList,还有可以使用Collections.synchronizedList这个方法把他变成线程安全的。

13. Collections.同步方法和copyonwriteArrayList的异同点

collections.synchronizedList是把一个不安全的Arraylist通过加锁的方式变成安全的,而copyonwriteArraylist是,通过复制机制实现的。

14. copyonwriteArrayList,咋实现线程安全的。

通过复制机制实现,对于写操作,他会复制出另一个数组让多线程进行操作,写操作执行完之后,再让引用指向新数组,对于读操作就是对原数组进行。

15 copyonwriteArrayList写的时候读会读到空数据吗

不会读到空数据,因为写实对于复制的数组进行的,读是对于原数组进行的。

16 线程如何创建

通过两种方式进行创建一种是继承Thread类,另一种是实现Runnable接口,他们都需要重写run方法

17 继承Thread和实现Runnable接口的区别,这两者的继承关系

继承Thread是直接继承一个具有线程特性的类,因此无法再继承其他类, 但是实现Runnable接口的方式避免了单继承的限制,可以实现多个接口。

18 线程池的参数有哪些,挑重要的解释一下

核心线程数,最大线程数,任务队列,拒绝策略,线程存活时间。

19 线程池怎么保证线程一直运行的

通过不断的接收和执行任务来保证线程的持续运行,线程池会维护一定量的核心线程,当有新任务来的时候先尝试获取线程池中空闲的核心线程,来执行,当所有核心线程满了之后,任务队列没有满,再把新任务放到任务队列里面,如果任务队列也满了就需要创建新的线程,但是这个创建的数量不会大于最大线程数,对于非核心线程,最大时间没有被用的时候就会被回收掉以节省资源。

20 单线程线程池的应用场景

单线程池,也就是newSingleThreadExctor他主要是一个顺序的线程池,他是顺序执行的,任务之间不会并发执行,具体应用场景比如记录日志,需要日志顺序,还有就是统计任务执行时间。

21 怎么保证线程安全

可以通过加锁的方式,比如synchronized关键字,ReetrantLock这些,还有就是使用原子操作,比如AtomicInteger这种原子类,还有就是使用线程安全的容器。

22 说说volatile

他是为了保证变量在多线程环境下的可见性,比我们定义了一个volatile的boolean,默认是true,然后创建两个线程,一个线程把他变成false,另一个线程检查他为false之后,才会停止循环,如果不加volatile就不会被这两个线程可见,加上之后当一个线程修改他们的共享变量之后,其他线程就会立即看见这个修改,然后volatile还可以禁止重排序,确保指令不会被乱序执行。

23 volatile为什么不保证原子性

volatile缺乏同步机制,他只能保证变量的修改是可见的。

24 volatile和final的共同点

final和volatile都是内存可见性的,也是禁止重排序的

26 synchronized可重入吗,怎么实现的

synchronized是重入的,重入性是通过线程持有的锁的计数器来实现的。每个对象都有一个与之关联的锁和一个计数器,当计数器为 0 时表示锁是可用的,当一个线程首次进入 synchronized 块时,它会尝试获取锁并将计数器加一。如果该线程再次进入同一个 synchronized 块,计数器会再次加一。当线程退出 synchronized 块时,计数器会减一。只有当计数器减为 0 时,锁才会释放。

27 synchronized怎么实现线程安全的。

通过在代码块方法,条件上面加上这个关键词来实现线程安全,具体实现机制涉及到对象头的 monitor 字段和 monitor 对象的进入和退出、等待队列的管理等。

28锁升级的过程

锁升级是指在多线程竞争的情况下,锁从低级别到高级别的升级过程。首先,当只有一个线程访问同步代码块时,JVM会将锁升级为偏向锁,以提高性能。如果有多个线程竞争同一个锁,偏向锁会升级为轻量级锁,这时候会通过CAS操作来尝试获取锁。如果CAS操作失败,表示存在多个线程竞争锁,那么轻量级锁会升级为重量级锁,

29说说自旋锁咋实现的

它会让线程在获取锁时不断地尝试,而不是立即进入阻塞状态。当一个线程发现锁被占用时,它会不断地进行忙等待,直到获取到锁为止。

30读写锁咋实现的

ReadWriteLock允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。读写锁的实现通常包含两个部分:读锁和写锁,当没有线程持有写锁时,多个线程可以同时获取读锁,从而实现对共享资源的并发读取。当有线程持有写锁时,其他线程无法获取读锁或写锁,确保对共享资源的独占写操作。

31说说CLH

基于链表的自旋锁算法,用于实现轻量级的同步机制,核心思想是使用链表来表示等待线程的队列,每个线程都持有一个锁节点(Lock Node),节点之间形成一个有序的队列。优点是减少了锁竞争,因为每个线程都在自己的节点上自旋等待,不会产生明显的锁争用;并且具有良好的可扩展性,适用于多核处理器的并发环境。但是CLH锁需要额外的节点对象来表示等待线程,因此会增加内存开销。

32 redis你咋用的

web开发中充当缓存,会话存储,存储token,当消息队列,在分布式开发中充当分布式锁。

33 redis的淘汰策略

Redis 中的淘汰策略用于在内存不足时删除键以释放空间,volatile-lru:在设置了过期时间的键中,从最近最少使用的键中删除,volatile-ttl:在设置了过期时间的键中,根据键的过期时间来删除,volatile-random:在设置了过期时间的键中,随机删除一个键。allkeys-lru:从所有键中删除最近最少使用的键。allkeys-random:从所有键中随机删除一个键。noeviction:不删除任何键,只是返回错误响应。

34 redis内存满了会怎么样

当 Redis 的内存使用达到最大限制时,会触发内存淘汰机制,以释放内存空间

35 MySQL用的是什么引擎,索引是啥

默认是InnoDB,索引是一种数据库对象,用于提高查询性能。它是对数据库表格中一列或多列的值进行排序的结构,用于快速定位和访问数据行。索引可以大大提高查询的速度,但同时会增加写操作的开销。MySQL中常见的索引包括普通索引、唯一索引、主键索引、全文索引等。

36 B+树数据太多了会怎么样

可能会导致树的高度增加,从而增加了索引的查找时间,通常需要通过分区、分库分表、调整索引结构等方法来优化B+树索引,以应对数据量过大的情况。

37 B+树和B树的区别

在B+树中,非叶子节点只存储索引键,而不存储数据,所有数据都存储在叶子节点中。在B树中,每个节点既存储数据,又存储子节点的指针。B树需要在非叶子节点和叶子节点之间进行遍历,而B+树的范围查询只需要遍历叶子节点。B树的节点中既包含索引键,又包含数据,因此每个节点的空间利用率较低。B+树的非叶子节点只包含索引键,可以容纳更多的索引项,提高了空间利用率。

38 B+树聚簇索引和非聚簇索引

非聚簇索引中叶子节点存储的是指向数据记录的指针,而不是实际的数据记录。簇索引中叶子节点存储的是实际的数据记录,而非索引键。 非聚簇索数据记录在表的数据页中随机分布,叶子节点的顺序不代表数据记录的物理存储顺序。聚簇索引数据记录按照索引顺序存储,因此叶子节点的顺序即为数据记录的物理存储顺序。非聚簇索引适用于没有唯一性要求或者不常被用来搜索的索引列。聚簇索引,主键通常被用作聚簇索引,因为它保证了唯一性,并且能够快速地定位到数据记录。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java基础题讲解
    • 1 jre和jdk的区别
    • 2讲讲java类加载
    • 3.类加载器
    • 4.说一说知道哪些集合
    • 5 ArrayList和LinkedList
    • 6.插入元素时间复杂度
    • 7.新建一个ArrayList会分配内存嘛
    • 8. ArrayList扩容的时机
    • 9. ArrayList什么时候缩容
    • 10.LinkedList插入int
    • 11.谁实现int装包的,是List吗
    • 12. ArrayList线程安全吗,说说你知道的线程安全的List
    • 13. Collections.同步方法和copyonwriteArrayList的异同点
    • 14. copyonwriteArrayList,咋实现线程安全的。
    • 15 copyonwriteArrayList写的时候读会读到空数据吗
    • 16 线程如何创建
    • 17 继承Thread和实现Runnable接口的区别,这两者的继承关系
    • 18 线程池的参数有哪些,挑重要的解释一下
    • 19 线程池怎么保证线程一直运行的
    • 20 单线程线程池的应用场景
    • 21 怎么保证线程安全
    • 22 说说volatile
    • 23 volatile为什么不保证原子性
    • 24 volatile和final的共同点
    • 26 synchronized可重入吗,怎么实现的
    • 27 synchronized怎么实现线程安全的。
    • 28锁升级的过程
    • 29说说自旋锁咋实现的
    • 30读写锁咋实现的
    • 31说说CLH
    • 32 redis你咋用的
    • 33 redis的淘汰策略
    • 34 redis内存满了会怎么样
    • 35 MySQL用的是什么引擎,索引是啥
    • 36 B+树数据太多了会怎么样
    • 37 B+树和B树的区别
  • 38 B+树聚簇索引和非聚簇索引
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档