自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhaozhen的博客

立志做一个不是码农的码农的学习记录!

  • 博客(212)
  • 资源 (2)
  • 收藏
  • 关注

原创 java8 Consumer supplier predicate function 简单使用示例

java8 Consumer基本使用Java8之后提供了consumer接口,Consumer字面意思是消费者,这个接口里面只有一个accept方法,主要的功能是消费输入的数据,无返回。主要的几种使用方式有以下几种: @Test public void testConsumer() { //1. 直接new一个consumer对象 ,实现里面的accept方法 Consumer consumer = new Consumer() { @O

2021-09-27 15:24:38 137

原创 CSV文件读写操作

CSV文件读写操作CSVOperationUtilLinkIDCSVOperationUtilimport com.alibaba.fastjson.JSON;import com.opencsv.CSVReader;import com.opencsv.CSVReaderBuilder;import com.opencsv.CSVWriter;import com.opencsv.bean.CsvToBean;import com.opencsv.bean.CsvToBeanBuilder;

2021-08-10 11:17:14 246

原创 Java异常处理思路

Java异常处理思路一、错误的异常处理示例二、异常处理思路三、checked和unchecked异常四、异常码和异常类我自己在刚开始写代码的时候,总是有着这样的疑惑,想着请求第三方接口,或者是重要的处理步骤万一出错了,是不是得把异常处理一下。但是在看代码时发现一个现象,项目中的异常主要处理形式如下所示,代码中基本没有try-catch的异常处理语句,大部分的异常直接向上层抛出。关于异常处理自己也查了一些资料和师兄讨论过,所以专门学习总结一下项目中关于异常处理思路。public void methodB(

2021-08-08 13:50:52 186

原创 对实体类进行单元测试的小技巧

对实体类进行单元测试的小技巧抽象类使用示例抽象类/** * @Author zhaozhen * @Date 2021/7/22 6:14 下午 * @Version 1.0 用来测试实体类,提高单测覆盖率。 */@SpringBootTest@RunWith(MockitoJUnitRunner.class)public abstract class BaseVoEntityTest<T> { protected abstract T getT(); pr

2021-07-22 19:35:40 1164 1

原创 java面向对象基础概念

面向对象编程(Object-Oriented Programming OOP)是一种编程思维方式和编码架构。1. 抽象OOP 允许我们根据问题来描述问题,而不是根据运行解决方案的计算机,所以将问题空间中的元素以及它们在解决方案空间的表示抽象为“对象”(Object)。一个对象具有自己的状态,行为和标识。这意味着对象有自己的内部数据(提供状态)、方法 (产生行为),并彼此区分(每个对象在内存中都有唯一的地址)。对象的五大基本特征是:万物皆对象。你可以将对象想象成一种特殊的变量。它存储数据,但可以在你

2021-04-28 11:51:19 56

原创 homebrew常用命令

homebrew常用命令brew常用命令安装软件: brew install git卸载软件: brew uninstall git搜索软件: brew search git显示已经安装软件列表: brew list删除旧版本安装包缓存: brew cleanup git、brew cleanup查看那些已安装的程序需要更新: brew outdated更新软件,把所有的Formula目录更新: brew update更新某具体软件: brew upgrade git锁定某个软件禁止更新

2021-04-26 16:34:42 258

原创 CleanCode---代码整洁之道笔记

一、整洁代码糟糕 的代码想做太多事,它意图混乱、目的含混。整洁的代码只做好一件事,力求每个函数、每个类和每个模块都全神贯注于一事,完全不受四周细节的干扰和污染。如果对象功能太多,最好是切分为两个或者多个对象。如果方法功能太多,可以使用抽取手段进行重构,从而得到一个能较为清晰地说明自身功能的方法,以及另外数个说明如何实现这些功能的方法。整洁的代码从 不隐藏设计者的意图,充满了干净利落的抽象和直截了当的控制语句。简单的代码有以下几点要求:能通过所有测试。高效可用的代码是第一位。没有重复的代码。如果同

2021-04-17 15:53:11 281

原创 sql必知必会学习记录(三)

sql必知必会学习记录(三)本次纪录主要包括sql必知必会第三章(排序检索数据 )的内容使用order by 子句对SELECT检索出的数据进行排序SELECT prod_name FROM products ORDER BY prod_name;注意:在指定一条ORDER BY 子句时,应该保证它是SELECT 语句中最后一 条子句。如果它不是最后的子句,将会出现错误消息。同...

2021-04-11 16:42:17 710

原创 RPC学习记录(二)-RPC框架原理

RPC学习记录二架构设计,就是从顶层角度出发,厘清各模块组件之间数据交互的流程,让我们对系统有一个整体的宏观认识。传输模块:封装一个单独的数据传输模块用来收发二进制数据协议封装:序列化与反序列化过程,以及为减少所需传输的数据量和数据包拆分次数而引入的数据压缩。集群模块: 针对同一个接口有着多个服务提供者,但这多个服务提供者对于我们的调用方来说是透明的,所以在 RPC 里面我们还需要给调用方找到所有的服务提供方,并需要在 RPC 里面维护好接口跟服务提供者地址的关系,这样调用方在发起请求的时候才能快速

2020-09-21 12:58:03 115

原创 RPC学习记录(一)-基础、协议、序列化

RPC学习记录一RPC的基础原理RPC协议格式序列化方式JDK 原生序列化JSONHessianRPC的基础原理RPC 的全称是 Remote Procedure Call,即远程过程调用,主要有以下两个特点:屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。RPC中使用的相关协

2020-09-17 14:23:12 173

原创 Paxos算法

本篇文章主要主要是对paxos的算法思想的学习,是一片学习笔记,文章内容主要来自于极客时间分布式系统原理与实战课程中关于paxos的相关内容。Basic Paxos 中,有提议者(Proposer)、接受者(Acceptor)、学习者(Learner)Proposer : 提议一个值,用于投票表决。绝大多数场景中,集群中收到客户端请求的节点,才是提议者. 该角色代表的是接入和协调功能,收到客户端请求后,发起二阶段提交,进行共识协商;Acceptor: 对每个提议的值进行投票,并存储接受的值,比如 A

2020-09-13 21:00:20 163

原创 分布式理论知识学习(拜占庭将军,cap理论,base理论)

前两天的高德交叉面的时候,面试官把我PUA了,其中问到为啥cap理论中一般只能实现两个?这让我这捉襟见肘的脑容量瞬间爆炸了,赶紧在极客时间上面搞了个分布式理论算法原理与实践课程,来学习一下吧,下面的内容就是学习该课程的相关笔记。分布式系统里,最重要的事情,就是如何选择或设计适合的算法,解决一致性和可用性相关的问题了。一、理论篇1. 拜占庭将军问题拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。基于一些原因,这

2020-09-12 22:08:13 428

原创 Sql的奇淫技巧

case_when 对数据分类SELECT CASE WHEN population < 100 THEN '01' WHEN population >= 100 AND population < 200 THEN '02' WHEN population >= 200 AND population < 300 THEN '03' WHEN population >= 300 THEN '04' ELSE NULL END .

2020-09-10 20:50:46 101

原创 int[]与list<Integer>互转

/** * int[]转list<integer> */ List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList()); nums = list.stream().mapToInt(Integer::valueOf).toArray(); /*list转int[]*/ int[] intArr1 = list.stream().ma..

2020-09-01 16:51:11 533

原创 分布式事务

分布式事务一、什么是分布式事务二、基于 XA 协议的二阶段提交方法一、什么是分布式事务事务,其实是包含一系列操作的、一个有边界的工作序列,有明确的开始和结束标志,且要么被完全执行,要么完全失败,即 all or nothing。分布式事务,就是在分布式系统中运行的事务,由多个本地事务组合而成。在分布式场景下,对事务的处理操作可能来自不同的机器,甚至是来自不同的操作系统。分布式事务是多个事务的组合,那么事务的特征 ACID,也是分布式事务的基本特征。分布式事务主要是解决在分布式环境下,组合事务的一致性

2020-08-31 20:56:09 66

原创 分布式一致性协议与算法

分布式选举算法一、Bully算法二、 Raft 算法三、ZAB 算法为什么“多数派”选主算法通常采用奇数节点,而不是偶数节点呢?分布式选举是为了保证数据的一致性。一、Bully算法在 Bully 算法中,节点的角色有两种:普通节点和主节点。初始化时,所有节点都是平等的,都是普通节点,并且都有成为主的权利。但是,当选主成功后,有且仅有一个节点成为主节点,其他所有节点都是普通节点。当且仅当主节点故障或与其他节点失去联系后,才会重新选主。Bully 算法在选举过程中,需要用到以下 3 种消息:Elec

2020-08-31 19:56:18 622

原创 常见排序算法总结

冒泡排序 /** * 重复地走访要排序的元素,一次比较相邻两个元素,如果他们是逆序就把他们调换过来,直到没有元素再需要交换,排序完成。 * * @param nums */ public static void bubbleSort(int[] nums){ int len = nums.length; boolean flag = false; for(int i=0;i<len;i++){ .

2020-08-31 17:42:48 75

原创 二叉树遍历的相关算法

public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x){ val=x; }}二叉树的前序遍历对于图中二叉树而言其前序遍历结果为:6 2 0 1 4 5 8 9二叉树的前序遍历即先遍历根结点再遍历左结点最后遍历右结点,使用递归如下:public void preOrder(TreeNode root){ if(root==null){.

2020-08-31 11:09:38 93

原创 分布式协调与同步算法

分布式协调与同步算法分布式技术的发展:分布式系统的指标集中式算法分布式算法令牌环算法分布式技术的发展:单机模式所有应用程序和数据均部署在一台电脑或服务器上,由一台计算机完成所有的处理。模式的好处是功能、代码和数据集中,便于维护、管理和执行。但是CPU 和内存等硬件的性能将成为单机模式的瓶颈,会出现性能受限、单点失效问题数据并行或数据分布式并行计算采用消息共享模式使用多台计算机并行运行或执行多项任务,核心原理是每台计算机上执行相同的程序,将数据进行拆分放到不同的计算机上进行计算。好处是,可以

2020-08-30 22:05:28 1005

原创 多线程并发的一些解决思路

一、利用不变性解决并发问题不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。可以将一个类所有的属性都设置成 final 的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。Java SDK 里很多类都具备不可变性,例如经常用到的 String 和 Long、Integer、Double 等基础类型的包装类都具备不可变性,这些对象的线程安全性都是

2020-08-28 13:58:54 2091

原创 限流算法简单记录

限流算法介绍限流算法实现常见的限流算法有:计数器、令牌桶、漏桶。计数器算法采用计数器实现限流主要是限制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。具体的实现可以是这样的:对于每次服务调用,可以通过AtomicLong#incrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值

2020-08-27 19:12:56 65

原创 面试:如何设计一个秒杀系统

秒杀系统的特点高性能:秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键一致性:秒杀商品减库存的实现方式同样关键,有限数量的商品在同一时刻被很多倍的请求同时来减库存,在大并发更新的过程中都要保证数据的准确性。高可用:秒杀时会在一瞬间涌入大量的流量,为了避免系统宕机,保证高可用,需要做好流量限制设计思路将请求尽量拦截在系统上游,对请求进行限流和削峰。前端优化:限流:前端答题或验证码,来分散用户的请求禁止重复提交:限定每个用户发起一次秒杀后,需等待才可以发起另一次请求,从而减少用户

2020-08-26 19:48:51 1277

原创 redis学习记录

redis基础知识汇总缓存的基本知识缓存的思想缓存的优势与代价缓存读写的模式缓存分类及常用缓存缓存的七大经典问题一、redis 基础知识1. 什么是Redis?2. redis的优缺点?redis为什么是单线程的?redis比memcached的优势在哪里?以及两者的区别?redis的基本数据结构redis底层的数据结构redisObject字符串对象Sds列表对象ziplistquicklist哈希对象dict集合对象有序集合对象hyperloglogGEObitmapRedis的协议模式设计原则两种特殊

2020-08-25 14:57:04 139 1

转载 操作系统面试汇总

什么是进程?进程就是正在执行的程序,是操作系统资源分配的基本单位。一般来说,进程包含指令、数据和PCB。延伸问题:孤儿进程和僵尸进程有什么区别?孤儿进程就是说一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程ID为1的进程)所收养,并由 init 进程对它们完成状态收集工作。因为孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。僵尸进程就是一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 w

2020-08-22 11:12:20 206

原创 猿辅导一面

自我介绍Java中Synchronized是怎么实现?Synchronized修饰普通方法,代码块,静态方法都是锁的那些对象。Java对象头里面都有什么》Java锁升级的过程?Java中中断和异常的区别?恢复现场的流程。线程池的主要参数spring aop和IOC的实现原理。springMVC的执行流程MySQL的索引数据结构?B和B+树的区别?Mysql 聚簇索引和非聚簇索引的区别?给一个数组,在里面找到任意一个波峰。返回其索引?...

2020-08-21 16:00:35 362

原创 阿里高德电话面

自我介绍博客的内容都包含哪些方面?JVM OOM的问题的排查思路?哪些区域会出现OOM。如果经过检查jvm的堆内存和栈内存都没有溢出,但是系统的可用内存却变少了,可能是什么原因导致的。根据自己的实际经验来说,出现OOM的情况都是有哪些?数据库索引的存储结构?B+树这种索引结构的优势在哪?Java中classloader的作用?什么情况下应该使用自定义类加载器?举个例子我面试的其他同学大部分都讲对工程项目的理解不够深入,你为什么会有这么出色表现?你当初高考的时候为啥去河南工业大学而不是.

2020-08-17 15:31:37 85

原创 网易二面面经

自我介绍根据以下场景提出解决方案?netty中间件会有A->B->C三个阶段,但是C阶段的处理时间大概时1000ms, 问系统的瓶颈在哪里,如何处理。如果上面的netty中间件,是app的服务端中间件,app的每次请求都要进行等待结果返回,这时候该怎么处理?悲观锁乐观锁的理解?现在一个类里面有一个共享变量,有1000个线程对这个变量进行加一,用乐观锁还是悲观锁?同样的场景用乐观锁支持线程的数量多还是悲观锁支持的线程数量多,为什么。springboot 的优势?...

2020-08-14 15:41:43 764

原创 Java并发编程学习记录

Java并发编程汇总并发问题的分解多线程并发的特性volatile并发问题的分解synchronized、wait()、notify() 不过是操作系统领域里管程模型的一种实现。并发编程可以总结成三个核心问题:分工、同步、互斥。分工:指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共享资源。。Java SDK 并发包很大部分内容都是按照这三个维度组织的,例如 Fork/Join 框架就是一种分工模式,CountDownLatch 就是一种典型

2020-08-12 21:05:37 129

原创 缓存更新策略

缓存的更新策略一般来说,缓存有以下三种模式:Cache Aside 更新模式 :同时更新缓存和数据库Read/Write Through 更新模式 :先更新缓存,缓存负责同步更新数据库Write Behind Caching 更新模式: 先更新缓存,缓存定时异步更新数据库Cache Aside更新模式失效:应用程序先从 cache 取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。命中:应用程序从 cache 中取数据,取到后返回。更新:先把数据存到数据库中,成功后,再去删除缓

2020-08-07 14:30:36 1690

转载 一致性hash算法理解

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件

2020-08-07 12:08:51 160

原创 nginx高级特性

nginx高级特性一、流量复制二、流量转发三、流量限制一、流量复制复制线上真实流量,在不影响真实业务前提下,利用复制流量来做故障分析、性能定位、迁移评估等功能。具体功能包含:支持或禁止post请求复制,记录复制(镜像)日志主要是在nginx1.13.4及后续版本中提供了ngx_http_mirror_module模块,主要是该模块提供了镜像复制功能。可以通过配置多份相同的镜像,在做流量放大的功能。正常配置下,mirror请求不影响源站请求及响应,源站nginx-server将流量复制到mirror站后

2020-08-07 11:27:11 199

原创 顺丰二面面经

简介遇到什么问题怎么解决Nginx 流量复制爬虫去重缓存更新策略集群 分布式 区别 -> 部署很多分 拆成很多分一致性算法 raft Paxos一致性哈希 及解决问题ftp大量timewait状态?netty占包年报Mongo选型查询性能mongo索引JUC线程状态jvm内存模型gc算法 为什么这样设计jvm配置参数新老比例 默认多少 怎么算 4G内存可用内存有多少内存泄漏原因 排查解决Java领域擅长什么?有什么问题?没有遇到实际问题,一些问题考虑情况

2020-08-07 10:01:19 595

原创 顺丰一面面经

顺丰一面面向对象的三大特性,在Java中具体是怎么做的?封装:封装的目的是隐藏事务内部的实现细节,以便提高安全性和简化编程。继承:是代码复用的基础机制,继承可以看作是非常紧耦合的一种关系,父类代码修改,子类行为也会变动。在实践中,过度滥用继承,可 能会起到反效果。多态 多态包括重写、重载和向上转型。重写是父子类中相同名字和参数的方法,不同的实现;重载则是相同名字的方法,但是不同的参数。2. hashmap的put过程,扩容?如何获取全部的key和全部的value,concurrentHash

2020-08-04 16:41:58 191

原创 全排列回溯

public List<List<Integer>> permute(int[] nums) { int len = nums.length; //保存的结果 List<List<Integer>> res = new ArrayList<>(); if(len == 0){ return res; } Deque&lt...

2020-08-03 14:56:15 87

原创 Netty基础知识

Netty基础知识一、Netty零拷贝?Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffe

2020-08-02 18:47:15 71

原创 背包问题基础

0-1 背包问题import java.util.Scanner;public class ZeroOne {/** * 0 1 背包问题 * V[]表示物品的体积,W[]表示物体的价值。 * 采用动态规划来做 * 使用dp[i][j] 表示前 i 件物品恰放入一个容量为 j 的背包可以获得的最大价值。。dp[0-n][0-m] * 主要分为两种情况: * 1. 如果不装入第i个物品的时候,那么问题就转化为“前 i − 1 件物品放入容量为 j 的背包中”:dp[i][j] = dp[i-

2020-08-02 15:21:17 68

原创 快速幂的汇总

剑指 Offer 16. 数值的整数次方package cn.zanezz.offer.offer16;public class Solution { public double myPow(double x, int n) { int tmp = Math.abs(n); double res = 1d; for (int i = 0; i < tmp; i++) { res *= x; }

2020-08-01 11:02:56 45

原创 Unicode,UTF-8,UTF-16,UTF-32简单总结

Unicode是一种字符集,UTF-8,UTF-16,UTF-32是Unicode的三种不同的编码方式。Unicode编码定义了这个世界上几乎所有字符的数字表示,而且Unicode还兼容了很多老版本的编码规范,例如 ASCII码。在Unicode中为每个字符定义了一串唯一的ID来确定这个字符。这串数字在Unicode中被称作是码点。UTF是 Unicode Transformation Formats 的缩写,Unicode转换格式是为了解决[码点]在计算机存储方式而设计的。[码点]经过映射后得到的二进

2020-07-30 10:50:52 320

原创 百度基础架构部二面面经

UTF-8优势 辨别文件的编码方式reactorselect epollsocket通信https://www.runoob.com/java/net-serversocket-socket.html代码两个字符串;两个数字字符串相加https://segmentfault.com/q/1010000015714183/学生id 课程id 分数 找出挂科数>6select *from T where socre <60 #不及格的学生课程缓存不一致缓存穿透秒杀效率 公平;

2020-07-29 12:16:44 555

原创 算法基础知识

算法基础知识算法所具有的特征排序算法算法所具有的特征算法:能够对一定规范的输入,在有限时间内获得所要求的输出。有穷性,指算法必须能在执行有限个步骤之后终止-确切性,算法的每一步骤必须有确切的定义输入项,一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定义除了初始条件输出项,一个算法有一个或多个输出,以反映对输入数据加工后的结果,没有输出的算法是无意义的可行性,算法中执行的任何计算步骤都是可以被分解为基本的可执行操作步骤,即每个计算步骤都可以在有限的时间内完成。t

2020-07-29 12:08:50 339

图书管理系统

图书管理系统

2016-03-29

.net 框架

.net 语言汉化包,解决初学者的语言障碍

2015-07-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除