![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 71
大树91
这个作者很懒,什么都没留下…
展开
-
HashMap常见面试题汇总
1 HashMap 的数据结构?整体是个数组结构,数组的元素是内部类Node,Node中有个成员变量 next,指向后续节点的指针,无哈希冲突时,是个单节点。当发生哈希冲突时,Node节点下将关联节点,形成联表。结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树。transient Node<K,V>[] table;2 HashMap 的工作原理?HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry原创 2021-10-09 18:39:33 · 275 阅读 · 1 评论 -
Jvm垃圾收集器总结之 Parallel Scavenge 收集器
Parallel Scavenge 收集器是个新生代收集器。它也是使用复制算法的收集器,又是并行的多线程收集器、、、、看上去和ParNew 都一样,那它有什么特别之处呢?Parallel Scavenge 收集器的特点是它关注的点和其他收集器不同,CMS 等收集器的关注点是尽可能的缩短垃圾收集器期间用户线程的停顿时间,而 Parallel Scavenge 收集器的目标则是达到一个可控的吞吐量(Throughput)。所谓吞吐量就是 CPU 运行用户线程的时间和 CPU 总时间的比值。即吞吐量 = 运行原创 2021-08-29 17:26:07 · 1326 阅读 · 4 评论 -
Jvm垃圾收集器总结(ParNew收集器)
ParNew收集器其实就是Serial 收集器的多线程版本,除了多条线程进行垃圾收集之外,其余行为包括 Serial 收集器的所有控制参数(例如: -XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure 等)、收集算法、Stop The World、对象分配规则、回收策略等都与 Serial 收集器完全一样,在现实上,这两种收集器也共用了相当多的代码。ParNew 收集器的工作过程如下图所示。ParNew 收集器除了原创 2021-07-04 18:27:04 · 295 阅读 · 1 评论 -
Jvm垃圾收集器总结(Serial收集器)
Serial收集器是最基本、发展历史最悠久的收集器,曾经(在Jdk1.3.1之前)是虚拟机新生代收集唯一的选择。从名字可以猜出,这个收集器是单线程的收集器,但它的“单线程”的意义并不是仅仅说明它只会使用一个CPU或一条线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,知道它收集结束。“Stop The World” 这个名字也许听起来很酷,但这项工作实际上是虚拟机在后台自动发起和自动完成的,...原创 2021-07-04 12:03:46 · 149 阅读 · 1 评论 -
list stream sort Comparator.nullsLast 避免空指针的正确用法
list排序中经常是针对对象的某个字段排序,但是字段为null是处理起来比较麻烦,java中有针对此情况的api,下面做详细介绍。代码案例@Testpublic void testListSort() { List<Book> bookList = new ArrayList<>(); bookList.add(new Book(null, "水浒传")); bookList.add(new Book(9, "钢铁怎样炼成的")); bookLi原创 2021-04-18 15:52:58 · 6693 阅读 · 1 评论 -
分布式CAP定理与Base理论
CAP定理(CAP Theorem),又被称作布鲁尔定理(Eric Brewer),1998年第一次提出。最初提出是指分布式数据存储不可能满足一下三种保证的两种以上一致性(Consistency)每次读取和收到的信息都是最新的;可用性(Availability)每个请求都会收到(非错误)响应;分区容错性(Partition tolerance)即使节点之间网络不通导致分区,系统仍继续运行。事实上,不仅是分布式数据存储应用,所有分布式应用都必须从CAP这三点中权衡。...原创 2021-03-28 13:30:00 · 92 阅读 · 0 评论 -
Java 手写实现 LRU 缓存机制
前言LRU是什么?是一种缓存淘汰策略。Least Recently Used 即最近最少被使用。为什么要用LRU?在计算机中,所有的文件操作都要放在内存中进行,然而计算机内存大小是固定的,所以我们不可能把所有的文件都加载到内存,因此我们需要制定一种策略对加入到内存中的文件进项选择。实现LRU应该具备哪些功能运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:条件:LRUCache(int capacity) 以正整数作为容量 ca原创 2021-01-10 22:22:21 · 748 阅读 · 0 评论 -
创建和使用Redis集群教程
要创建集群,我们需要做的第一件事就是让一些空的Redis实例在集群模式下运行。因为需要配置特殊模式,以便Redis实例将启用集群特定的功能和命令。系统: LinuxRedis版本:redis-6.0.9以下是Redis集群最简洁配置文件内容:port 7000 #端口号需改为和对应目录节点相等cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes如配置所见,启用集群模原创 2020-12-04 11:28:10 · 313 阅读 · 1 评论 -
springboot集成feign 拦截器Interceptor的使用
feign中可以使用拦截器Interceptor实现一些通用的业务逻辑,比如记录日志,权限校验等。feign提供了 feign.RequestInterceptor 接口,只需实现该接口,实现对应方法,并将实现类通过 @Component 交给spring容器管理,即可加上我们自己的通用处理逻辑。下面看代码实现:package com.wandou.springbootfeign.config;import feign.MethodMetadata;import feign.RequestInt原创 2020-11-20 14:32:55 · 4642 阅读 · 0 评论 -
springboot集成feign get方法怎么用对象传参
在项目中使用feign调用远程接口,有时对方是个get接口,而且有很多参数,写出来的feignclient就会有很多参数,我们很可能写出如下代码: @RequestMapping(path = "/s", method = RequestMethod.GET) String search(@RequestParam("param1") String param1, @RequestParam("param2") String param2, @RequestPa原创 2020-11-17 20:20:12 · 3929 阅读 · 5 评论 -
springboot单独使用feign调用远程http接口
项目开发中,我们有时会有调用远程接口的需求。一般,我们会用到Appache的HttpClient,这个方式会有很多代码量,并且每个人的写的HttpClientUtil可能都不一样,这样很不利于代码的同一,也很不优雅。下面介绍一种优雅的方式来实现远程http接口调用。feign-client首先我们基于springboot,pom文件如下:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apach原创 2020-11-16 20:42:34 · 2388 阅读 · 0 评论 -
Java如何判断一个数是奇数 有什么高效率的方式
这可能是历史上最简单的一道java面试题了。判断一个数是否是奇数public boolean isOdd(int i) {}上来个人小试牛刀,这还不简单嘛,然后代码可能是这样的。public boolean isOdd(int i) { if (i % 2 == 1) { return true; } else { return false; }}你别不信,我们曾经一个同事工作几年的程序员,就写出过如此代码,而且是在coderevie原创 2020-11-12 21:03:21 · 1954 阅读 · 0 评论 -
synchronized和ReentrantLock的区别的详细解读分析实现方式
synchronized和ReentrantLock的区别synchronized和ReentrantLock是jdk中保证线程安全的两大常用手段,也是两大利器。那他俩有啥区别呢?或者各自的特定和使用场景怎么样的呢?梳理他俩区别要从多个方面来分析,见如下表格。synchronizedReentrantLock实现层面Jvm c++实现Jdk java语言实现是否自动解锁是否是否可重入是是是否公平否公平、非公平可选...原创 2020-10-28 02:29:28 · 240 阅读 · 0 评论 -
Java内存区域划分及各区域作用
Java虚拟机内存区域示意图:各分区都有什么特点,他们的作用是什么呢?1. 程序计数器(Program Counter Register)线程私有。程序计数器是一块较小的空间,它可以看做是当前线程所执行的字节码的行号指示器。2. Java 虚拟机栈线程私有。Java 虚拟机栈的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对原创 2020-10-27 21:05:44 · 534 阅读 · 0 评论 -
IDEA解决maven包冲突
maven包冲突虽然在工作遇到不是特别多,但是遇到了也是很挠头的,下面介绍一种解决方式,妈妈再也不用担心我的maven冲突了。包冲突显现出来的问题有:某些类找不到。原因:工程中引入了一个需要的依赖,但工程中其他依赖的包内部也可能会有相同的依赖,如果版本不同maven可能取了一个低的版本,然后可能造成某个类找不到。比如:在工程中引入了easypoi jar,要使用Excel导出功能。<dependency> <groupId>cn.afterturn</groupId原创 2020-10-27 11:34:29 · 2805 阅读 · 0 评论 -
两个线程交替打印A1B2C3 ... 的几种实现方式
有以下需求:两个线程,需要打印字母和数字,格式A1B2C3 …这个问题涉及到线程的等待,唤醒,线程间通信等知识。下面看看实现代码:import java.util.concurrent.locks.LockSupport;/** * @author liming * @date 2020/10 * @description 交替打印 A1B2C3 ... */public class AlternatePrint { static Thread t1 = null, t2 =原创 2020-10-13 20:13:30 · 2175 阅读 · 6 评论 -
Java手写锁Lock 实现一个自己的锁
在juc包下有一些工具类(如 LockSupport)可以帮助我们实现一个自己的锁。原创 2020-09-24 17:43:35 · 584 阅读 · 0 评论 -
一个来自一线程序员对Java线程池的理解 手写线程池 带你翻过线程池这座山 升级第二版啦
第一版地址:https://blog.csdn.net/wandou9527/article/details/107769598第二版对比第一版优化点:线程实现延迟创建,对内存更友好自定义线程池实现java.util.concurrent.Executor 接口,更加符合规范submit方法改为execute方法,语义更贴切加入对任务(command)的非空判断优化后又离完美线程池近了一步。废话不说,我们上代码。package com.wandou.demo.thread.post.th原创 2020-09-17 20:50:01 · 266 阅读 · 2 评论 -
海量数据处理 大量数据中找出最大的前10个数 (Top K 问题)
在工作中我们常遇到此类问题,从一个大量甚至海量的数据中取出前几个大的数。必须在海量的文章中取出点击量最大的10篇文章。此类问题其实就是Top K问题。给定一个数据(数据量海量 N),想找到前 K 个最大的或最小的元素。eg:有10亿个Long型整数,如果找出其中最大的10个?最容易想到的方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序。每个Long类型占8个字节,10亿个数就要占用7GB+的存储空间,对于一些可用内存小于7GB的计算机而原创 2020-09-04 17:44:49 · 9412 阅读 · 0 评论 -
ArrayList为什么线程不安全 线程不安全体现在哪些方面 源码角度分析其具体原因
我们都知道ArrayList是线程不安全的,那么它不安全在哪里?又会出现什么并发问题呢?原创 2020-08-27 14:16:17 · 2214 阅读 · 1 评论 -
java中超过long范围的超大整数相加算法(面试高频) 第二版
第二版针对第一版做了一定优化,代码和算法就是个不断优化的过程。具体题目背景请看第一版文章,地址:https://blog.csdn.net/wandou9527/article/details/108025167大佬有更好更优雅的实现方式请评论区交流讨论。直接上代码:import org.junit.Test;/** * @author liming * @date 2020/8/20 */public class BigNumAddDemo { @Test publi原创 2020-08-20 14:30:33 · 818 阅读 · 1 评论 -
java中超过long范围的超大整数相加算法(面试高频)
java里有数字long来表示大的整数,如果两个数字的范围超过了long,要做加法算法怎么做呢?原创 2020-08-19 11:57:12 · 4754 阅读 · 1 评论 -
Java 手写线程池 带你翻过线程池这座山
如果想玩转 Java 的多线程与高并发,线程池是你永远也绕不过的山。既然绕不过,我们就啃他,吃透线程池,玩转高并发。原创 2020-08-09 18:59:20 · 468 阅读 · 4 评论 -
JVM GC Roots及Java的四种引用(强引用 软引用 弱引用 虚引用)
gc回收时jvm是如何判断对象已死的?原创 2020-07-31 22:49:59 · 525 阅读 · 2 评论 -
JVM GC 垃圾收集算法总结
jvm的垃圾收集算法总结起来有4种,严格来说应该是3种,下面一一详细介绍。由于垃圾收集算法涉及程序细节,而且各个平台的虚拟机操作内存的方法不同,因此这里不过多介绍算法的实现,注重几种算法的思想及发展过程。标记 - 清除算法最基础的算法“标记-清除”(Mark-Sweep)算法,算法分为“标记”和“清除”两个阶段:首先标记出所有要回收的对象,在标记完成后同一回收调,...原创 2020-06-03 20:06:06 · 193 阅读 · 1 评论 -
HashMap源码分析之扩容时机
首先从一个面试题说起,题目:jdk8中,一个默认大小(16)的HashMap最少存储几个元素会达到扩容点?有的可能会说16*0.75=12,有的会说8,让我们一探究竟。...原创 2020-05-07 15:55:44 · 919 阅读 · 0 评论 -
dubbo 使用
1 dubbo是什么一款高性能的Java RPC框架一款简单、易用的Java RPC框架一款优秀的RPC服务治理框架由阿里贡献的开源RPC框架官网地址: http://dubbo.apache.org/zh-cn/index.htmlgithub: https://github.com/apache/incubator-dubbo官方学习文档: http:...原创 2019-11-16 17:54:03 · 178 阅读 · 0 评论 -
Redis实现简单的分布式锁 (RedisTemplate实现)
概述分布式锁有很多种实现方式,比如数据库,zk,Redis等。原创 2019-10-28 20:13:09 · 292 阅读 · 0 评论