
Java基础
文章平均质量分 92
打磨时光
我是打磨匠,关注软件开发,打磨产品,服务人类。
展开
-
Java8 常用的lambda表达式
Java8 常用的几个lambda函数接口SupplierPredicateConsumerFunction//使用Lambda表达式提供Supplier接口实现,返回OK字符串Supplier<String> stringSupplier = ()->"OK";//使用方法引用提供Supplier接口实现,返回空字符串Supplier<String> supplier = String::new;//Predicate接口是输入一个参数,返回布尔值。我原创 2020-08-01 22:47:06 · 2341 阅读 · 0 评论 -
lombok @Accessors 如何使用
@Accessors 注解用来使用lombok时如何产生和显示getters和setters的方法。@Accessors有三个属性,分别是fluent、chain、prefix,@Accessors注解既可以注解在类上也可以注解在属性上1.fluentfluent为一个布尔值,如果为true生成的get/set方法则没有set/get前缀,默认为false例如:@Data@Accessors(fluent = true)public class Student { private lo原创 2020-07-18 22:18:37 · 179 阅读 · 0 评论 -
常见的Bean映射工具
在工作中,经常会需要将对象转换成不同的形式来适应不同的api,例如对接第三方的接口,将数据落盘到自己的数据库中;在比如不通分层之间的对象转换,从业务层到表现层,有些字段是不需要展示的等。进行这种转换,除了编写大量的 get/set 代码,像spring、apache也提供了很多的工具类可以实现。BeanUtils在 spring 和 apache 的 commons 工具包中都提供了 BeanUtils 供我们使用,其原理都是先用 jdk 的 java.beans.Introspector类的ge原创 2020-07-12 16:05:31 · 1472 阅读 · 0 评论 -
java 计时器StopWatch
以前统计方法的运行时间经常会用long startTime = System.currentTimeMillis();// 业务实现...long endTime = System.currentTimeMillis();System.out.println(endTime-startTime)在 commons 包和 spring 中都提供了定时器,可以方便的统计方法的运行时间<dependency> <groupId>org.apache.commons&原创 2020-06-09 22:15:27 · 428 阅读 · 0 评论 -
java 命令行解析类使用 CommandLineParser
自己维护的应用,如果想要通过命令行来传递参数,可以使用 CommandLineParsermaven依赖<dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.4</version></dependency><dependency>原创 2020-05-20 22:32:46 · 3141 阅读 · 0 评论 -
Java 使用 httpClient 发送get、post请求
maven 依赖<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>ht...原创 2020-02-29 20:29:04 · 679 阅读 · 0 评论 -
java将汉字转化为拼音
在日常的开发中,可能需要将汉字转化为拼音,例如想要某些城市的开头拼音大写字母作为城市的简称,全国有几百个城市,如果需要一个一个自己拼那太麻烦了,在 Java 中,有人开发这样一个工具。下面看一下如何使用其获取汉字拼音:pom.xml<dependency> <groupId>com.belerweb</groupId> <artifactId&g...原创 2019-10-11 22:28:59 · 778 阅读 · 0 评论 -
Executor 饱和策略
前言在使用线程池的时候,如果提交的任务超过了线程的大小,就会将任务放到一个队列中,这个队列可以使无界队列 LinkedBlockingQueue,也可是是有界队列 ArrayBlockingQueue。当有界队列满了的时候,饱和策略就开始发挥作用。ThreadPoolExecutor 的饱和策略可以通过调用 setRejectedExecutionHandler 来修改。JDK 提供了几种...原创 2019-08-11 12:21:52 · 244 阅读 · 0 评论 -
基于数组的有界缓存实现
public class BaseBoundBuffer { public String[] buf; private int tail; private int count; private int head; public BaseBoundBuffer(int cap) { this.buf = new String[cap]; ...原创 2019-08-15 23:39:26 · 312 阅读 · 0 评论 -
java.util.concurrent 同步类器中的AQS
在 java.util.concurrent 中包含许多的阻塞类:ReentrantLockSemaphoreReentrantReadWriteLockCountDownLatchSynchronousQueueFutureTask它们都是基于 AQS 构建的。java8 api 文档: https://docs.oracle.com/javase/8/docs/api/中...原创 2019-08-17 11:40:35 · 175 阅读 · 0 评论 -
fastjson '\x' 导致内存溢出
测试代码:import java.net.URLDecoder;import org.junit.Test;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONException;import junit.framework.TestCase;public class TT extends TestC...原创 2019-09-07 23:45:25 · 1940 阅读 · 0 评论 -
java8 时间类的基本使用
import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.format.DateTimeFormatter;/** * description: java8 时间工具类 * * @date 2019年9月23日 */public c...原创 2019-09-23 22:16:23 · 103 阅读 · 0 评论 -
java 使用 base64 编码
Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便。在实际应用上,Base64除了能将Binary资料可视化之外,也常用来表示字串加密过后的内容,生成 base64 的图片等。早期在Java上做Base64的编码与解码,会使用到JDK里sun.misc套件下的BASE64Encoder和BASE64Decod...原创 2019-09-27 21:45:09 · 623 阅读 · 0 评论 -
Exeception 和 Error 的区别
对比 Exception 和 Error,运行时异常和一般异常有什么区别?Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的示例才能被抛出(throw)或者捕获(catch),他是异常处理的基本组成类型。Exception 和 Error 体现了 Java 对不同异常的分类。Exception 是程序正常运行中,可以预...原创 2019-10-10 23:47:54 · 822 阅读 · 0 评论 -
ExecutorService 四种使用方式
Java 通过 Executors 提供四种线程池, 例如:newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。...原创 2019-08-10 12:11:23 · 1606 阅读 · 0 评论 -
java 集合set的用法
前言在一些去重的场景中,经常会用到 Set 集合SetHashSetHashSet 使用 hash算法来存储集合的元素,具有很好的存储和查找的性能。特点:不能保证元素的顺序HashSet 非线程安全可以包含null当向 HashSet 中存储一个元素时,会调用该元素的 hashCode() 方法获得其 hashCode 值,根据 hashCode 值确定其在HashSet ...原创 2019-08-04 19:24:16 · 427 阅读 · 0 评论 -
Java 集合总结以及 java.util.ConcurrentModificationException 异常分析
前言在开发中,经常使用的集合就是 ArrayList 和 HashMap,在一些需要排序的场景中,可能需要使用 TreeSet 和 TreeMap 等,其余的集合类有的由于长时间不适用,已经忘记了其特性和应用场景,所以在这里重新总结一下,方便以后复习。Java 集合体系...原创 2019-08-04 17:32:35 · 268 阅读 · 0 评论 -
volalite 可见性和原子性
在自己写的一个爬虫项目中,爬虫会根据采集的链接不断继续爬行下去,这个时候设置了一个开关 stop,当 stop = true 时,爬虫就会停止爬取。我写了一个接口来控制这个 stop 字段,发现不会立即停止。于是想到了 关于 volatile 的特性,那么实现可见性和原子性有的方式目前总结了三种:public class VolatileTest { /** * done...原创 2019-06-12 21:30:50 · 579 阅读 · 0 评论 -
java enum(枚举类)的使用
枚举类,一般都用在定义常量。定义public enum Constant { MON("星期一"), TUE("星期二"), WED("星期三"), THU("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期日"); private String desc; private Constant(String desc) { ...原创 2019-06-12 23:24:18 · 532 阅读 · 0 评论 -
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
记录一下在使用 commons 包时出现的异常。这个异常是在自己的代码中借助 commons-lang 包中 StringUtils 工具类时出现的public class Test { public static void main(String args []) { System.out.println(StringUtils.isNotBlank("test")); }}类...原创 2019-06-14 22:38:02 · 7900 阅读 · 0 评论 -
Java 注解 (Annotation)(一)
Annotation注解在Java中的应用十分广泛,例如 Spring 中就大量使用了注解,由于最近看了SpringBoot自动配合的一点代码,所以想在重新温习一下关于注解的知识。基本 Annotation四个基本的Annotation:@Override 指定方法的重写的@Deprecated 标记已过时@SupepressWarnings 抑制编译器的警告@SafeVararg...原创 2019-06-04 23:17:44 · 84 阅读 · 0 评论 -
Java 注解(Annotation)(二)
自定义注解关键字 @interfacepublic @interface Test {}// Annotation 中的成员变量以方法的形式来定义public @interface MyAnnotation { String name(); int age() default 18; // 使用default 定义初始值}提取Annotation信息使用Annotation注...原创 2019-06-05 07:24:29 · 109 阅读 · 0 评论 -
记一次 java.io.IOException: Attempted read from closed stream
在一次项目问题排查过程中,发现总是 报错 java.io.IOException: Attempted read from closed stream,根据异常的堆栈分析,定位到了问题的根源。问题示例如下:public class Main { public static void main(String[] args) throws ClientProtocolException,...原创 2019-06-23 10:57:26 · 5365 阅读 · 0 评论 -
java 打印完整的堆栈信息
前言在实际的项目中,免不了遇到各种各样的异常,通常我们会有日志系统对错误信息以及堆栈信息进行收集,例如 graylog、flume+kafka+storm 、elk 等。但是在遇到异常时,我们也需要将异常情况以邮件或者微信或者短信等方式通知我们,由于微信和短信对文本的长度有限制,所以我们会将具体的堆栈信息打印出来通过邮件通知我们。使用 io 流将堆栈信息打印出来 public stat...原创 2019-06-26 21:29:20 · 19648 阅读 · 0 评论 -
java 线程 notify、notifyAll
前言在 《Java安全编码标准》中,关于 Java 线程安全,有一小节提到在静态条件下,使用通知 notify ,要使用 notifyAll 通知所有的等待线程而不是通知某一线线程。英文文档:https://wiki.sei.cmu.edu/confluence/display/java/2+Rules代码示例:public class NotifyTest implements Runn...原创 2019-06-26 23:18:16 · 407 阅读 · 0 评论 -
java 读写 csv 文件
前言有一些项目中需要支持导出csv文件,尤其是一些数据统计、运营分析等工作。Java 中提供了大量的工具包来操作 execel 、csv 等文件,本文采用 opencsv 来对 csv 文件进行读写;execel 可以使用poi来进行读写。pom 依赖<dependency> <groupId>com.opencsv</groupId> <ar...原创 2019-06-24 21:40:12 · 223 阅读 · 0 评论 -
fastjson 对于 Date 类型的处理
前言在使用 fastjson 存储 json 对象时,发现其将 date 类型的 value 默认转换成了 long 类型的时间戳。那么怎么解决这个问题?代码如下 private static SerializeConfig mapping = new SerializeConfig();private static String dateFormat;static { dat...原创 2019-07-30 22:46:13 · 2039 阅读 · 0 评论 -
synchronize 重入锁
前言重入锁重入的一种实现方式:为每一个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁被认为是没有被任何线程持有。当一个线程持有一个未持有的锁的时候,JVM 将记下锁的持有者,并且将获取计数值将其置1。如果这个线程再次获取这个锁,计数值+1,当线程退出同步代码块时,计数值-1。当计数值为0时,释放锁。示例如下:public class A { public synchron...原创 2019-08-03 17:19:51 · 194 阅读 · 0 评论 -
非原子的 64位操作引发的并发问题
前言我们知道在多线程中,对共享变量进行修改,有可能不能读到立即修改的值,但是其最多是一个失效值,而不是随机值示例代码:public class AA { private int value; public int getValue() { return value; } public void setValue(int value) {...原创 2019-08-03 17:54:26 · 362 阅读 · 0 评论 -
深入理解 ThreadLocal
前言ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。ThreadLocal 内部结构Thread 源码: /* ThreadLocal values pertaining to this thread. This ma...原创 2019-08-03 22:10:26 · 135 阅读 · 0 评论 -
Java 注解(Annotation)(三)
使用Annotation的示例自定义注解是,通常都会使用反射。Example:定义一个标识接口,运行时期 RUNTIME@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Testable {}public class MyTest { @Testable ...原创 2019-06-05 23:39:01 · 87 阅读 · 0 评论