202009-24 Java Grpc实例创建负载均衡详解 Grpc是googe开发的,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。新公司的项目服务之间的调用使用的Grpc来实现服务间的调用,这边一开始接到的工作内容是基于Nginx实现Grpc服务端的负载均衡。Nginx的1.13及以上版本是支持grpc的反向代理和负载均衡的。但是公司的nginx服务器的版本是1.10的,所以没办法直接使用grpc的代理。只能使用更底层的tcp层的负载均衡。最终服务跑起来是感觉挺简单的,但是nginx的基础太差,所... 继续阅读 >
202009-24 Java Arrays.asList使用方法解析 Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一个内部类。阿里的开发手册上java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出java.lang.UnsupportedOperationException的异常。一、Arrays.asList的方法说明publicstaticvoidmain(String[]args){String[]strs={"1... 继续阅读 >
202009-24 java中的forkjoin框架的使用 forkjoin框架是java7中引入框架,这个框架的引入主要是为了提升并行计算的能力。forkjoin主要有两个步骤,第一就是fork,将一个大任务分成很多个小任务,第二就是join,将第一个任务的结果join起来,生成最后的结果。如果第一步中并没有任何返回值,join将会等到所有的小任务都结束。还记得之前的文章我们讲到了threadpool的基本结构吗?ExecutorService-ForkJoinPool用来调用任务执行。workerThread-ForkJoinWorkerT... 继续阅读 >
202009-24 详解Java如何进行Base64的编码(Encode)与解码(Decode) 关于base64编码Encode和Decode编码的几种方式Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便。在实际应用上,Base64除了能将Binary资料可视化之外,也常用来表示字串加密过后的内容。如果要使用Java程式语言来实作Base64的编码与解码功能,可以参考本篇文章的作法。早期作法早期在Java上做Base64的编码与解码,会使用到JDK里sun.misc套件下的BASE64En... 继续阅读 >
202009-24 Java汉字转拼音工具类完整代码实例 添加依赖<dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency>工具类代码:publicclassPinYinUtils{publicstaticHanyuPinyinOutputFormatPINYIN_FORMAT;static{PINYIN_FORMAT=newHanyuPinyinOutputFormat();/***大小写设置*LOWERCASE:小写*UPPERCASE:大写*/PINYIN_FORMAT.setCaseType(Han... 继续阅读 >
202009-24 Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】 本文实例讲述了Java二叉搜索树遍历操作。分享给大家供大家参考,具体如下:前言:在上一节Java二叉搜索树基础中,我们对树及其相关知识做了了解,对二叉搜索树做了基本的实现,下面我们继续完善我们的二叉搜索树。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历,如图:因为树的定义本身就是递归定义,所以对于前序、中序以及后序这三种遍历我们使用递归的方法实... 继续阅读 >
202009-24 Java多线程生产者消费者模式实现过程解析 单生产者与单消费者示例:publicclassProduceConsume{publicstaticvoidmain(String[]args){Stringlock=newString("");Produceproduce=newProduce(lock);Consumeconsume=newConsume(lock);newThread(()->{while(true){produce.setValue();}},"ProductThread").start();newThread(()->{while(true){consume.ge... 继续阅读 >
202009-24 Java二叉搜索树基础原理与实现方法详解 本文实例讲述了Java二叉搜索树基础原理与实现方法。分享给大家供大家参考,具体如下:前言:本文通过先通过了解一些二叉树基础知识,然后在转向学习二分搜索树。1树1.1树的定义树(Tree)是n(n>=0)个节点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的节点;(2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1、T2、......、Tn,其中每一个集合本身又是一棵树,并且称为根的子树... 继续阅读 >
202009-24 简单了解JAVA内存泄漏和溢出区别及联系 1、内存泄漏memoryleak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。2、内存溢出outofmemory:指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。3、二者的关系:内存泄漏的堆积最终会导致内存溢出... 继续阅读 >
202009-24 Java递归运行的机制:递归的微观解读图文分析 本文讲述了Java递归运行的机制:递归的微观解。分享给大家供大家参考,具体如下:前言:在java递归基础与递归的宏观语意和java链表的天然递归结构性质中我们分别通过数组以及链表对递归进行了应用,那时我们只是对递归进行了宏观理解--递归是将问题化为更小问题的子过程。这一节我们对在4.1节中递归在数组中的应用和4.2节中递归在链表中的应用进行微观解读:一.关于4.1节中递归在数组中的应用1)我们先来看看4.1节中的代码实现,... 继续阅读 >
202009-24 Java链表的天然递归结构性质图文与实例分析 本文实例分析了Java链表的天然递归结构性质。分享给大家供大家参考,具体如下:有关链表,参考之前的文章学习。要求:使用递归删除链表中指定的所有元素值。一、图文分析假设有这么一个链表,如下图:分析:基于链表的宏观语意(递归是问题更小的子过程)进行分析我们可以把上述链表看成是一个头结点后面挂接了一个更小的链表组成,如下图:此时我们可以把链表概括成如下的链表结构:1、在一个头结点+更小的链表基础上,从更小的链... 继续阅读 >
202009-24 Java synchronize底层实现原理及优化 首先来说下synchronize和Lock的区别:两者都是锁,用来控制并发冲突,区别在于Lock是个接口,提供的功能更加丰富,除了这个外,他们还有如下区别:synchronize自动释放锁,而Lock必须手动释放,并且代码中出现异常会导致unlock代码不执行,所以Lock一般在Finally中释放,而synchronize释放锁是由JVM自动执行的。Lock有共享锁的概念,所以可以设置读写锁提高效率,synchronize不能。(两者都可重入)Lock可以让线程在获取锁的... 继续阅读 >
202009-24 Java Volatile关键字实现原理过程解析 volatile的用法volatile通常被比喻成"轻量级的synchronized",也是Java并发编程中比较重要的一个关键字。和synchronized不同,volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。volatile的用法比较简单,只需要在声明一个可能被多线程同时访问的变量时,使用volatile修饰就可以了。如以下代码,是一个比较典型的使用双重锁校验的形式实现单例的,其中使用volatile关键字修饰可能被多个线程同时访问到的single... 继续阅读 >
202009-24 Java Map接口及其实现类原理解析 Map接口Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;Map中的键值对以Entry类型的对象实例形式存在;建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。Map支持泛型,形式如:Map<K,V>Map中使用put(Kkey,Vvalue)方法添加Map接口中定义的常用方法具体使用在实现类中讨论intsize();//获取Map集合大小(即元... 继续阅读 >
202009-24 Java方法重载和重写原理区别解析 一、方法重写(0verride)在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样一种操作方法称为重写,也可以叫覆写或覆盖。所以,所谓方法的重写是指子类中的方法和父类中继承的方法有完全相同的返回值类型、方法名、参数个数和参数类型。这样就可以实现对父类方法的覆... 继续阅读 >
202009-24 Java多维数组和Arrays类方法总结详解 一.数组的三种声明方式总结publicclassWhatEver{publicstaticvoidmain(String[]args){//第一种例:String[]test1=newString[6];test1[0]="数组0";test1[1]="数组1";//第二种例:String[]test2={"数组0","数组1","数组2","...."};//第三种例:String[]test3=newString[]{"数组0","数组1","数组2","...."};}}<br><br>二.多维数组的遍历/二维数组/二维数组publiccla... 继续阅读 >