自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Java之Lists.Partition项目中遇到的坑

项目中使用Lists.Partition批量处理数据,但是最近内存一直OutOffMemory,GC无法回收。后来我们对使用过的集合手动clear,没有测试直接就上线了。尴尬的是内存回收了,但是跑出来的数据出问题了。最后自己单元测试发现是List<List<TreasureIntegr...

2020-04-08 11:53:45 238 0

原创 eclipse中安装lombok.jar

lombok官网:https://projectlombok.org/ jar包下载路径:https://projectlombok.org/download lombok features:https://projectlombok.org/features/all 方式一: 1、下载lom...

2019-08-13 11:16:10 1675 0

原创 java内存溢出与解决方法

1、内存泄漏memoryleak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 2、内存溢出outofmemory:指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储l...

2019-07-23 11:18:54 120 0

原创 分布式锁的三种实现方式

一、为什么要使用分布式锁 为了保证一个方法或属性在高并发情况下同一时间只能被同一个线程执行,在传统单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。但是,随着业务发展的需要,原单机部署的系统被演化成分布式集群系统后,由于...

2019-07-15 23:13:42 130 1

转载 CAS机制讲解

我们先看一段代码: 启动两个线程,每个线程中让静态变量count循环累加100次。 因为这段代码是非线程安全的,所以最终的自增结果很可能会小于200。我们再加上synchronized同步锁,再来看一下。 加了同步锁之后,count自增变成了原子性操作,所以最终输出一定是count=...

2019-07-15 21:53:34 145 0

转载 了解Redis缓存穿透、雪崩和击穿

缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 解决...

2019-07-11 21:38:46 59 0

原创 volatile讲解

一、Java 内存模型中的可见性、原子性和有序性 可见性: 指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。也就是一个线程修改的结果,另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓...

2019-07-06 17:42:29 65 0

原创 SimpleDateFormat线程不安全

想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在...

2019-07-06 14:04:11 118 0

原创 ThreadLocal讲解

最近面试会被经常问到ThreadLocal的作用和原理,所以这里有必要学习一下。 什么是ThreadLocal ThreadLoal 被称为线程局部变量,即该变量运行在线程中时,每个线程都独立拥有它而不和其他线程中的这个值相冲突,其目的就使这个变量只属于当前线程,和其他线程无关。ThreadL...

2019-07-05 22:19:37 100 0

原创 静态代码块,构造代码块和构造函数的执行顺序

静态代码块:最早执行,类被载入内存时执行,只执行一次。没有名字、参数和返回值,有关键字static。构造代码块:执行时间比静态代码块晚,比构造函数早,和构造函数一样,只在对象初始化的时候运行。没有名字、参数和返回值。构造函数:执行时间比构造代码块时间晚,也是在对象初始化的时候运行。没有返回值,构造...

2019-07-03 21:30:16 974 0

原创 String是值传递还是引用传递

今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后他在方法外使用这个值,发现这个String还是之前的值,并没有改变。 这里要向大家介绍一下,大家都知道java在传参时分为值 值传递和引用传递。参数为基本类型时是值传递, 参数为封...

2019-07-02 20:49:24 37 0

转载 Redis与数据库一致性问题分析

缓存已经在项目中被广泛使用,在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。所以参考了网上一些资料对这块进行讲解。 先做一个说明,从理论上来说,给缓...

2019-07-01 20:35:58 3515 1

原创 单链表反转(逆序)

面试被问到单链表反转,一脸懵逼,回来赶紧补 1、单链表的结点结构: data域:存储数据元素信息的域称为数据域; next域:存储直接后继位置的域称为指针域(链域),存储直接的下一个节点地址。 data域 + next域:组成数据的存储映射,称为结点; 注意: 链表通过每个结点的链域...

2019-06-29 20:52:45 630 0

转载 ThreadPoolExecutor讲解(JDK1.6)

使用多线程可以提高程序的执行效率,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用...

2019-06-29 17:06:30 171 0

原创 synchronized与Lock的区别

之前面试的时候经常会被问到一个问题,就是synchronized与Lock有什么区别,当时回答的很模糊,回来之后对这个知识点深入了解了一下,现在给自己总结。 类别 synchronized Lock 存在层次 Java的关键字,在jvm层面上 是一个类 锁的释放 ...

2019-06-29 12:06:34 48 0

原创 String、StringBuilder、StringBuffer对比

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 类名 String StringBuffer StringBuilder 线程安全 安全(final修饰) 安全 不安全 字符串类型 常量 变量 变量 执行效率 ...

2019-06-27 20:59:51 47 0

原创 String字符串反转

这道题在面试的时候被问过,在此给大家分享一下。 方法一、通过StringBuiler的reverse()的方法,最快的方式。 public static String reverseStringBuilder(String s) { StringBuilder sb = new St...

2019-06-25 22:41:15 3333 0

原创 Java多线程面试题

https://www.cnblogs.com/kexianting/p/8566318.html

2019-06-16 09:45:33 70 0

转载 Redis主从同步(复制)

一、概述 在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险。 面临问题 机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的。而数据是最重要的,如果你不在乎,基本上也就不会使...

2019-06-03 18:14:08 64 0

转载 Redis事务讲解

一、引言 为了确保连续多个操作的原子性,一个成熟的数据库通常都会有事务支持,Redis 也不例外。Redis 的事务使用非常简单,不同于关系数据库,我们无须理解那么多复杂的事务模型,就可以直接使用。不过也正是因为这种简单性,它的事务模型很不严格,这要求我们不能像使用关系数据库的事务一样来使用 R...

2019-06-01 23:55:30 41 0

原创 Redis Pipeline讲解

一、pipeline出现的背景 Redis是一种基于客户端-服务端(CS)模型以及请求/响应协议的TCP服务,这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。 服务端处理命令,并将结果返回给客户端。 这样一...

2019-05-29 19:24:36 574 0

转载 Redis持久化

Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能、持久存储、适应高并发应用场景等优势。它虽然起步较晚,但发展却十分迅速。 由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保...

2019-05-23 23:41:18 48 0

转载 Redis I/O 多路复用

引出IO多路复用 为什么 Redis 中要使用 I/O 多路复用这种技术呢? 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其...

2019-05-19 19:18:01 3499 0

转载 高性能IO模型浅析

最近在学习Redis,了解到Redis是单线程的,但是运用了I/O 多路复用技术,可以并发响应多个客户端请求。下面来了解一下常见的IO模型。 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(BlockingIO):即传统的IO模型。 (2)同步非阻塞IO...

2019-05-16 23:39:47 77 0

转载 Redis线程安全问题

Redis是线程安全的吗? Redis是个单线程程序,所以它是线程安全的。 Redis单线程为什么还能这么快? Redis是基于内存的,内存的读写速度非常快; Redis是单线程的,避免了不必要的上下文切换和竞争条件; Redis使用多路复用技术,可以处理并发的连接。非阻塞I/O内部...

2019-05-16 17:29:26 4727 2

转载 Oracle insert all 讲解

1、概念 Oracle 中insert all 是指把 同一批 数据插入到 不同的表 中。 假如,现在有个需求,把表 t 的中数据分别插入到 t1、t2,如果你不知道 insert all, 你可能会使用 insert 插入 2 次,例如: INSERT INTO t1(object_id...

2019-05-08 22:36:09 72 0

转载 HashMap为什么是线程不安全的

HashMap的容量是有限的,当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高。这时候,HashMap需要扩展它的长度,也就是进行resize。 影响发生resize的因素有两个: 1.capacity:HashMap数组长度,默认初始为16。Ha...

2019-04-11 00:15:20 140 1

转载 数据结构之栈与队列

1.栈与队列 栈与队列是程序设计中广泛使用的两种重要的线性数据结构。 栈是LIFO(Last In First Out),先存进去的数据只能最后被取出来,进出顺序逆序,即先进后出,后进先出。 队列是FIFO(First In First Out),它保持进出顺序一致,即先进先出,后进后出。 ...

2019-04-09 23:13:58 48 0

转载 LinkedList实现栈和队列操作

LinkedList 不仅实现了List接口还实现了Dueue接口(双端队列,既具有队列的特征,也具有栈的特征),Dueue接口是Queue的子接口。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Dequ...

2019-04-09 21:47:24 339 0

原创 队列Queue

队列是一种数据结构,它只允许在队列尾部(rear)加人一个元素,和从队列头部(front)移除一个元素。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为...

2019-04-04 17:52:54 94 0

原创 List与Array转换

List to Array List 提供了toArray的接口,所以可以直接调用转为object型数组: List<String> list = new ArrayList<String>(); Object[] array=list.toArray(); 上述方...

2019-04-04 11:39:30 75 0

转载 ArrayList内部原理

简介 ArrayList 是一种变长的基于数组实现的集合类,允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,它会自动扩容至一个更大的数组。 另外,由于 ArrayList 底层基于数组实现,所以其可以保证在 O(1) 复杂度下完成随机查找操作。其他方面,Ar...

2019-04-02 21:02:12 50 0

转载 ConcurrentHashMap原理分析(1.7)

一、出现背景 1、线程不安全的HashMap 先说HashMap,HashMap是线程不安全的,在并发环境下,可能会形成环状链表(扩容时可能造成,具体原因自行百度google或查看源码分析,参考https://blog.csdn.net/diweikang/article/details/89...

2019-03-27 22:14:35 125 0

转载 HashSet的实现原理

1、HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。 2、HashSet的实现: 对于HashSet而言,它是基于HashMap实现的,HashSet底层...

2019-03-22 15:05:22 71 0

原创 String中equals()、hashCode()方法的作用与源码

String类中的equals()方法的源码如下: public boolean equals(Object anObject) { if (this == anObject) { return true; } i...

2019-03-22 13:08:30 339 0

转载 重写equal()时为什么也得重写hashCode()之深度解读

1.equals()的所属以及内部原理(即Object中equals方法的实现原理) 说起equals方法,我们都知道是超类Object中的一个基本方法,用于检测一个对象是否与另外一个对象相等。而在Object类中这个方法实际上是判断两个对象是否具有相同的引用,如果是,它们就一定相等。其源码如下...

2019-03-21 22:24:14 362 0

转载 List集合去除重复对象

在java中,要将一个List中重复的对象除去,如果这个集合中的数据类型是基本数据类型,可以直接将List集合转换成Set,就会自动去除重复的元素,大家都知道Set集合的特点就是没有重复的,这个就相对比较简单,这里不在详细说,我们下面说的List集合中的数据类型是一个对象类型的情况。 当List...

2019-03-21 21:28:51 2937 0

原创 List的equals方法学习

之前没有了解过这个方法,初次在项目中看到它的时候还以为是在比较两个List的地址,后来看了源码才知道了这个方法的作用。 首先看一个例子: public class Test{ public static void main(String[] args){ ArrayL...

2019-03-21 18:53:30 1114 0

转载 HashMap实现原理与源码分析

哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的HashMap的实现原理进行讲解,...

2019-03-12 22:21:47 32 0

原创 HashMap底层实现原理

数据结构中有数组和链表这两个结构来存储数据。 数组存储区间是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难; 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但查找的时间复杂度很大,达O(N)。链表的特点是:寻址困...

2019-03-11 23:24:47 78 0

提示
确定要删除当前文章?
取消 删除