![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java开发语言
文章平均质量分 93
经海码农
不积跬步无以至千里
展开
-
JAVA使用脚本引擎执行JS代码
public class JsMainDemo { /** * @param jsStr js脚本内容 * @param function 要调用的js方法名 * @param args 调用js方法时传入的参数 * @return */ public static Object jsObjFunc(String ...原创 2019-11-26 18:16:15 · 308 阅读 · 0 评论 -
Java8的新特性
一、Lambda表达式二、函数式接口三、接口的默认方法和静态方法四、方法引用五、Stream流六、Date Time API一、Lambda表达式Lambda参数 -> Lambda主体Lambda表达式是一个由参数列表、箭头、函数主体、返回值类型组成的一个匿名函数,Lambda表达式可以让我们更为简洁地表示可传递的匿名函数,Lambda表达式允许我们...原创 2019-11-20 09:19:24 · 162 阅读 · 0 评论 -
分布式文件存储数据库MongoDB技术学习总结
一、MongoDB速探含义:MongoDB是由C++语言编写的、基于分布式文件存储的非关系型数据库。在大数据量下承载性能好。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。优点:MongoDB为什么在大数据量下有较高的查询性能?相对于关系型数据库而言,不...原创 2019-10-30 21:33:17 · 666 阅读 · 0 评论 -
Java并发编程系列学习_Timer定时器&ScheduledThreadPoolExecutor任务调度器
Timer定时器 在并发编程中,有需要去定时执行某任务、延迟执行某任务或者周期性地执行某任务。最基本的手段是使用JDK中的Timer类,负责计划任务的功能,也就是在指定的时间开始执行某一个任务。但是Timer现在也不建议使用,我们在本文中主要去学习下它如何使用,实际在项目开发中,还是建议使用ScheduledThreadPoolExecutor任务调度器,在编码测试时,也发现了...原创 2019-03-28 10:23:39 · 319 阅读 · 0 评论 -
Java并发编程系列学习_CountDownLatch倒计时器&CyclicBarrier循环栅栏
一、倒计时器CountDownLatch在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行。当然,使用线程间消息通信机制也可以完成。其实,java并发工具类中为我们提供了类似“倒计时”这样的工具类,可以十分方便的完成所说的...原创 2019-04-01 11:32:28 · 181 阅读 · 0 评论 -
Java并发编程系列学习_并发容器ConcurrentHashMap
一、再续前缘 HashMap是平时常用的一种Map集合容器,但是该容器是非线程安全的,涉及到多线程的get操作会引发死循环,导致CPU的使用率达到100%,是非常危险的操作。它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线...原创 2019-03-27 14:23:23 · 237 阅读 · 0 评论 -
Java并发编程系列学习_Executor与线程池ThreadPoolExecutor
Executor接口介绍java.util.concurrent.Executor 与线程池有关的大部分类都是实现了该接口,在该接口中只定义了一个方法:该接口下面有两个子接口,分别为ExecutorService以及ScheduledExecutorService.接口不能被直接实例化,只是定义了规范,具体的实例化需要由下面的实现类来实现。比较常用Executors来创建线程池对象...原创 2019-03-26 22:14:45 · 218 阅读 · 0 评论 -
Java并发编程系列学习_Lock锁
Lock锁和synchronized关键字锁的对比在Java并发编程中,锁可以防止多个线程同时访问共享资源,也可以使用synchronized关键字实现锁的控制。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性。Lock和Synchronized的具体的区别如下表格所示: 类别 synchronized锁 Lock锁 ...原创 2019-03-26 17:35:43 · 762 阅读 · 0 评论 -
Java并发编程系列学习_Semaphore并发控制器&Exchanger数据交换器
Semaphore并发资源控制器的使用场景Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待。当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行。S...原创 2019-03-29 17:00:46 · 185 阅读 · 0 评论 -
基于拦截器Interceptor+Redis实现接口限流
最近开发的抢购活动上线后发现了两个比较明显的问题:其一:活动一开始,接口访问量剧增;其二:黑名单中增加了一大批黑名单用户(或者说IP),这其中就包含了一些恶意用户或机器人刷接口。针对一些高并发的接口,限流是处理高并发的几大利剑之一。一方面,限流可以防止接口被刷,造成不必要的服务层压力,另一方面,是为了防止接口被滥用。限流的方式也蛮多,本篇只讲几种我自己常用的,并且是后端的限流操作...原创 2019-03-21 11:20:36 · 2086 阅读 · 4 评论 -
Java并发编程系列学习_Future和Callable接口的使用
线程Thread对象不具有返回值的功能,如果需要取得返回值是极其不方便的。在Java1.5的并发包中使用Future与Callable使得线程支持获取执行的返回的结果。接下来我们就通过几个例子来说明这点:接口Callable与Runnable接口的区别:1)Callable接口的call方法可以有返回值,但是Runnable的接口Run方法没有返回值。在call方法执行完毕,是通过Futu...原创 2019-04-07 15:13:40 · 213 阅读 · 0 评论 -
Java并发编程系列学习_invokeAny()方法与invokeAll()方法
一、invokeAny()方法作用:取得第一个完成任务的结果值,当第一个任务执行完成后,会调用interrupt方法将其他的任务中断。在这里会出现两种情况:无 Thread.currentThread().isInterrupted() 的判断,则已经获得第一个运行的结果的值后,其他线程继续运行; 有 Thread.currentThread().isInterrupted() 的判...原创 2019-04-07 22:01:02 · 1691 阅读 · 0 评论 -
Java并发编程系列学习_并发容器CopyOnWriteArrayList
一、ArrayList线程不安全的原因ArrayList很常用,但是该集合并不是一个线程安全的集合,首先我们来看下这个集合的内部构造成员:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java....原创 2019-04-08 14:10:30 · 185 阅读 · 0 评论 -
Java并发编程系列学习_Synchronized关键字
一、问题描述先看一段代码:/** * @Author: jiaqing.xu@hand-china.com * @Date: 2019-03-28 19:27 * @Description */public class SynchronizedDemo implements Runnable { private final static int count = 0;...原创 2019-03-29 11:38:53 · 148 阅读 · 0 评论 -
Java并发编程系列学习_并发容器ThreadLocal
ThreadLocal简介 在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程进行阻塞等待,很显然这种方式的时间效率并不是很好。线程安全问题的核心在于多个线程会对同一个临界区共享资源进行操作,那么,如果每个线程都使用自己的“共享资源”,各自使用各自的,又互相不影...原创 2019-04-08 21:14:41 · 170 阅读 · 0 评论 -
Java并发编程系列学习_原子操作类Atomic
一、原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案。实际上,在J.U.C下的atomic包提供了一系列的操作简...原创 2019-04-09 13:56:31 · 207 阅读 · 1 评论 -
Java并发编程系列学习_volatile关键字
一、volatile的简介通过Java内存模型,我们可以知道各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后何时会写到主内存中。这个时机对普通变量是没有规定的,而针对volatile修饰的变量给Java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的“可见性”...原创 2019-04-09 15:49:07 · 160 阅读 · 0 评论 -
Java并发编程总结图谱(超详细)
原创 2019-05-10 16:07:36 · 607 阅读 · 0 评论 -
To prevent a memory leak, the JDBC Driver has been forcibly unregistered.异常处理
异常信息:5-Feb-2019 11:03:11.635 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors15-Feb-2019 11:03:11.743 警...原创 2019-05-16 15:01:51 · 15374 阅读 · 0 评论 -
Kafka消息队列的搭建和基本使用
安装Jdksudo tar -vxzf jdk-8u152-linux-x64.tar.gzsudo mv jdk1.8.0_152 /opt/java配置Java环境变量:vim /etc/profile#在profile文件的最后面添加export JAVA_HOME=/opt/jdk1.8.0_152export PATH=$JAVA_HOME/bin:$PATH#...原创 2018-09-30 10:28:35 · 1308 阅读 · 0 评论 -
Quartz定时任务调度框架基本使用
1、项目添加Maven依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoc...原创 2018-08-21 17:08:19 · 962 阅读 · 2 评论 -
浅析Java垃圾回收机制
什么是java程序中的垃圾?什么这些垃圾又是怎样被回收的?为什么会被回收?不进行回收又会怎样?这些问题都是我们要在这篇博客中要解决的问题!大家都知道,在c语言中,作为程序员,必须得考虑到去怎样回收已经分配的内存,经常要面临的问题是,什么时候进行垃圾的回收,什么时候进行释放?释放过早了,那些仍然需要用到的对象资源消失了,面临的是系统的奔溃;但是一旦忘记回收无用的内存,就会导致内存的泄露...原创 2016-04-24 19:00:00 · 84 阅读 · 0 评论 -
freemarker模版引擎技术总结
FreeMarker语言概述FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)FreeMarker不是一个...原创 2017-09-06 14:13:00 · 1157 阅读 · 0 评论 -
基于Java实现的通用文件上传和下载
序言现在,绝大部分的应用程序在很多的情况下都需要使用到文件上传与下载的功能,在本文中结合hap利用spirng mvc实现文件的上传和下载,包括上传下载图片、上传下载文档。前端所使用的技术不限,本文重点在于后端代码的实现。希望可以跟随我的一步步实践,最终轻松掌握在hap中的文件上传和下载的具体实现。案例1. 数据库设计表结构SET FOREIGN_KEY_CHECKS=0;...原创 2017-09-26 19:25:00 · 1249 阅读 · 0 评论 -
Java实现图片验证码
一、验证码生成类 11 /** 12 * 验证码生成器 13 * 14 */ 15 public class SCaptcha { 16 // 图片的宽度。 17 private int width = 120; 18 // 图片的高度。 19 private int height = 40; 20 // 验证码字符个数 ...原创 2017-09-26 19:47:00 · 258 阅读 · 1 评论 -
POI实现Excel导入导出
利用idea创建java web的maven项目,在pom中添加对poi的jar的依赖。 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apac...原创 2017-10-19 17:18:00 · 173 阅读 · 3 评论 -
Java8新特性——lambda函数式编程
一、遍历循环 1 /** 2 * @author jiaqing.xu@hand-china.com 3 * @version 1.0 4 * @name 5 * @description 循环遍历 6 * @date 2018/7/13 7 */ 8 public class test1 { 9 public static void main(Strin...原创 2018-07-13 20:20:00 · 215 阅读 · 0 评论 -
Java8新特性——接口默认方法
Java 8 新增了接口的默认方法。简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。我们只需在方法名前面加个default关键字即可实现默认方法。为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是...原创 2018-07-15 12:16:00 · 185 阅读 · 0 评论 -
Java8新特性——stream流
一、基本API初探package java8.stream;import java.util.Arrays;import java.util.IntSummaryStatistics;import java.util.List;import java.util.Random;import java.util.stream.Collectors;import java.ut...原创 2018-07-15 14:50:00 · 354 阅读 · 0 评论 -
Java静态代理&动态代理&Cglib代理详解
一、静态代理根据被代理的类的时机的不同,如果在编译阶段就能确定下来的被代理的类是哪一个,那么,就可以使用静态代理的方式。申明一个接口: 1 /** 2 * @author jiaqing.xu@hand-china.com 3 * @version 1.0 4 * @name 5 * @description 6 * @date 2018/7/23 7 */...原创 2018-07-23 17:23:00 · 1022 阅读 · 1 评论 -
深入集合类系列——你必须要知道的两棵继承树
原创 2016-12-10 16:54:00 · 175 阅读 · 0 评论 -
深入集合类系列——HashMap和HashTable的区别
含义:HashMap是基于哈希表的Map接口的非同步实现。允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。数据结构:HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 HashMap存数据的基本流程: 1、当调用put(key,value)时,首先获取key的hashcode,int hash = key.hash...原创 2016-12-10 16:49:00 · 127 阅读 · 0 评论 -
Java多线程核心技术——并发程序
1.进程的三大特征:独立性:拥有自己的独立的地址空间,一个进程不可以直接去访问其他进程的地址空间。动态性:是一个系统中活动的指令的集合。并发性:单个进程可以在多个处理器上并发进行,互不影响。2.并发性和并行性的区别:并行是同一个时刻,有多条指令在多个处理器上同时的进行;并发是,快速轮换执行,其实上在宏观上,多个进程同时进行。3.线程的特点:一个线程必须有属于自己的一个父...原创 2016-05-01 13:47:00 · 128 阅读 · 0 评论 -
Java虚拟机体系分析(JVM)
一、JVM的生命周期:1)程序开始执行,他就运行,程序停止,它就结束。有几个程序在执行,就有几个虚拟机在工作。只要Java虚拟机中还有普通的线程在执行,Java虚拟机就不会停止。2)Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、接受一个字符串数组。在程序执行时,你必须给Java虚拟机指明这个包含main()方法的类名。 Main()方法是程序的起点,他...原创 2016-07-30 10:03:00 · 119 阅读 · 0 评论 -
面试经典——Java字符串,数组,集合框架
1.字符串的字面量是否自动生成一个字符串的变量?String str1 = “abc”;Sring str2 = new String (“abc”);对于str1:Jvm在遇到双引号时会创建一个String对象,该String对象代表的值是abc,实际上,在创建该对象之前会在String对象池中搜索该字符串对象是否已经被创建,如果已经被创建,就直接返回一个字符串的引用,...原创 2016-08-02 17:05:00 · 170 阅读 · 0 评论 -
java中的IO流和多线程
1.如何用file操作目录和文件?java对待目录和文件统一使用file来表示,在创建file对象时,使用isDictionary和isFile方法进行判断 1 package test; 2 3 import java.io.File; 4 5 import java.io.IOException; 6 7 public class FileTest { 8 ...原创 2016-08-03 16:18:00 · 180 阅读 · 0 评论 -
邻接表构建图
一个是顶点表,包括顶点和指向下一个邻接点的指针一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针刚开始的时候把顶点表初始化,指针指向null。然后边表插入进来,是插入到前一个,也就是直接插入到firstedge指向的下一个,而后面的后移 1 #include <stdio.h> 2 #include <stdlib.h> ...原创 2016-10-28 17:32:00 · 227 阅读 · 0 评论 -
图的邻接矩阵存储
邻接矩阵(无向图)考虑到图是由顶点和边或弧两部分组成,合在一起比较困难,那就很自然地考虑到分为两个结构来分别存储。顶点因为不区分大小、主次,所以用一个一维数组来存储是狠不错的选择。而边或弧由于是顶点与顶点之间的关系,一维数组肯定就搞不定了,那我们不妨考虑用一个二维数组来存储。于是我们的邻接矩阵方案就诞生了!图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表...原创 2016-10-28 17:39:00 · 249 阅读 · 0 评论 -
Java中类加载和反射技术实例
我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型。在程序运行时,往往是需要发现类和对象的真实的信息的。那么如何获的这种信息呢?其一,如果我们在编译和运行时都知道类型的具体信息,这时是可以手动将一个对象转换为运行时的类型。其二,如果我们在编译时无法预知对象和类到底是属于哪些类,那么程序只有依靠运行时的信息来发现对象和类的真实的信息了,这时就必须要用到反射技术...原创 2016-11-02 21:08:00 · 142 阅读 · 0 评论 -
深入集合类系列——ArrayList和Vector的区别
区别:1)Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 2)当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内...原创 2016-12-10 16:46:00 · 144 阅读 · 0 评论