Java面试题总结
文章平均质量分 52
总结Java方向的面试题
知行&
举世誉之而不加劝,举世非之而不加沮。
展开
-
线程池的底层工作原理
3.如果此时线程池中的线程数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolize,建新的线程来处理被添加的任务。6.当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。1.如果此时线程池中的线程数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。原创 2023-03-06 18:01:48 · 301 阅读 · 0 评论 -
Enum枚举类没有values()方法,却可以在枚举类中使用,为什么?
这是由于java编译器在对enum关键字进行处理时,实际上是将enum转换成为了java.lang.Enum类的一个子类来完成,而这个子类中含有values()静态方法。如图,通过javap反编译TestEnum枚举类,可以看到编译器在对enum处理时,实际上是转换成了Enum的一个子类来实现的,里面可以看到有values()静态方法的声明。里面并没有values()静态方法,而在我们使用enum类时,却可以通过java编译器的提示得到values()静态方法,这是为什么呢?原创 2023-02-22 21:37:09 · 406 阅读 · 0 评论 -
Tomcat中为什么要使用自定义类加载器?
一个Tomcat,不管内部部署了多少应用,Tomcat启动之后就是一个Java进程,也就是一个JVM,所以如果Tomcat中只存在一个类加载器,比如默认的AppClassLoader,那么就只能加载一个com.data.User类,这是有问题的 .一个Tomcat中可以部署多个应用,而每个应用中都存在很多类,并且各个应用中的类是独立的,全类名是可以相同的,比如一个博客系统中可能存在com.data.User类,一个库存系统中可能也存在com.data.User类 .原创 2023-03-02 16:49:16 · 416 阅读 · 0 评论 -
Redis相关面试题
缓存穿透是指查询数据库和缓存都无数据,因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透 .缓存穿透执行流程如下图所示 :红色路线就是缓存穿透的结果 . 缓存根本没起到作用 , 好像被穿透了一样,每次都会去访问数据库 .如何解决缓存穿透问题呢?本质上就是要防止用户查不到数据!有以下几种方案 .缓存击穿指的是某个热点缓存,在某一时刻恰好失效了,然后此时刚好有大量的并发请求,此时这些请求将会给数据库造成巨大的压力,这种情况就叫做缓存击穿。原创 2023-02-27 20:40:51 · 332 阅读 · 0 评论 -
写一个单例模式
枚举实现单例模式真简单啊!原创 2023-02-22 23:14:22 · 118 阅读 · 0 评论 -
从浏览器输入URL开始 , 到最终看到页面 , 中间都发生了哪些事情 ?
上述过程是客户端给服务器发送请求的过程 . 后面服务器还要根据请求计算响应 , 把响应按照类似的流程转发给客户端 , 具体就取决于业务代码了!4.数据链路层的角度:以太网数据帧, mac地址, mac在转发过程中如何变化 , MTU , MTU影响到的IP分包。3.网络层的角度:网络数据报转发过程.一跳一跳的方式来转发.(路由表,路由表匹配规则,下一跳相关内容)6.总结:发送的过程中,涉及到从上到下 , 封装;2).传输数据(确认应答,超时重传,滑动窗口,流量控制,拥塞控制……2).构造HTTP请求。原创 2023-02-14 23:17:04 · 149 阅读 · 0 评论 -
多线程相关面试题
全称 Compare and swap, 即 “比较并交换”. 相当于通过一个原子的操作, 同时完成 “读取内存, 比较是否相等, 修改内存” 这三个步骤. 本质上需要 CPU 指令的支撑.如果发现当前版本号和之前读到的版本号一致, 就真正执行修改操作, 并让版本号自增;如果发现当前版本号比之前读到的版本号大, (说明已经修改过了!) 就认为操作失败.给要修改的数据引入版本号. 在 CAS 比较数据当前值和旧值的同时, 也要比较版本号是否符合预期.原创 2023-02-12 12:57:47 · 327 阅读 · 0 评论 -
锁机制面试题
如果获取锁失败, 立即再尝试获取锁, 无限循环, 直到获取到锁为止. 第一次获取锁失败, 第二次的尝试会在极短的时间内到来. 一旦锁被其他线程释放, 就能第一时间获取到锁.优点: 没有放弃 CPU 资源 , 一旦锁被释放就能第一时间获取到锁 , 更高效 . 在锁持有时间比较短的场景下非常有用.缺点: 如果锁的持有时间较长 , 就会浪费 CPU 资源 .读写锁就是把读操作和写操作分别进行加锁.读锁和读锁之间不互斥.写锁和写锁之间互斥.写锁和读锁之间互斥.原创 2023-02-12 12:56:49 · 348 阅读 · 0 评论 -
面向对象和面向过程的区别?
把代码中的有关联关系的内容放到一起 , 维护代码的时候容易找!强制将操作的变量和对应的函数放到了一起(同一个大括号内) . 容易找!面向过程 : 变量和函数之间的结构是松散的 , 即使函数在操作变量 , 但是仍然可以把这两部分代码放的很远.封装 , 继承 , 多态 都是后来发现的 , 高内聚之后 ,又额外带来的一些好处!面向对象最核心的特征就是"类和对象" →保证了代码的。面向对象 : 其实就是。原创 2023-02-12 12:46:54 · 60 阅读 · 0 评论 -
谈谈ArrayList和LinkedList的区别?
理论上 , 链表插入元素的时间复杂应该是O(1) , 因为只需要改变节点的前后指向即可 . 但是java标准库在设计LinkedList时出现了问题 , 导致没有发挥出链表的优势 . 在进行add(int index,E element)时 , 需要先遍历找到待插入的位置 , 然后将新节点插入进去 . 由于遍历找位置和插入是一个整体 , 这就导致LinkedList在插入元素时 , 时间复杂度是O(N) .7.综上所述 , ArrayList的优势是支持随机访问 , 且查找元素比较快;原创 2023-02-12 12:43:28 · 762 阅读 · 0 评论 -
Java语言具有哪些特点?
Java语言具有哪些特点?原创 2023-01-20 17:55:18 · 92 阅读 · 0 评论 -
谈谈HashMap,HashTable,ConcurrentHashMap之间的区别?
HashMap,HashTable,ConcurrentHashMap之间的区别?原创 2023-01-10 10:41:22 · 99 阅读 · 0 评论 -
简述 synchronized 和 ReentrantLock 之间的区别?
synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁。可重入锁:什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。原创 2023-01-09 10:33:27 · 859 阅读 · 0 评论 -
TCP 协议的三次握手与四次挥手过程详解
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。本文将分别讲解经典的TCP协议建立连接(所谓的“3次握手”)和断开连接(所谓的“4次挥手”)的过程。转载 2022-12-30 16:44:32 · 3787 阅读 · 0 评论 -
进程与线程的区别和联系是什么?
进程:进程是操作系统中一个最基本也是最重要的概念,然而对于进程的概念,学界并没有明确的定义,或者说进程这一概念尚未完全统一。行为的一个规则叫做程序,程序在处理机上执行时锁发生的活动称为进程。进程是这样的计算部分,它可以与别的进程并发执行。顺序进程(有时称为任务)是一个程序与其数据集一道顺序通过处理机的执行所发生的活动。一个进程是一系列逐一执行的操作,而操作的确切含义有赖于我们以何种详尽程度来描述进程、(Brinch.Hansen)原创 2022-12-30 09:38:20 · 445 阅读 · 0 评论