![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试题
文章平均质量分 76
Geek_ymv
公众号 geekymv
展开
-
HashMap面试常见问题
1、底层数据结构,1.7与1.8有何不同?1.7 数组 + 链表1.8 数组 +(链表 | 红黑树)2、为何要用红黑树,为何不直接树化,树化阈值为何是8,何时会树化,何时会退化为链表?当发生哈希冲突时,新元素会添加到链表尾部,可能导致链表长度比较长,查找元素时就需要一次次比较,比较耗时。如何解决链表长度过长问题呢?①通过扩容可以减少链表长度链表长度过长是可能发生了较多的哈希冲突,而减少哈希冲突的办法可以通过扩容数组长度来解决,数组长度足够长可以容纳更多的元素。数组默认长度为16,当元素个数超过原创 2021-10-16 17:20:53 · 166 阅读 · 0 评论 -
单链表的反转(Java版)
上一篇文章单链表的CRUD 介绍了单链表的查找、插入、删除、修改等操作,本篇文章是在上一篇的基础上实现单链表的反转功能。所谓反转就是将链表整体反过来,比如原链表是 a —> b —> c —> null,则反转后的链表是 c —> b —> a —> null。如下图所示:实现思路:1.首先新创建一个链表2.遍历原链表把原链表中每个结点的数据域依次插入到新链表头结点后面,比如依次将a、b、c 这3个数据域依次添加到新链表头结点后面:/** * 单链表的反转原创 2020-10-11 23:22:51 · 198 阅读 · 0 评论 -
聊聊缓存穿透
在我们的项目中多少都会使用缓存,因为有些数据我们没有必要每次都去查询数据库,特别是高QPS的系统,每次都去查询数据库会影响数据库性能。我们一般的做法是先从缓存中查询,如果缓存中查询到了则直接返回,如果缓存中没有,则查询数据库,如果从数据库中查询到了,则先将数据写入缓存,然后返回数据给调用方。缓存穿透是指用户查询的数据在数据库中没有,那么在缓存中也不会有,也就是说查询的是一条根本不存在的记录。这样就会导致用户首先在缓存中找不到 ,则每次都要去数据库再查询一遍,然后返回空。这样就相当于进行了两次无用的查询。要原创 2020-06-26 23:17:39 · 204 阅读 · 0 评论 -
并发编程的挑战
并发编程目的及挑战并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果我们希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换问题、死锁问题,以及受限于硬件和软件的资源限制问题。上下文切换单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。CPU时间片是CPU分配给各个线程的执行时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般几十毫秒原创 2020-06-20 00:30:30 · 170 阅读 · 0 评论 -
IP地址详解(扫盲篇)
局域网:一般称为内网。简单局域网构成:交换机、网线、PC(其他IT中端)。交换机:用来组建内网的设备。IP地址IP地址就是一个唯一标识,是一段网络编码(二进制)。IP地址形式:X.X.X.X ,X的范围:0-255。如:正确:10.1.1.1 192.168.1.1错误:300.1.1.1子网掩码局域网通信规则:在同一个局域网中,所有的IP必须在同一个网段中才...原创 2020-04-08 20:32:55 · 2487 阅读 · 1 评论 -
synchronized 和 Lock 有什么区别?用新的lock有什么好处?
原始构成synchronized 是关键字属于JVM层面,monitorenter、monitorexit 底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步块或方法中才能调用wait/notify等方法)。Lock 是具体类(java.util.concurrent.locks.Lock),是API层面的锁。...原创 2020-04-07 21:44:51 · 247 阅读 · 0 评论 -
生产者消费者模式
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 线程操作资源类 * 判断、干活、通知 * 防止虚假唤醒通知 */class ShareData { ...原创 2020-04-07 21:18:47 · 187 阅读 · 0 评论 -
阻塞队列 BlockingQueue
ArrayBlockingQueue 由数组结构组成的有界阻塞队列。LinkedBlockingQueue 由链表结构组成的有界(大小默认值为Integer.MAX_VALUE)阻塞队列。PriorityBlockingQueue 支持优先级排序的无界阻塞队列。DelayQueue 使用优先级队列实现的延迟无界组织队列。SynchronousQueue 不存储元素的阻塞队列,也即单个元素...原创 2020-04-07 19:56:44 · 249 阅读 · 0 评论 -
互联网面试题之CountDownLatch/CyclicBarrier/Semaphore用过吗
CountDownLatchimport java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;/** * 秦灭六国,一统天下 */public class CountDownLatchDemo { public static final int NUM = 6; publ...原创 2020-03-22 20:58:18 · 226 阅读 · 0 评论 -
互联网面试题之Java锁
公平锁、非公平锁公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队,先来后到。非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或者饥饿现象。在Java并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。 ...原创 2020-02-22 21:27:53 · 235 阅读 · 0 评论 -
互联网面试题之集合类不安全的并发修改异常
ArrayList 异常 java.util.ConcurrentModificationException原创 2020-02-22 15:47:17 · 236 阅读 · 0 评论 -
互联网面试题之CAS的ABA问题
ABA 问题是怎么产生的CAS 算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差里会导致数据的变化。比如说一个线程T1从内存位置V中取出A,这个时候另一个线程T2也从内存中取出A,并且线程T2进行了一些操作将值变成了B,然后线程T2又将V位置的数据变成A,这时候线程T1进行CAS操作发现内存中仍然是A,然后线程T1操作成功。...原创 2020-02-18 16:50:34 · 287 阅读 · 0 评论 -
互联网面试题之CAS你知道吗
CAS (compare and swap) 比较并交换AtomicInteger ai = new AtomicInteger(0);int i = ai.getAndIncrement();getAndIncrement() 源码/*** Atomically increments by one the current value.** @return the previou...原创 2020-02-17 19:46:23 · 373 阅读 · 2 评论 -
互联网面试题之请谈谈你对volatile的理解
JUC(java.util.concurrent)并发和并行volatile 是Java虚拟机提供的轻量级的同步机制。volatile三大特性保证可见性不保证原子性禁止指令重排序JMM你谈谈JMM(Java Memory Model,Java内存模型,简称JMM),本身是一种抽象的概念,并不真实存在。它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态...原创 2019-12-19 21:10:27 · 505 阅读 · 0 评论