![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java 基础
文章平均质量分 85
卓立~
现在一家电商做广告平台,Java后端后端开发
展开
-
Java编程拾遗『JVM垃圾回收』
垃圾收集(Garbage Collection)通常被称为GC,大部分人都把这项技术当作Java语言的伴生产物。事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp语言是第一门真正使用内存动态分配和垃圾收集技术的语言。经过半个世纪的发展,内存动态分配与内存回收技术已经相当成熟,一切看起来都进入“自动化”时代,那么为什么我们还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”技术实施必要的监控和调原创 2020-06-30 08:26:36 · 283 阅读 · 0 评论 -
Java编程拾遗『并发容器——CopyOnWrite』
从本片文章开始我们来介绍并发容器类,之前的文章介绍过普通容器类,比如ArrayList、LinkedList等。但是这些容器都有个问题,就是非线程安全,多线程并发写,会存在线程安全问题,所以Java提供了并发容器类来解决普通容器类的线程安全问题。本篇文章我们先来看一种解决容器类线程安全的思想——CopyOnWrite(写时复制)。1. 同步容器在讲CopyOnWrite并发容器之前,先来介...原创 2020-01-05 10:36:47 · 227 阅读 · 0 评论 -
Java编程拾遗
在学校时,从未接触过Java编程相关的东西,开始工作的前半年多的时间亦然。后来一些偶然的原因,我做了个决定,做一名Java程序员。在计算机这个领域,非常盛行这么一句话,编程都是相通的,当你熟悉一门开发语言之后,再去转其他语言是很简单的。但是我当时从零开始学Java的过程并不是很顺利,自己一度非常迷茫。后来我体会到“编程都是相通的”这句话的含义,它是有前提的,那就是对当前使用的这门语言的“熟悉”程度...原创 2018-11-06 07:01:58 · 159 阅读 · 0 评论 -
分布式服务防重复提交方案
之前文章介绍过一种单点部署服务防重复提交的一种方式,但是实际开发中,单点服务是很少见得,之前的那种防重复提交的方案在分布式环境下也就嗝屁了。本文实现一种分布式服务防重复提交的方案,跟之前那篇文章的思想是一致的,也就是是一线一个锁,在方法请求前,要先获取锁,不同的是,本文的锁是分布式锁,而之前那篇文章的锁是本地锁。其实分布式锁的实现方式有很多种,比如使用Mysql、或者Zookeeper等都可以实现...原创 2018-11-05 07:02:16 · 3355 阅读 · 6 评论 -
Spring Boot防重复提交
考虑这样一种情况,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,用户极有可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单。我们在开发中必须防止表单重复提交,否则很有可能会生成非法数据。本文介绍一种非分布式服务后台防重复提交的一种实现方式,虽然在实际工作中,单点部署的服务已经很少了,但是我还是决定单独介绍一下,后面的文章再去介绍分布式服务防重复提交的方法,因为无论是单...原创 2018-11-05 07:00:17 · 8788 阅读 · 8 评论 -
Spring Boot实现定时任务
在应用开发中,经常都有用到在后台跑定时任务的需求。比如需要在服务后台跑一个定时任务来进行数据清理、数据定时增量同步、定时发送邮件、爬虫定时抓取等等,这种情况下,我们往往需要执行定时任务。在java中定时任务有多种实现方式,比如使用线程、使用Timer、使用ScheduledExecutorService、Spring Task等等。本文会简单讲述一下上述几种方式的实现方法。1. 使用普通线程T...原创 2018-11-05 06:59:14 · 2808 阅读 · 0 评论 -
Spring Boot集成Kafka
Kafka发源于LinkedIn,于2011年成为Apache的孵化项目,随后于2012年成为Apache的主要项目之一。Kafka使用Scala和Java进行编写。Apache Kafka是一个快速、可扩展的、高吞吐、可容错的分布式发布订阅消息系统。Kafka具有高吞吐量、内置分区、支持数据副本和容错的特性,适合在大规模消息处理场景中使用。关于kafka的基本概念,建议去kafka官方文档了解一...原创 2018-11-05 06:58:10 · 1526 阅读 · 0 评论 -
Spring Boot + Redis实现缓存
缓存作为开发中提高服务性能相对有效的一种方式,在实际开发中得到广泛使用。在Spring 3.1之前,如果想使用缓存,相对是比较麻烦的,往往在业务代码中要掺杂缓存的逻辑,比如判断缓存是否存在,存在则取缓存,不存在在从DB中读取,然后再讲数据存入缓存中,使用起来相当不方便。Spring 3.1引入了基于注释的缓存技术,它本质上不是一个具体的缓存实现方案(例如EHCache、Redis、MemoryCa...原创 2018-11-05 06:56:48 · 223 阅读 · 0 评论 -
Spring Boot + Jedis实现redis常规数据结构存储
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以用作数据库、缓存和消息中间件,可以说是实现网站高并发不可或缺的一部分。它支持多种类型的数据结构,如字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有...原创 2018-11-05 06:53:37 · 355 阅读 · 0 评论 -
Java编程拾遗『final详解』
之前讲String类的时候,讲了String类是不可变类,其实现方式中有一个重要的保障是final—final修饰class以及final修饰了内部成员变量char[]。本文会详细讲一下final的使用场景以及使用final的好处。1. final的基本用法final是Java中的一个关键字,可以用来声明类、变量、方法和方法参数,分别表示类不可继承、成员变量引用不可改变、方法不可不该以及参...原创 2019-01-29 10:23:41 · 193 阅读 · 1 评论 -
Java编程拾遗『StringBuilder和StringBuffer』
在之前的文章中,我讲了String类,在讲intern那一节中,讲到当String实例使用”+”操作时,编译后其实使用的是通过StringBuilder的append实现的。另外我们都知道String是不可变类,每次对String实例进行改变的时候,都会生成一个新的String实例,然后将引用指向新的String实例,所以经常改变内容的字符串最好不要用String ,因为每次生成对象都会对系统性能...原创 2018-11-07 07:35:44 · 144 阅读 · 0 评论 -
Java编程拾遗『搞定编码』
提到编码,也许很多人都有概念,就是普通字符转化位计算机能识别的二进制码的过程。但是具体到各种字符集,编码方式,为什么会有这些编码方式,再到Unicode和UTF-8、UTF-16是什么关系,相信很多人都答不上来。字符集和编码也是很多人比较头疼的问题,我一度也搞不明白。直到之前写String类那篇文章,读了Character源码,并查阅了一堆资料,才真正搞懂编码的来龙去脉,搞明白字符是如何在计算机和...原创 2018-11-07 07:34:48 · 295 阅读 · 0 评论 -
Java编程拾遗『异常体系』
异常是指程序运行时(非编译时)所发生的非正常情况或错误比如空引用、数组越界、内存溢出等,这些都属于程序运行过程中的意外情况。当程序违反了语义规则时,JVM就会将出现的错误表现为一个异常并抛出,假如对这些异常置之不理,就会导致程序终止或者直接系统崩溃,所以Java中提供了一套异常机制来进行异常处理,从而提高程序的安全性和健壮性。Java中把异常当作对象来处理,并定义了一个基类(java.lang...原创 2018-11-07 07:33:35 · 174 阅读 · 0 评论 -
Java编程拾遗『String类』
从概念上讲,Java字符串就是Unicode字符序列。例如,串“Java\u2122”由5个Unicode字符J、a、v、a和TM。每个用双引号括起来的字符串都是String类的一个实例:String e = ""; //空字符串String greeting = "hello"; 1. Java API String常用方法在Java API中,String定义如下:pub...原创 2018-11-07 07:32:53 · 193 阅读 · 0 评论 -
Java编程拾遗『static详解』
static关键字在开发中是比较常见的,但是很多人对其都没有一个明确的认识,只有一种比较模糊的概念,甚至不知道该怎么用。本篇文章将总结一下,Java中static关键词的用法。首先来看一下static关键字的作用:为特定的数据类型或对象分配单一的存储空间,而与创建对象的个数无关 实现某个方法或属性与类而不是对象关联在一起,也就是将方法或属性是属于类的,可以通过类名直接访问,而不用借助于对象。...原创 2018-11-07 07:32:07 · 171 阅读 · 0 评论 -
Java编程拾遗『内部类』
上篇文章讲述了Java中两种特殊的”类”—接口和对象,本篇文章将讲述一下Java中另一种特殊的类—内部类的相关细节。内部类是相对于普通类来讲的,是指定义在一个类内部的类,而包含它的类则称为外部类。一般来讲,内部类和外部类都有着比较密切的联系,同时和其它类的关系并不是很大,定义在类内部,可以实现对外的隐藏,可以更好地封装。但是内部类只是Java编译器的概念,对于Java虚拟机而言,它并不知道内部类的...原创 2018-11-07 07:31:26 · 161 阅读 · 0 评论 -
Java编程拾遗『接口与抽象类』
上篇文章讲了Java中类和对象的一些基础概念,本篇文章讲述一下,Java中两种特殊的”类”,接口和抽象类。熟悉Java编程的都知道,Java中是不允许多继承的,有人讲Java中可以通过接口实现多继承,但其实这种说法是不对的,Java之父James Gosling在1995年2月发表了一篇名为”Java: an Overview”的Java白皮书,文章解释了Java不支持多重继承的原因。JAV...原创 2018-11-07 07:30:42 · 164 阅读 · 0 评论 -
服务限流(本地)
前几天一直有个老哥在刷我们的后台接口,其实我们风控是有反扒的,但是貌似那几天反扒失效了==,原因这里就不讲了。当我们发现异常时,单机qps峰值达到了2000多,导致阻塞了很多我们正常的前端请求。我们侦测到之后,在反扒重新启用之前,对服务进行降级,对接口进行限流,虽然反扒服务很快就恢复了,但确实也给我们造成一定的损失。前后我也有参加,在这件事情告一段落后,我重新整理了一下最近了解的服务限流的知识,希...原创 2018-11-06 06:58:08 · 908 阅读 · 0 评论 -
分布式服务限流
上篇简单讲述了一下本地服务令牌桶限流实现,只能用于本地服务,在分布式环境下,就不太适用了。比如我们想对接口做限流控制,如果使用令牌桶实现,每秒最大的服务数目是10,假如分布式服务有10台实例,考虑到负载均衡配置,那么整个分布式系统的服务能力每秒应该大概在100左右,很明显不太适合。如果想要对分布式服务做精确限流,令牌桶这种方式肯定是不合适的。跟之前分布式服务防重复提交的方法类似,可以借助分布式锁来...原创 2018-11-06 06:59:03 · 867 阅读 · 0 评论 -
解读Java并发队列BlockingQueue
上篇文章讲了List的链表实现——LinkedList,同时LinkedList也实现了Dequeue接口,可以通过LinkedList实现栈和队列的操作。刚好昨天看到一篇关于线程池中BlockingQueue相关的不错的文章,这里分享一下,在上篇文章的基础上,也更容易理解。原文链接:解读Java并发队列BlockingQueue。最近得空,想写篇文章好好说说 java 线程池问题,我相信很多...转载 2018-12-30 09:44:43 · 220 阅读 · 0 评论 -
Java编程拾遗『容器——LinkedList』
上篇文章讲了List的数组实现——ArrayList,在最后讲了ArrayList的一些特性,比如支持随机访问,插入和删除效率偏低。本篇文章来看一下List基于链表的实现LinkedList的一些细节,每一种实现都是有它特定的使用场景的,而LinkedList就可以解决ArrayList上述插入删除效率低下的问题。1. 使用规则LinkedList是基于双向链表实现的,声明如下:...原创 2018-12-30 09:43:31 · 229 阅读 · 0 评论 -
Java8 Map coumute操作
在整理Java编程拾遗『容器概述』这篇文章时,看到Map接口中在Java8后加入了compute的一系列方法,computeIfAbsent、computeIfPresent以及compute方法。本篇文章就来讲述一下这三个方法的使用。S.N. 方法 说明 1 default V computeIfAbsent(K key, Function<? super K, ...原创 2018-12-30 09:42:38 · 544 阅读 · 0 评论 -
Java编程拾遗『容器——ArrayList』
上篇文章简单介绍了一下Java集合框架中两个最常见的接口,表示集合的Collection和表示K-V映射的Map。本篇文章重点介绍一下Collection的一个重要实现类,动态数组容器类ArrayList。由于在上一篇文章已经介绍了Collection接口的通用方法,本篇文章会简单介绍一下ArrayList中的方法,重点介绍一下内部原理。1. 使用规则ArrayList是基于数组实现的...原创 2018-12-30 09:41:18 · 326 阅读 · 0 评论 -
Java编程拾遗『容器概述』
在大学时,我们肯定都学过一门叫数据结构的课,里面详细的介绍了链表、栈、队列、散列、树、图等数据结构的概念及其实现。接下来的几篇文章将详细介绍一下Java API对常见数据结构的实现原理及应用,也就是Java API中的集合类(集合框架)。首先看一下Java集合框架的总体概况,如下:总体而言,基本上可以分为两类,表示集合的Collection和表示K-V的Map。可以看到,所有的集合都间接实...原创 2018-12-30 09:40:21 · 172 阅读 · 0 评论 -
Java编程拾遗『反射』
在大多数场景下,我们在代码编写时,我们一般都知道所要使用的数据的具体类型,会根据类型创建对象,并使用对象的一些属性及方法。但是有些情况下,我们在编写代码时,无法确定要创建对象的具体类型,比如我要编写一个工厂类,通过运行时的输入信息,决定构建一个什么类型的对象,这时候在编译期就无法完成了。而反射就提供了一种机制,在运行时,而非编译时,动态获取类型的信息,比如接口信息、成员信息、方法信息、构造方法信息...原创 2018-12-30 09:39:33 · 379 阅读 · 0 评论 -
Java编程拾遗『枚举类』
由于双十一的缘故,忙着各种压测、演练以及值班,最近一直没什么时间写文章。还好,基本上双十一算是很平稳的度过了。作为电商平台,双十一带来的流量冲击,还是给我留下深刻的印象,特别订单、支付链路的环节,流量瞬间可以达到平时峰值的两倍以上。关于双十一这种突发流量冲击的解决方案,我自己还在了解中,本来想写一篇关于双十一的博文的,无奈了解还不够深入,先占个坑,回头补上。继续进行Java编程拾遗这一系列文章的写...原创 2018-12-30 09:38:32 · 251 阅读 · 0 评论 -
Java编程拾遗『泛型——通配符&约束』
1. 泛型通配符固定的泛型类型系统使用起来不是一直那么方便,比如Pair<Integer>并不是Pair<Number>的子类型,所以不能将Pair<Integer>对象赋值给pair<Number>类型的引用。假如在方法定义时制定了某一种泛型类型,那么就只能使用该类型的泛型对象了,使用起来不是很方便。所以Java泛型中引入通配符类型(仍是安全的...原创 2018-12-30 09:37:46 · 504 阅读 · 0 评论 -
Java编程拾遗『泛型——基本概念』
泛型是比较常见的一种类型,在Java API容器类以及一些工具类中,都有很多应用。泛型是Java 5中新增的一种类型机制,用于满足在1999年指定的最早的Java规范之一(JSR 14)。使用泛型机制写的程序代码要比那些杂乱地使用Object变量然后再进行强制类型转换的代码,具有更好的安全性和可读性。泛型对于集合类尤其有用,甚至可以讲,Java泛型的引入也是为了更好的支持Java容器。1. 为...原创 2018-12-30 09:36:43 · 210 阅读 · 0 评论 -
Java编程拾遗『final详解』
之前讲String类的时候,讲了String类是不可变类,其实现方式中有一个重要的保障是final—final修饰class以及final修饰了内部成员变量char[]。本文会详细讲一下final的使用场景以及使用final的好处。1. final的基本用法final是Java中的一个关键字,可以用来声明类、变量、方法和方法参数,分别表示类不可继承、成员变量引用不可改变、方法不可不该以及参...原创 2018-12-30 09:35:33 · 162 阅读 · 0 评论 -
Java编程拾遗『运算符』
与C、C++相似,Java中也存在多种运算符,对数据进行处理,且运算符类型跟C、C++有着极大的相似性。比如,用于赋值的赋值运算符、用于运算的算数运算符和自增自减运算符、用于比较的关系运算符,用于逻辑运算的逻辑运算符、用于位运算的位运算符和移位操作符、复合三元操作符等。本篇文章将简单讲述一下Java中各种运算符的使用规则。1. 赋值运算符赋值运算符常用于变量赋值运算,最基本的格式为”=”,...原创 2018-11-06 07:07:06 · 164 阅读 · 0 评论 -
Bean转换工具DozerBeanMapper
在开发中经常遇到这样一个问题,从DAO层拿回DO实体对象,比如我们从数据库中查出的User实体类包含以下域:@Getter@Setter@ToStringpublic class UserDO { private Integer id; private String name; private Integer age; private String ge...原创 2018-11-06 07:05:45 · 9282 阅读 · 3 评论 -
Java编程拾遗『Java基本数据类型』
Java是一种强类型的语言,这就意味着必须为每一个变量声明一种变量类型。在Java中,一共存在8种基本数据类型,其中4种整型、2种浮点型、1种用于表示Unicode编码的字符单元的自负类型char和一种用于表示真值的bollean类型。1. 数据类型1.1 整型类型 大小 取值范围 byte 1字节 -128 ~ 127 short 2字节 ...原创 2018-11-06 07:04:37 · 138 阅读 · 0 评论 -
Java编程拾遗『Java概述』
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。1. Java语言概述任职于Sun的Jams Gosling等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的编程语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Su...原创 2018-11-06 07:02:41 · 446 阅读 · 0 评论 -
Java编程拾遗『对象和类』
要讲Java中对象和类,Java面向对象的特性是不可避免的,Java中的对象和类其实就来自面向对象的编程思想。在之前的文章Java编程拾遗『Java概述』中,简述了Java面向对象的特性,本篇文章将重新介绍一下Java面向对象的编程思想及Java中对象和类的一些概念和使用。1. 面向对象思想1.1 面向对象 VS 面向过程面向对象是一种编程思想,是当今软件开发方法中的主流方法之一,它把...原创 2018-11-07 07:29:54 · 173 阅读 · 0 评论 -
Java编程拾遗『数组』
数组是同一种类型数据的集合,其实就是一个容器,Java中提供的数组是用来存储固定大小的同类型元素,其中元素可以是基本类型也可以是对象类型。1. 数组创建Java中数组存在两种声明方式,以int数组为例:int[] a;int a[];Java中建议使用第一种风格,可以将数组看成一种类型。相应的在Java中数组的创建可以使用以下两种方式://方式1, dataType[] ...原创 2018-11-07 07:28:59 · 104 阅读 · 0 评论 -
Java编程拾遗『控制流程』
与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流流程。1. 条件语句条件语句就是使用if进行条件判断,及逻辑处理,主要包含以下几种形式。1.1 if单if条件语句格式如下:if (condition) { statement;}如果布尔表达式condition为真,则执行statement语句。1.2 if……elseif……else条件语句格...原创 2018-11-07 07:27:31 · 175 阅读 · 0 评论 -
Java 8 Stream partitioningBy对List分区
partitioningBy分区是一种特殊的分组,可以将List划分为两个子List,使用起来比较简单,如下:@Testpublic void partitionByTest(){ List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8); Map<Boolean, List&l...原创 2018-11-03 14:38:07 · 3238 阅读 · 0 评论 -
Java8 Stream groupingBy对List进行分组
提到Group By,首先想到的往往是sql中的group by操作,对搜索结果进行分组。其实Java8 Streams API中的Collector也支持流中的数据进行分组和分区操作,本片文章讲简单介绍一下,如何使用groupingBy 和 partitioningBy来对流中的元素进行分组和分区。 groupingBy 首先看一下Java8之前如果想对一个List做分组操作,我们需要...原创 2018-11-03 14:37:04 · 89795 阅读 · 4 评论 -
Java8 Stream reduce操作
Reduce,顾名思义为减少的意思,就是根据指定的计算模型将Stream中的值计算得到一个最终结果。在之前的一篇文章Java8函数式编程中简单介绍,Stream的count、min 和max方法底层都是依赖reduce实现的,本篇文章将简单介绍一下Java8 Stream reduce的几种基本用法。首先来看一下Reduce三种形式:S.N. 方法说明 1 Optional...原创 2018-11-03 14:35:20 · 8060 阅读 · 2 评论 -
Spring Boot中log4j的配置
上篇文章Spring Boot日志管理,我简单讲述了Spring Boot中使用默认日志Logback进行日志管理的配置。在上篇文章中有讲到,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。但是log4j作为一款常用的日志库,在实际开发中还是很常用的,本片文章,我将简单介绍一下Spring Boot中如何使用Log4J进行日志管理。创建Spring B...原创 2018-11-03 14:34:30 · 2490 阅读 · 0 评论