Java基础
文章平均质量分 50
JesseZHAO920
这个作者很懒,什么都没留下…
展开
-
多线程基础--线程池中线程池的个数确定
我们在多线程开发过程中,难免会遇到线程池使用, 但是,有时候我们会发现,线程池设置的线程数量是一个棘手的问题,线程数量设置过多或者过少,都会导致系统性能无法发挥出来,那我们该如何设置线程数量?在确定线程数量前,我们首先要思考一个问题就是系统性能优化指标,通常情况下,优化指标有降低延迟和提高吞吐量两个。降低延迟:发送请求到接收数据的时间。提高吞吐量:单位时间能可以处理更多的请求。(重点)从这两个指标,我们通常会分别采取优化算法和使硬件性能发挥到极致。优化算法:降低时间和空间复杂度,使得程序原创 2021-01-04 16:53:00 · 897 阅读 · 0 评论 -
Java的逃逸分析技术
使用内存逃逸分析技术,编译器会对代码做如下优化同步省略。如果一个对象被发现只能从一个线程被访问到。那么对于这个对象的操作可以不考虑同步。 将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使得指向该对象的指针永远不会逃逸,对象可能是栈分配的时候选的,而不是堆分配 分离对象或者标量替换。有的对象可能不需要作为一个连续的内存结构存在也可以访问到。那么对象的部分可以不存储在内存中,而是存储在...原创 2019-11-13 11:10:45 · 262 阅读 · 0 评论 -
Java 利用正则表达式替换第二个位置的固定字符串
0x01 背景在我们实际开发过程中,难免会遇到字符串替换问题,但String工具类中给我们提供的只有replace,replaceAll,replaceFirst三种方法供我们使用,小编在实际开发过程中遇到业务需求,需要替换字符串第二个位置的固定字符串,但是简单的使用上面的三种方法又不能很好的实现。所以,现在记录一下,该如何替换。0x02 代码public class TestRegExp { public static void main(String[] args) {原创 2020-11-30 15:07:45 · 2616 阅读 · 0 评论 -
Java Stream原理解析(二)续
前一篇文章关于Stream pipelines还留下两个问题,分别是叠加之后的操作如何执行以及执行后的结果在哪里,今天,小编在这里做一下收尾。叠加之后的操作如何执行?Sink完美的封装了Stream的每个步骤,并给出了【处理->转发】的模式来叠加操作。那经过操作记录保存以及操作叠加之后,就来到了最后一步,Stream是如何启动这一连串的叠加操作的?此时,你可能会记得我们在一开始说的结束操作会触发计算。结束操作之后不能再有别的操作,所以结束操作并不会创建新的Stage。结束操作会创建一个包装原创 2020-11-19 20:02:01 · 270 阅读 · 0 评论 -
Java Stream原理解析(二)
1、Stream Pipelines上一篇文章对Stream流做了简单介绍,并遗留下几个小问题,其中一个是Stream流在结束操作会触发实际计算,在计算发生的时候会把所有的中间操作积攒操作pipeline的方式进行,那此处pipeline到底是怎么样的方式那,下面我们用一个简单的例子来一步一步的理解。栗子:从一个字符串列表中找到以‘a'开头的,最长的字符串长度。一种简单的方式是每一次函数调用的时候都执行一次迭代,这样并将处理中间结果放到某种数据结构中(比如数组、容器等)。for循环的处理形式:原创 2020-11-19 19:27:40 · 196 阅读 · 0 评论 -
Java8 Stream流原理分析(一)
1、Stream的优势代码简单:函数式编程,使用Stream接口可以有效规避for循环的复杂运算多核友好:Java函数式编程能够使得编写并行程序从未如此简单,如果需要的,直接调用一下parallel()方法即可。这是常见的Stream接口继承关系图,图中4种Stream继承BaseStream,可以看到结构图中,Stream为不同数据据类型设置了不同的接口,在这里你可能会奇怪为什么不把IntStream等设计成Stream子接口?毕竟接口中的方法名大部分都一样。答案是因为这些方法的名原创 2020-11-19 16:55:53 · 468 阅读 · 0 评论 -
并发编程的理解(一)
https://juejin.im/post/6844903910113542152原创 2020-08-21 16:19:55 · 221 阅读 · 0 评论 -
递归拆解三步骤
算法思路“递归”一词顾名思义就是一个方法在不断的调用自己,没错,但这只是对递归最表层的理解。那么递归的实质是什么?递归的本质是在能够把一个大问题不断的拆解成比他小点的问题,然后,当我们拿到最核心的小问题解,就可以利用小问题的解去不断的解决大问题的解。那小问题的解该如何去得到?用再小一号的问题去解构出来,小到不能再小的时候就是我们最核心、最基础的零号问题。通过以上的这些发问,我们不难总结出递归算法的三步骤:核心、基础问题:就是递归的终点,走到最小的那个问题,能够直接给出结果,不必再原创 2020-07-01 16:52:08 · 906 阅读 · 0 评论 -
HashMap源码理解(一)
HashMap设计的初心是找到一种方法,可以存储一组键值对的集合,并能够快速的实现查找元素。Map的定义:是将键映射到值的对象HashMap中是利用内部类Node来定义存储这个键值对的,之后利用Node数组来存储HashMap数据结构,那我们都知道数组之所以能够快速的查找,是因为其具有索引(数组下标)直接定位到对应的存储桶(数组所存储对象的位置)。而在HashMap中为了能够利用索引来查找...原创 2019-11-13 13:32:29 · 114 阅读 · 0 评论 -
Java基础之类型信息(一)
我们都知道对于面向对象的语言,一般都会在编译期执行类型检查。那如果我们要在运行期间如何对数据类型进行提取并识别那,在Java里面有两种方式可以做到这一点。其一,利用传统的RTTI,它假定我们在编译时就已经知道所有类型。另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。RTTI(运行时类型识别)RTTI的一般形式我们先来看一段代码abstract class Shape ...原创 2019-08-08 17:11:20 · 129 阅读 · 0 评论 -
Java基础之this关键字解读
首先我们来看一下这段代码:class Banana{ public void peel(int i){ }}public class BananaPeel{ public static void main(String[] args){ Banana a=new Banana(); Banana b=new Banana(); ...原创 2019-07-08 12:57:36 · 116 阅读 · 0 评论 -
Java的常见误区和细节
1 定义名称时尽量避免使用$,因为编译器在对.java文件进行编译的时候,会将”$”编译成顶层类型与底层类型的连接符。2 当short,byte,char参加运算时,结果为int型,而非与较高的类型相同。如果变量是byte,short,byte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。这种隐式的收缩转换是安全的,因为该收缩转换只适用...原创 2018-04-14 10:46:08 · 210 阅读 · 0 评论 -
Java基础之方法重载
在日常生活中,相同的词可以表达多种不同的含义。而把这一思想放到程序设计语言当中,用“重载”来代表。特别是含义之间的差别很小的时候,这种表达方式的作用就显得的尤为重要。方法的重载在Java语言中可以说是随处可见。那么我们应该如何去判断方法的重载那? 区分重载的方法 Java是如何找到你调用的方法是哪一个的那?其实规则很简单:每个重载的方法都必须有一个独一无二的参数类型列表。对规则进行简...原创 2019-07-08 10:44:32 · 139 阅读 · 0 评论