
JAVA
文章平均质量分 88
♛薄情痞子♛
人生无非就是笑笑别人或被别人笑笑而已。
此博客仅供个人学习而用,如有侵权,请联系我,谢谢!!
展开
-
布隆过滤器
不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,在面试中面试官问到怎么避免缓存穿透,你的第一反应可能就是布隆过滤器,缓存穿透=布隆过滤器成了标配,但具体什么是布隆过滤器,怎么使用布隆过滤器不是很清楚,那今天我们就来把它说清楚,讲明白。缓存穿透...转载 2021-06-21 10:59:36 · 305 阅读 · 0 评论 -
Semaphore信号量
Semaphore是Java里面另外一个基本的并发工具包类,主要的的作用是用来保护共享资源的访问的,也就是仅仅允许一定数量的线程访问共享资源。Semaphore维护了有限数量的许可证,只有得到了许可证的线程才能进行共享资源的访问,如果得不到许可证,说明当前共享资源的访问已经达到最大限制,所以会挂起当前线程,直到前面的线程处理完任务之后,把许可证归还,后面排队的线程才有机会获取,然后处理任务。这里面有两个注意点:(1)大多数时候使用Semaphore都应该是公平模式,默认是非公平模式,如果需要公平模式转载 2021-05-19 17:39:39 · 136 阅读 · 0 评论 -
多线程面试题
1、并发编程三要素?原子性、可见性、有序性2、实现可见性的方法有哪些?synchronized或者Lock:保证同一个时刻只有一个线程获取锁执行代码,锁释放之前把最新的值刷新到主内存,实现可见性。3 、创建线程的三种方式的对比?1)采用实现Runnable、Callable接口的方式创建多线程。优势是:线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一.原创 2021-05-19 16:11:01 · 246 阅读 · 0 评论 -
多线程交替打印ABC的多种实现方法
原文链接:https://blog.youkuaiyun.com/xiaokang123456kao/article/details/77331878一、题目描述建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。二、Synchronized同步法1、基本思路使用同步块和wait、notify的方法控制三个线程的执行次序。具体方法如下:从大的方向上来讲,该问题为三线程间的同步唤醒转载 2021-05-19 16:02:32 · 2848 阅读 · 0 评论 -
ReentrantLock实现原理
原文链接:https://blog.youkuaiyun.com/qq_20597727/article/details/86263237java.util.concurrent包中的工具实现核心都是AQS,了解ReentrantLock的实现原理,需要先分析AQS以及AQS与ReentrantLock的关系。这篇文章中分析了ReentrantLock#lock与ReentrantLock#unlock的实现,对于Condition的实现分析,另外文章再讲,基本上大同小异。ReentrantLock实现核心转载 2021-05-19 13:26:13 · 322 阅读 · 0 评论 -
Java中常见的锁
常见的锁公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁、非公平锁公平锁:线程获取锁的顺序是按照线程申请锁的顺序来分配的,即先来先得的FIFO先进先出顺序。非公平锁:指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反原创 2021-05-18 18:29:50 · 172 阅读 · 0 评论 -
synchronized与ReentrantLock的区别
底层实现上来说,synchronized 是JVM层面的锁,是Java关键字,通过monitor对象来完成(monitorenter与monitorexit),对象只有在同步块或同步方法中才能调用wait/notify方法,ReentrantLock 是从jdk1.5以来(java.util.concurrent.locks.Lock)提供的API层面的锁。 synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、向OS申请重量级锁,ReentrantLock实现则是通过利用CA..转载 2021-05-18 14:01:58 · 156 阅读 · 0 评论 -
Lock(ReentrantLock)、ReadWriteLock(ReentrantReadWriteLock)、Condition(多路通知功能)
原文链接:https://blog.youkuaiyun.com/qq_39150049/article/details/112798911目录一.synchronized的缺陷二.Lock接口的特性及基本方法接口的特性接口基本的方法:三、ReentrantLock介绍及实例ReentrantLock类常见方法:lock声明为局部变量,使用lock:lock声明为类的属性,使用locktrylock的使用lockInterruptibly的使用四、ReadWriteLoc转载 2021-05-18 13:50:59 · 829 阅读 · 0 评论 -
JVM-对象的创建、内存布局、访问定位
本文链接:https://blog.youkuaiyun.com/zqz_zqz/article/details/70246212对象结构在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。下图是普通对象实例与数组对象实例的数据结构:对象头HotSpot虚拟机的对象头包括两部分信息:markword第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、G转载 2021-05-13 14:22:22 · 269 阅读 · 0 评论 -
jdk1.8 LinkedHashMap原理
LinkedHashMap结构图:LinkedHashMap的实现主要分两部分,一部分是哈希表,另外一部分是链表。哈希表部分继承了HashMap,拥有了HashMap那一套高效的操作,而链表保证对哈希表迭代时的有序性,而这个有序是指键值对插入的顺序。另外,当向哈希表中重复插入某个键的时候,不会影响到原来的有序性。所以我们要看的就是LinkedHashMap中链表的部分,了解它是如何来维护有序性的。LinkedHashMap 的大致实现如下图所示,当然链表和哈希表中相同的键值对都是指向同一个对象,这里原创 2021-04-22 15:37:42 · 307 阅读 · 0 评论 -
HashSet底层原理
什么是HashSetHashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。HashSet类,是存在于java.util包中的类 [1] 。同时也被称为集合,该容器中只能存储不重复的对象已知实现接口有:Serializable, Clone转载 2021-04-14 10:06:45 · 294 阅读 · 0 评论 -
JDK1.8的HashMap底层原理
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。简单说下HashMap的实现原理:首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的ha转载 2021-04-13 16:50:34 · 454 阅读 · 0 评论 -
RunTime类
1.该类主要代表了应用程序的运行环境。一个RunTime就代表一个运行环境。2.RunTime类常用的方法:(1)getRuntime():该方法用于返回当前应用程序的运行环境对象。(2)exec(String command):该方法用于根据指定的路径执行对应的可执行文件。(3) freeMemory():该方法用于返回Java虚拟机中的空闲内存量,以字节为单位。(4)maxMemory():该方法用于返回Java虚拟机试图使用的最大内存量。(5) totalMemory()...原创 2020-09-14 12:21:41 · 854 阅读 · 0 评论 -
java 从字符串中提取省、市、区、镇、乡等区域名称(包含少数民族地区)
import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** @author Zhang* ...转载 2020-04-07 22:03:55 · 5610 阅读 · 0 评论 -
Java中StringTokenizer类的作用
StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数。区别:String.Split()使用正则表达式,而StringTokenizer的只是使用逐字分裂的字符。1.构造函数public StringTokenizer(String str) public StringTokenizer(String str, String delim) p...转载 2019-03-27 16:58:05 · 913 阅读 · 0 评论 -
Calendar日历类和GregorianCalendar公历类用法的一个小结
日历类 主要涉及两个类,一个就是抽象类 Calendar类,另一个是他的子类GregorianCalendar。一、Calendar类。1,主要字段:YEAR(年份) MONTH(月份从0开始) DATE(一月的某天)...转载 2019-03-27 11:47:25 · 895 阅读 · 0 评论 -
LoggerFactory.getLogger(String name)用法
public static Logger getLogger(String name)用法1.使用指定类初始化日志对象 在日志输出的时候,可以打印出日志信息所在的类,如下: Logger logger = LoggerFactory.getLogger(com.User.class); logger.debug("用户信息"); 将会打印出: com.User...转载 2019-03-27 11:13:19 · 9808 阅读 · 1 评论 -
java 基础复习
Java基础复习(一) 链接:https://blog.youkuaiyun.com/simplebam/article/details/65447600Java基础复习(二) 链接:https://blog.youkuaiyun.com/simplebam/article/details/68068128Java基础复习(三) 链接:https://blog.youkuaiyun.com/simplebam/a...转载 2019-03-16 19:43:32 · 786 阅读 · 0 评论 -
Java提高篇——对象克隆(复制)
阅读目录为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结假如说你想复制一个简单变量。很简单:int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。但是如果你复制的是一个对象,情况就有...转载 2019-03-16 11:58:06 · 196 阅读 · 0 评论 -
Java排序算法详解及示例汇总——超详细
冒泡排序、选择排序、直接插入排序、二分法排序、希尔排序、快速排序、堆排序、归并排序、基数排序,共9中排序算法详解和代码示例。示例中全部采用从小到大排序,编码方式为本人理解的思路,算法思想也是自己理解的口语表达方式,若想查看更准确的算法思想和代码示例可直接搜索各算法的百科示例源码地址一、冒泡排序1、算法思想两两比较,如果后者比前者大则交换位置 每遍历一圈最大...转载 2019-03-16 11:47:19 · 237 阅读 · 0 评论 -
数组和链表的区别
1.链表是什么链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素;链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。所以,链表允许插...转载 2019-03-15 18:23:59 · 8766 阅读 · 0 评论 -
Java的反射机制
什么是反射动态获取类的信息以及动态调用对象的方法称为Java的反射(Reflection)机制。反射提供了封装程序集、模块和类型的对象。在Java运行时环境中,对于任意一个类的对象,可以通过反射获取这个类的信息。反射基本信息Java程序中许多对象在运行时会出现两种类型:运行时类型(RTTI)和编译时类型,例如Person p = newStudent();这句代码中p在编译时类型为Person,运行时类型为Student。程序需要在运行时发现对象和类的真实信心,而通过使用反射程序就能判断出该对象转载 2019-03-15 16:09:12 · 184 阅读 · 0 评论 -
Spring定时任务的几种实现
近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合spring框架来介绍。一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。...转载 2019-03-07 22:23:07 · 125 阅读 · 0 评论 -
快速排序——JAVA实现
高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放...转载 2019-03-06 15:21:29 · 173 阅读 · 0 评论 -
java中的基本算法
1.二叉树 二叉树是n(n>=0)个结点的有序集合。每个结点最多有2个子节点,即左结点和右结点,且左右结点顺序不能更改。 当n=0时,为空二叉树;当n=1时,为只有一个根二叉树。1 public class BinTree { 2 3 private BinTree lChild;//左结点 4 5 private BinTree...转载 2019-03-06 15:11:34 · 7565 阅读 · 0 评论 -
String、StringBuffer与StringBuilder
1、运行速度上比较 StringBuilder >StringBuffer > String为什么String的执行速度最慢?String:字符串常量StringBuffer:字符串变量StringBuilder:字符串变量从上面的名字可以看到,String是“字符串常量”,也就是不可改变的对象。对...转载 2019-03-01 20:31:26 · 124 阅读 · 0 评论 -
JAVA面试题
一. Java基础部分……………………………………………………………………………………..71、一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?……………………………………………………………………………………………….72、Java有没有goto?………………………………...转载 2018-12-27 10:48:19 · 399 阅读 · 0 评论 -
【Java】HashMap 实现原理
Java集合框架有两个顶级接口,一个是collection接口,另一个是map接口,hashmap便是map接口的重要实现类。首先看map接口。根据map键值对的特性,接口中必然有相关的方法,主要是: 前三个与map的操作有关,后三个与map遍历相关。 在map接口中,还定义了一个entry接口,hashmap实现本质上是一个entry的数组的链表。所以entry可以看成是h...转载 2018-09-10 17:34:29 · 5795 阅读 · 0 评论 -
JSON在前端和后端传递
前后台最最传统的交互方式就是表单交互,然后用request.setAttribute方法设置结果,渲染jsp,然而随着前台界面的复杂程度的提高,或者是使用了某些前端框架(sigmagrid)越来越多的界面会使用异步方式提交数据。那么这个过程大致是什么样的?后端:我们假定使用的是java语言前端:毫无疑问是jsjava语言是一种强类型的语言,必须定义类型,然后生成实例,而js却不是,虽然...转载 2018-09-10 16:38:13 · 12904 阅读 · 0 评论 -
【Java】为什么接口interface里的 变量是 static final 的?
今天突然问自己,接口的变量为什么是static和final的?static:必须。因为接口是可以多继承的。如果一个类实现了两个接口,且两个接口都具有相同名字的变量,此时这个变量可以被实现类使用,那么如果不是static的,这个变量来自哪一个接口就会产生歧义,所以实现类使用接口中的变量必须通过接口名指定,也就只能定为static的。看下面的例子:此时,会报编译错误,因为a有歧义。R...转载 2018-09-10 16:26:39 · 2573 阅读 · 0 评论 -
详解Java中的闭包(Closure)和回调
Closure对象原文地址:详解Java中的闭包(Closure)和回调作者:nbao以前总是对闭包(Closure)一知半解的,最近花时间查阅资料,很多地方都讲得语焉不详,看后仍感觉云里雾里的。后来还是研究了下李刚写的《疯狂Java讲义》,里面讲得还是比较清楚,才终于弄清楚了闭包是怎么回事。现在分享研究结果出来,也算是给像我原来一样有疑惑的学习者一个参考。 闭包(Closure)是一种能被调用对...转载 2018-03-09 09:10:36 · 1734 阅读 · 0 评论 -
使用Arrays和Collections实现将数组快速转成list
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;public class asdas {public static void main(String[] args) {List list = Arrays.asList...转载 2018-03-09 09:07:43 · 1268 阅读 · 0 评论 -
Map 排序
对 List<Map<String, Object>>中的map,按照map中的某个键值对对list的map进行排 java.utils.Collections List> list = new ArrayList>(); // 按日期降序处理 Collections.sort(list, new Comparator&...转载 2018-03-09 09:06:06 · 145 阅读 · 0 评论 -
JAVA iterator的两种遍历方式
迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回...转载 2018-03-09 09:01:29 · 21585 阅读 · 0 评论 -
list 集合复制总结
方法一: List l = new ArrayList(); l.add("a"); l.add("b"); l.add("c"); List l2 = new ArrayList(l); l2.add("d"); System.out.println(l2); System.ou...转载 2018-03-09 08:59:08 · 15778 阅读 · 2 评论 -
Java中Map常用方法总结以及遍历方式的汇总
一、整理: 看到array,就要想到角标。 看到link,就要想到first,last。 看到hash,就要想到hashCode,equals. 看到tree,就要想到两个接口。Comparable,Comparator。二、Map与Collection在集合框架中属并列存在 1.Map存储的是键值对 2.Map存储元素使用put方法,Collectio...转载 2018-03-09 08:53:48 · 257 阅读 · 0 评论 -
Java map 详解 - 用法、遍历、排序、常用API等
概要:java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。本文主要介绍java map的初始化、用法、map的四种常用的遍历方式、map的排序以及常用api。| |目录1Map用法·类型介绍·类型区别·Map 初始化·插入元素·获取...转载 2018-03-08 16:04:07 · 177 阅读 · 0 评论 -
JAVA中ListIterator和Iterator详解与辨析
在使用java集合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢?下面我们详细分析。这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示: 这里假设集合List由四个元素List1、List2、List...转载 2018-03-08 15:19:19 · 178 阅读 · 0 评论