Java基础
每天晒白牙
Java后端开发,做过第三方支付、新零售和广告系统,大厂程序员(腾讯/58同城)
平时喜欢研究技术、读书
运营公众号:每天晒白牙
个人vx:dingaiminIT
展开
-
读写文件记录
经常会用到读写文件,做个记录public static void main(String[] args) throws IOException { String path = "/Users/dingaimin/Documents/userId.txt"; File file = new File(path); InputStreamReader reader = new InputStreamReader(new FileInputStream(f.原创 2021-05-18 14:43:06 · 118 阅读 · 0 评论 -
改善代码质量的编程规范
《设计模式之美》 改善代码质量的编程规范一、命名1.命名长度命名要准确达意,千万不要有“反正代码是我写的,我明白什么意思,随便起名就可以了”这样的误解,毕竟同事也会看我们的代码。对于一些长常用的单词,可以用缩写,这样可以保证既等达意又减少了命名的长度。对于一些作用域小的变量比如函数内的临时变量,可以使用短一些命名,对于作用域大的变量,最好还是用长命名的方式2.利用上下文简化命名类的...原创 2020-02-01 17:02:05 · 3392 阅读 · 0 评论 -
同事:把"重试"抽象出来做个工具类吧
背景介绍我们在工作中难免会写一些重复性的代码,所以需要我们具备一定的抽象能力,比如把共同的逻辑抽取到抽象类中,也可以通过一些工具类来避免冗余代码今天这篇文章就是把一个调用服务的重试功能抽取出一个工具类,以备复用。这里为了方便介绍,把调用服务简化成方法的调用,被调用的 foo 方法如下:publicstaticList<String>foo(){//没有显示抛出...原创 2019-12-18 21:18:45 · 401 阅读 · 0 评论 -
从ReentrantLock的实现看AQS的原理及应用
前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占...转载 2019-12-09 14:21:15 · 168 阅读 · 0 评论 -
不可不说的Java“锁”事
前言Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体...转载 2019-12-09 11:21:36 · 81 阅读 · 0 评论 -
Spring3.x能用jdk8的lambda表达式吗?
公司有个站点用的公司内部的自研的类springMVC框架WF,所以在这个项目中没有引入spring,而是直接使用的WF框架中的。今天写代码,使用了lambda表达式,然后启动项目就报下面的异常:BeanDefinitionStoreException Failed to read candidate component class上面的异常导致这个有问题的java文件对应的class文件是有问题的...原创 2018-06-27 19:51:29 · 2192 阅读 · 0 评论 -
抽象类和接口的区别
最近在微信阅读中读《大话设计模式》,书中在开头介绍了抽象类和接口的区别,文中总结的很好,记录下来。1.abstract class 在java语言中表示的是一种继承的关系,只能单继承,而接口可以多实现。2.abstract class中可以有自己的数据成员,也可以有非abstract的成员方法,而在interface中,只能有静态的不能修改的数据成员(即 static final修饰,在inter...原创 2018-06-29 10:29:28 · 128 阅读 · 0 评论 -
NumberFormat去掉千分位
最近在做广告投放平台的报表,PM说CTR(点击率)需要在前端展示成带 %的,例如 80%,不要小数,因为不直观,并且时间趋趋势图在前端用echart展示,就采用了NumberFormat,实例代码如下: @Test public void test3() { NumberFormat numberFormat = NumberFormat.getPercentInst...原创 2018-07-26 18:00:13 · 7657 阅读 · 0 评论 -
cpu占用过高和jvm old占用过高排查过程
今天断断续续的收到管理平台的异常报警,cpu占用过高和jvm old占用过高,这个时候赶紧去排查原因,下面记录了我的排查过程,可能里面还有不正确的地方,欢迎各位大佬指正,也欢迎大家关于类似的案例一起交流,下面就看我关于这次排查的过程把报警 cpu使用率过高报警,接近100% 后续又来了jvm old过高报警 排查过程 首先打开监控平台看报警节点的cpu...原创 2019-05-08 22:17:43 · 3147 阅读 · 0 评论 -
分母为0一定会抛异常吗?
现象描述最近做了一个需求,用到了 预算 / 时间窗口数,其中预算是double类型,时间窗口数是int类型,其中时间窗口数我计算的有问题,会出现为0的情况(实际最小值应该为1),然后就出现了 一个double类型的数除以0的情况,分母为0,是不是要报 java.lang.ArithmeticException: / by zero?(不蛮大家,我最初也是这样认为的,但这个异常是针对整数的,...原创 2019-09-16 22:46:58 · 2681 阅读 · 0 评论 -
5分钟学linux命令之split
情景介绍平时工作中,我习惯使用rz从本地上传文件到服务器,sz从服务器下载文件到本地,但对传输文件大小有限制,例如排查线上jvm的问题,需要生成了dump文件,可能有10G大,超过了限制,怎么下载呢?拆分文件命令之split语法split [-<行数>][-l<行数>][-b<字节>][-C<字节>][要切割的文件][输出文件名的前缀][-...原创 2019-09-24 07:52:58 · 976 阅读 · 0 评论 -
在代码中使用二进制
今天看netty源码时,看到了EventExecutorChooser(事件执行器选择器,实现从worker reactor线程组中选择一个线程)的创建@SuppressWarnings("unchecked") @Override public EventExecutorChooser newChooser(EventExecutor[] executors) { ...原创 2018-06-18 17:14:02 · 1184 阅读 · 0 评论 -
IDEA导入github项目
首先在IDEA设置上github的用户名和密码 :然后配置git然后导入github上的项目 New->Project from Version Contro->Git把github上地址复制到上面,注意选择“Use SSH”注意:如果报 ssh key的错误,就查看本地上是否有公私钥,地址 C:\Users\dingaimin\.ssh如果没有 .ssh,就需要用git bash创建...原创 2018-05-31 22:52:16 · 21731 阅读 · 0 评论 -
IDEA更新svn项目提示authentication required解决方法
在idea更新svn项目的时候,经常提示authentication required,然后输入用户名和密码,还是提示,容易被折磨崩溃。下面是解决办法:File->Settings->Version Control->Subversion->Clear Auth Cache...原创 2018-06-07 16:15:45 · 54607 阅读 · 20 评论 -
switch没注意到的地方
昨天突然看到一个switch-case的用法,之前没有注意过,看下面的测试例子: @Test public void testSwitch() { switch (1) { case 0: System.out.println("0"); break; c...原创 2018-05-05 11:20:41 · 179 阅读 · 0 评论 -
HttpClient工具类遇到jar包冲突
上周一要写一个HttpClient工具类,用的httpcomponents-4.5.5,但是项目中pom文件中还有httpcore-4.1.2和httpclient-3.1,pom文件如下图:然后就遇到了下面的异常:可以看到异常是httpcomponents-4.5.5包下的ManagedHttpClientConnectionFactory类中依赖LaxContentLengthStrategy...原创 2018-05-19 17:29:12 · 8721 阅读 · 0 评论 -
如何合理设置集合HashMap或ArrayList的初始值
我们在使用集合时,例如HashMap时,默认初始容量为16,加载因子0.75,2倍扩容,如何设置初始容量呢?对于HashMap,如果预知存储为n个,则 n/0.75向上取整为m(此处默认加载因子是0.75),则初始容量设为大于m的最小的2的幂次方的数(其实底层默认就是2的幂次方),较少resize带来的消耗。总结: n/0.75向上取整为m,然后初始容量设置为大于m的最小的2的幂次方的那个数。关于...原创 2018-05-19 18:19:41 · 1664 阅读 · 0 评论 -
HashMap的默认容量为何为16?为何是2的整数倍?
static int indexFor(int h, int length) { return h & (length-1); }我们知道对于HashMap的table而言,数据分布需要均匀(最好每项都只有一个元素,这样就可以直接找到),不能太紧也不能太松,太紧会导致查询速度慢,太松则浪费空间。计算hash值后,怎么才能保证table元素分布均与呢?我们会想到取模,但是由于...原创 2018-05-19 18:26:37 · 5195 阅读 · 4 评论 -
解决线上问题-定位CPU占用过高
如果线上服务器CPU占用率过高,如何定位问题呢? 1.使用 top 命令查看占用CPU最高的pid 2.使用 top -H -p pid或 top -Hp pid命令查看占用cpu最大的线程id即 tid 3.使用命令 printf ‘%x/n’ tid 打印出线程id的十六进制 4.使用 jstack pid | grep tid -A 30 定位该线程的堆栈信息...原创 2018-05-20 14:54:07 · 687 阅读 · 1 评论 -
java并发编程实战-this引用逸出
《java并发编程实战》中介绍了“发布与逸出”,首先介绍下发布,然后重点介绍this引用逸出。一、发布“发布”一个对象是指,使对象能够在当前作用域之外的代码中使用。例如:①将一个指向该对象的引用保存到其他代码可以访问的地方②在某一个非私有的方法中返回该引用③将引用传递到其他类的方法中下面我们来看几个具体的例子:①将对象的引用保存到一个公有的静态变量中,可以使任何类和线程都能看到该对象import ...原创 2018-05-20 16:06:43 · 624 阅读 · 3 评论 -
final域的内存语义
最近看了《java并发编程的艺术》,3.6节讲解了final域的内存语义。简单总结下。1.final域的的重排序规则对应final域,编译器和处理器需要遵守两个重排序规则①在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序--对应写final域②初次读一个包含final域的对象的引用,域随后初次读这个final域,这两个操作之间不能重排序...原创 2018-05-20 23:49:58 · 737 阅读 · 1 评论 -
JAVA中基本数据类型和占用内存空间大小
byte:1个字节,8位,-128~127 最大存储数据量 255short:2个字节,16位,-32768~32767 最大存储数据量 65535char:2个字节,16位,存储Unicode编码,用‘’int:4个字节,32位,负的2的31次方~2的31次方-1 最大存储数据量 2的31次方-1float:4个字节,32位double:8个字节,64位long:8个字节,64位,负的2的64...原创 2018-05-15 14:24:00 · 13107 阅读 · 2 评论 -
java的受检异常(checked exception)和非受检异常(unchecked exception)
首先看一下java异常的层次图从图中我们可以看出,Error和Exception都是Throwable的子类Error一般指在java虚拟机中发生的,不需要程序猿try-catch或者抛出受检异常(checked exception):在编译时需要检查的异常,需要用try-catch或throws处理。在java中主要指除了Error和RuntimeException之外的异常非受检异常(unch...原创 2018-05-22 11:31:34 · 2464 阅读 · 0 评论 -
JAVA中的宏
在java中,被final关键字修饰的变量,且设置了初始值,那么这个值在编译阶段就已经确定了值,则这个变量就是“宏变量”,编译器会把用到该变量的地方全部都替换成设置好的那个值。简单点说就是“被final关键字修饰且给了初始值的变量就是宏变量”。下面看一个例子: @Test public void test2() { String s1="java"; Str...原创 2018-05-31 14:32:56 · 10085 阅读 · 1 评论 -
GC算法和垃圾收集器
一、概述:垃圾收集器(Garbage Collection,GC)。运行时区域的程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭。所以这几个区域不需要过多考虑回收问题,因为方法结束和线程结束时,内存自然就跟随着回收了。gc主要回收的区域是堆和方法区,因为这部分的内存的分配和回收都是动态的。二、判断对象存活状态1.引用计数法给对象添加一个计数器,每当有一个地方引用它时,计数器值加1;当...原创 2018-04-05 16:24:00 · 551 阅读 · 0 评论