- 博客(24)
- 收藏
- 关注
原创 女程序员被逼哭了。。。
当元素数量size达到阙值时即size > loadfactor * capacity 时,也是在putVal函数中,调用resize(),扩容后的数组大小是原数组的2倍,将原来的元素重新hash放入到新的散列表中去。jdk1.7中,hashmap会直接将null key放到index = 0的位置,遍历table[0]的Entry链表,寻找key的null的节点,找到后覆盖,未找到就添加一个null。创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。一个需求扔过来,表在哪?
2024-08-04 00:11:11
923
1
原创 最近招了一个浑身软肋的员工,独生子28岁,孩子刚出生,媳妇全职太太,房贷150万,技术强
如果不同,则继续遍历链表,直到末尾,若链表的长度大于 8 且散列表容量大于 64,则将链表转红黑树,否则尾插法创建Node节点。搜索树中节点,判断节点的key值情况,如果相同 ,则替换value,如果不存在,则在树中插入新的TreeNode节点。所以啊,老铁们,咱们得认清现实,这职场啊,就是个利益场,有时候你真的只是别人眼中的一颗棋子。那些所谓的“优质员工”,说白了,就是一群背着山一样重担,还得在职场上狂奔的哥们儿姐们儿。这些大佬级别的员工,技术杠杠的,简直就是团队里的定海神针,但背后呢?
2024-08-03 23:58:50
988
原创 【大厂面经】Java后端高频面经(按简历专业技能点分类整理)
本人总结的面试题这份资料接近3万字,是本人面试了BAT,字节等大公司,以及众多银行等,总结出的超高频面经。vx🔍关注g众号“周哥的offer秘籍”,回复666,无套路领取本人50+场面试免费总结的Java后端开发面试题PDF文件。以下是部分内容截图如下(完整内容近3万字,题目关键,内容凝练,切中要害,全部个人手打积攒下来)不用付费进社群,不用付费进知某星球,更不用加v,毫无套路可言!朋友们,见者有份,冲!每一道题都是直击我简历里的硬核技能点,绝对干货满满。请直接按需抄我的技能树,然后背诵对应面试题。
2024-08-03 23:55:13
388
原创 一文解读ReentrantLock
其原理大致为:当某一线程获取锁后,将state值+1,并记录下当前持有锁的线程,再有线程来获取锁时,判断这个线程与持有锁的线程是否是同一个线程,如果是,将state值再+1,如果不是,阻塞线程。一个线程1获取到了锁,其他很多没获取到锁的线程(others_t)加入到了AQS的同步队列中等待,当这个线程执行完后,会去唤醒AQS同步队列中的下一个线程,被唤醒的线程和新来的线程重新竞争锁(不包含同步队列后面的那些线程),这些新来的线程相当于没有去排队而是直接插队和队首的被唤醒的线程一起竞争锁。
2024-08-01 17:26:55
473
原创 解锁Synchronized的奥秘:从原理到场景,再到锁升级全攻略!
偏向锁适用于大多数情况下是单线程获取锁的场景,而轻量级锁和重量级锁适用于多线程竞争锁的情况。它在 Java 中是基于监视器(Monitor)的概念实现的,因此可以说是在 JVM 层面提供的锁。"JDK 层面锁"通常指的是在 Java 开发工具包(JDK)中提供的高级锁机制,这些锁位于 java.util.concurrent 包下。偏向锁通过记录获取锁的线程ID,如果有其他线程尝试获取该锁,则需要撤销偏向锁,升级为轻量级锁。当锁升级到重量级锁时,会导致其他线程阻塞,只能等待持有锁的线程释放锁。
2024-08-01 16:43:32
529
原创 Java内存模型全解析:解决共享变量可见性与指令重排难题
然而,在多线程环境中,指令重排可能导致共享变量的可见性问题,即一个线程对共享变量的修改对其他线程来说不可见,从而破坏了程序的正确性。使用 volatile 关键字修饰的变量,对该变量的写操作会在写操作之后插入一个写屏障,确保写操作的结果对其他线程是可见的。锁的释放和获取会创建一个内存屏障(比如Synchornize中的monitorenter和monitorexit),确保了在释放锁之前的所有写操作都被刷新到主内存,而在获取锁之后的读操作都从主内存中重新加载。这样可以防止指令重排序,确保写操作的原子性。
2024-07-24 17:22:47
767
原创 解读ThreadLocal :为何能实现线程数据独立?
ThreadLocal的get方法: 当调用 ThreadLocal 的 get 方法时,实际上是在当前线程的 ThreadLocalMap 中查找对应的 ThreadLocal 对象,如果找到了,就返回该对象的值,否则返回 null。ThreadLocal的set方法: 当调用 ThreadLocal 的 set 方法时,实际上是在当前线程的 ThreadLocalMap 中插入一个键值对,其中键是 ThreadLocal 对象,值是要设置的局部变量值。了解fastThreaLocal吗?
2024-07-24 16:26:21
420
原创 揭秘 HashSet:基于 HashMap 的不重复魔法
因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层HashMap 的相关方法来完成。我们知道HashMap的key不允许重复,因此HashSet存储的值是不允许重复的值。HashSet底层采用HashMap保存元素,HashSet中保存的元素就是HashMap中的Key,而HashMap中的Key是不重复的,所以HashSet中的元素不会重复。在put方法中,首先会计算key的hash值,将(数组长度-1)与hash值进行&操作,得到插入哈希表的位置。
2024-07-23 17:23:19
412
原创 一文说透ConcurrentHashMap及大厂面试题
引入了 CAS(Compare and Swap)操作,使用了 synchronized 关键字,节点结构变为 Node,并引入了红黑树(当链表长度达到一定阈值时,链表会转换为红黑树,提高查询效率)。更新元素时,先回去synchronized锁定的node,然后便利链表或红黑树,找到需要修改的key,使用CAS判断值是否等于预期值,若等于,说明在此期间没被其他线程修改过,则更新,否则不更新或重试。红黑树中,平衡的概念是通过性质4(红节点不相邻)和性质5(黑平衡)来定义的,保证了红黑树的高度相对较小。
2024-07-22 23:18:04
1022
原创 HashMap 深度剖析:知识要点与高频面试题全解
例如:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A判断下标位置为空后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片,由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程A覆盖了,因此线程不安全。HashMap 的数组长度保证是 2 的整数幂,默认的数组容量是 16,默认装载因子上限是 0.75,扩容阈值是 12(16 * 0.75)。
2024-07-22 22:56:36
911
原创 ArrayList 大揭秘:底层结构、方法与面试攻略
说明:当执行synchronized修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。当向 ArrayList 中添加元素时,如果当前数组已满,它会自动扩容(默认扩容为原来容量的 1.5 倍)以容纳新的元素。在中间位置插入或删除元素时,需要移动大量元素,时间复杂度为 O(n)。当需要频繁地随机访问元素,而较少进行插入和删除操作时,ArrayList 是一个很好的选择。链表,寻址困难,插入删除容易。
2024-07-19 17:01:55
448
原创 Java集合(List、Set、Queue、Map)区别及主要实现类讲解
ConcurrentHashMap:JDK1.7 的 ConcurrentHashMap 底层采⽤分段的数组+链表 实现,JDK1.8 采⽤的数据结构跟 HashMap1.8 的结构⼀样,Node数组+链表/红⿊树。Map 使⽤键值对(kye-value)存储,Key 是⽆序的、不可重复的,value 是⽆序的、可重复的,可多对一。Arraylist : 底层obejct数组,查询快,增删慢,线程不安全,效率高。LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高。
2024-07-18 16:43:24
468
原创 分布式文件系统JuiceFS技术调研
与传统的文件系统或块存储不同,对象存储不使用传统的层次目录结构,而是使用扁平的命名空间。通过HTTPS与对象存储服务器。由于这个文件系统的「数据」和「元数据」都存储在基于网络的云服务中,因此在任何安装了 JuiceFS 客户端的计算机上都可以同时挂载该文件系统进行共享读写。与传统文件系统只能使用本地磁盘存储数据和对应的元数据的模式不同,JuiceFS 会将数据格式化以后存储在对象存储,同时会将文件的元数据存储在元数据引擎。对象存储是一种用于存储和管理大量非结构化数据的技术,它将数据以对象的形式进行存储。
2024-07-18 15:56:02
1303
原创 深挖 HashMap:JDK 1.7 与 1.8 的区别详解
当元素数量size达到阙值时即size > loadfactor * capacity 时,也是在putVal函数中,调用resize(),扩容后的数组大小是原数组的2倍,将原来的元素重新hash放入到新的散列表中去。jdk1.7中,hashmap会直接将null key放到index = 0的位置,遍历table[0]的Entry链表,寻找key的null的节点,找到后覆盖,未找到就添加一个null。创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。对key = null的处理。
2024-07-17 16:08:30
622
原创 清华大佬被裁,四个月0 offer。。。
采用尾插法插入数据。当元素数量size达到阙值时即size > loadfactor * capacity 时,也是在putVal函数中,调用resize(),扩容后的数组大小是原数组的2倍,将原来的元素重新hash放入到新的散列表中去。jdk1.7中,hashmap会直接将null key放到index = 0的位置,遍历table[0]的Entry链表,寻找key的null的节点,找到后覆盖,未找到就添加一个null。但清北毕业,大厂工作十多年的背景,却四个月都找不到合适的工作,第一眼看到,令人咋舌。
2024-07-17 16:00:10
1108
原创 Java I/O 模型:像做饭一样的高效操作
在异步I/O中,你的程序发起I/O请求后,就可以去做其他事情,当数据准备好了,操作系统会自动把数据送到你的程序中,不需要你的程序一直等待或轮询。通俗地讲,就像你在家里做饭,不同的I/O模型就像是不同的做饭方法,有的快速高效,有的则可能需要更多时间等待。在I/O多路复用中,你的程序可以同时监控多个I/O操作,当任何一个操作准备好了,系统就会通知你的程序。在Java中,NIO(New I/O)库提供了非阻塞I/O和I/O多路复用的能力,允许你更高效地处理大量并发的I/O操作。以上内容出自本人整理的面试秘籍。
2024-07-16 17:03:07
440
原创 解密 Java 反射:定义、原理、优劣及应用场景剖析
反射 API:Java 提供了一系列的反射 API,如java.lang.reflect包中的类和方法,允许程序在运行时通过Class对象获取和操作类的元数据,包括创建对象、调用方法、访问和修改成员变量等。在运行时,当使用反射机制时,通过获取类的Class对象,然后利用反射 API 提供的方法,可以动态地获取和操作类的各种信息,从而实现动态的对象创建、方法调用等操作。Class对象:在 Java 中,每个被加载的类都对应一个Class对象,它包含了该类的结构信息,如成员变量、方法、构造函数等。
2024-07-16 11:03:08
349
原创 深入剖析hashCode和equals的区别及大厂面试题
Object类的equals()方法上方的注释里有写到:当我们将equals方法重写后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。作用:hashCode() 的作用是获取哈希码,也称为散列码,其作用是将对象的地址值(即引用变量)映射为integer类型的哈希值。s1和s2的引用变量,即对象的地址,是不同的。由此可见,重写equals后必须重写hashcode是为了保证重写后的equals方法认定相同的两个对象拥有相同的哈希值。
2024-07-15 22:44:41
1242
原创 解读 String、StringBuilder、StringBuffer:从区别到场景应用
原因: 每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。原因:String中的对象是不可变的可以理解为常量,所以线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。以上内容出自本人整理的面试秘籍。
2024-07-13 21:55:45
150
原创 Java 数据类型详析
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。注:java 中基本数据类型的大小以及有关运算的行为都有明确的说明,例如 int 类型永远为 32 位整数,而在 C/C++ 中可能是 16 位整数、32 位整数,也可能是编译器开发商指定的其他任何大小。引用数据类型存储的是对象的引用(内存地址),而不是对象本身。
2024-07-13 20:52:58
186
原创 从求职惨败到阿里35w+offer,这位双非硕的经历太励志!
23年双非硕毕业,面试经历50+,毕业半年被裁后,一个月斩获大厂offer,年薪35w+,薪资涨幅1/3。
2024-07-11 22:39:34
1134
原创 【o2o商城项目】恢复iptables使用,造成mysql无法远程访问以及SSH登录端口修改后不生效问题
几经查找,发现原因在于,mysql端口号没有在iptables中配置。项目中为了将发送给80端口的请求给转发到8080端口,选择恢复使用iptables.service防火墙。最关键的同样是,新增行要放在icmp-host-prohibited之前。按照其他文章,修改SSH登录端口后,要想端口生效,不仅要配置安全组,
2022-08-21 19:01:04
445
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人