mysql分组后获取每个组排序后的第一条数据(整行) 有一个学生分数表student,数据结构是这样的id(当前表ID)student_id(学生ID)line(分数)subject_type(科目类型)118012...
Java8开始ConcurrentHashMap,为什么舍弃分段锁 概述我们知道, 在 Java 5 之后,JDK 引入了 java.util.concurrent 并发包 ,其中最常用的就是ConcurrentHashMap 了, 它的原理是引用了内部的 Segment (ReentrantLock ) 分段锁,保证在操作不同段 map 的时候, 可以并发执行, 操作同段 map 的时候,进行锁的竞争和等待。从而达到线程安全, 且效率大于 synchr...
内存屏障 内存屏障(Memory barrier)为什么会有内存屏障每个CPU都会有自己的缓存(有的甚至L1,L2,L3),缓存的目的就是为了提高性能,避免每次都要向内存取。但是这样的弊端也很明显:不能实时的和内存发生信息交换,分在不同CPU执行的不同线程对同一个变量的缓存值不同。 用volatile关键字修饰变量可以解决上述问题,那么volatile是如何做到这一点的呢?那就是内存屏障,内存屏障...
深入理解Java HashMap 1. 概述从本文你可以学习到:什么时候会使用HashMap?他有什么特点? 你知道HashMap的工作原理吗? 你知道get和put的原理吗?equals()和hashCode()的都有什么作用? 你知道hash的实现吗?为什么要这样实现? 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?当我们执行下面的操作时: ...
Redis的数据淘汰策略有哪些 Redis 提供 6 种数据淘汰策略(即,内存淘汰策略)volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].ex...
线程的生命周期状态图,及相应概念。 一、线程的生命周期线程状态转换图:1、新建状态(New)用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。2...
记录:一道java类加载时机与过程的面试题 以前曾经看到过一个java的面试题,当时觉得此题很简单,可是自己把代码运行起来,可是结果并不是自己想象的那样。题目如下:class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int count1; public static int count2 = ...
怎么打破双亲委派机制, 双亲委派模型的好处。 双亲委派模型的好处:在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存在在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的Bootstrap ClassLoader进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写...
CMS垃圾收集器与G1收集器 1、CMS收集器CMS收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现,它的运作过程如下:1)初始标记2)并发标记3)重新标记4)并发清除初始标记、从新标记这两个步骤仍然需要“stoptheworld”,初始标记仅仅只是标记一下GCRoots能直接关联到的对象,熟读很快,并发标记阶段就是进行GCRootsTracing,而重新标...
100亿个整数如何找到中位数?内存足够和内存不足两个场景 100亿个整数,内存足够,如何找到中位数?内存不足,如何找到中位数?(1)当内存足够时:采用快排,找到第n大的数。• 随机选取一个数,将比它小的元素放在它左边,比它大的元素放在右边• 如果它恰好在中位数的位置,那么它就是中位数,直接返回• 如果小于它的数超过一半,那么中位数一定在左半边,递归到左边处理(还是第几大)• 否则中位数一定在右半边,根据左半边的元素个数计算出中位数是右半...
Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法 Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法在《Java对象在Java虚拟机中的创建过程》了解到对象创建的内存分配,在《Java内存区域 JVM运行时数据区》中了解到各数据区有些什么特点、以及相关参数的调整,在《Java虚拟机垃圾回收(一) 基础》中了解到如何判断对象是存活还是已经死亡?在《Java虚拟机垃圾回收(二)...
Java虚拟机垃圾回收(三) 7种垃圾收集器:主要特点 应用场景 设置参数 基本运行原理 Java虚拟机垃圾回收(三) 7种垃圾收集器主要特点 应用场景 设置参数 基本运行原理在《Java虚拟机垃圾回收(一) 基础》中了解到如何判断对象是存活还是已经死亡?在《Java虚拟机垃圾回收(二) 垃圾回收算法》了解到Java虚拟机垃圾回收的几种常见算法。下面先来了解HotSpot虚拟机中的7种垃圾收集器:Serial、ParNew、Paralle...
Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析 在《Java内存区域 JVM运行时数据区》中了解到各数据区有些什么特点、以及相关参数的调整,知道了:程序计数器、虚拟机栈、本地方法栈这3个区域是随线程而生而灭的,内存分配和回收都具备确定性,而Java堆和方法区则不一样,各线程共享,在运行时内存的分配与回收都是动态的,垃圾收集器所关注的是这部分内存。接下来几篇文章我们来详细了解Java堆和方法区的内存分配与回收,下面先...
Java虚拟机垃圾回收(二) 垃圾回收算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 火车算法 在《Java虚拟机垃圾回收(一) 基础》中了解到如何判断对象是存活还是已经死亡? 介绍了垃圾回收基础算法:引用计数算法、可达性分析算法,以及HotSpot虚拟机中实现对象可达性分析的一些问题。下面先来了解Java虚拟机垃圾回收的几种常见算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法、火车算法,介绍它们的算法思路,有什么优点和缺点,以及主要应用场景。...
关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案 1 前言在我们的平常的项目中多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。特别是高 QPS 的系统,每次都去查询数据库,对于你的数据库来说将是灾难。今天我们不牵涉多级缓存的知识,就把系统使用到的缓存方案,不管是一级还是多级的都统称为缓存,主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。我们使用缓存时,我们的业务系统大概的调用流程如...
二维矩阵顺时针旋转90度 今天仍然来分析一个与数组操作相关的算法,是关于二维数组旋转问题的。问题描述原文You are given an n × n 2D matrix representing an image.Rotate the image by 90 degrees (clockwise).Follow up: Could you do this in-place?大意:给一个 n * ...
java中的4种引用:强引用、软引用、弱引用和虚引用 我们知道java语言提供了4种引用类型:强引用、软引用(SoftReference)、弱引用(WeakReference)和幽灵引用(PhantomReference),与引用密切相关的,还有一个引用队列ReferenceQueue。引用和引用队列的关系,对于垃圾回收来说非常重要,学习垃圾回收机制,必须要先了解引用和引用队列的使用方法。本文主要参考网上的一些理论,同时配合自己的一些测试代码,更好的...
四种元注解:@Retention @Target @Document @Inherited java中元注解有四个:@Retention @Target @Document @Inherited; @Retention:注解的保留位置 @Retention(RetentionPolicy.SOURCE)//注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.CLASS)...
@SneakyThrows @SneakyThrows大胆抛出已检查的异常,以前没有人抛出它们!Overview@SneakyThrows可以用来偷偷抛出已检查的异常而不在方法的throws子句中实际声明这一点。当然,应该谨慎使用这种有争议的能力。由lombok生成的代码不会忽略,包装,替换或以其他方式修改抛出的已检查异常; 它只是伪造了编译器。在JVM(类文件)级别,无论方法的throws子句如何,都可以抛出所...
Spring 中@transactional 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Tr...
JPA事务处理(坑) 1、JPA事务JPA的确没有提供事务级别的设置,只提供了@TransactionAttribute注释用作定义一个需要事务的方法。它可以有以下参数:1.REQUIRED:方法在一个事务中执行,如果调用的方法已经在一个事务中,则使用该事务,否则将创建一个新的事务。2.MANDATORY:方法必须在一个事务中执行,也就是说调用的方法必须已经有一个事务,否则新抛出一个错误(ERROR)...
hibernate/jpa事务提交执行sql顺序(坑) SSH框架下,spring的事务中提交时hibernate的sql执行顺序错乱,未按代码顺序实现。 JPA也是。Hibernate在最终执行SQL语句时,居然是按INSERT, UPDATE, DELETE的顺序执行的,而非按照代码顺序执行!原因hibernate了性能优化,不会把sql语句直接提交给数据库,而是先放在hibernate的缓存中等事务commit的时候一起提交,为的是...
高并发锁事务重试机制(JPA高并发下的乐观锁异常) 乐观锁:model实体类加version字段 @JsonProperty("_version") @Column(name = "version", nullable = false) @Version private Long version = 0L;问题场景先在库里查询出该实体,转化为持久态,在这时库里的该数据被修改了...
JPA生命周期相关注解 在我们使用JPA对数据库进行操作的时候,我们时常会出现数据库字段设置未不能为空,而我们保存的字段为null导致程序报错。这个时候我们就可以使用 @PrePersist @PostPersist 注解回调方法来解决问题。回调方法是附加到实体生命周期事件的用户定义方法,并且在发生这些事件时由JPA自动调用。我们可以发现有很多类似的注解可以使用:@PrePersist- 在新实体持久化之前(...
千万级流量,架构设计方案初窥。 随着互联网的发展,各项软件的客户量日益增多,当客户量达到一定峰值时,当数以万计的流量来临时,程序的顺利运行以及即时响应则显得尤为重要,就像双11那天的淘宝一样。那么,如何设计架构才能够抗住这千万级的流量。老板让你抗住千万级流量,如何做架构设计?首先,要在我们架构设计的时候建立一些原则。1. 实现高并发服务拆分:将整个项目拆分成多个子项目或者模块,分而治之,将项目进行水平扩展。...
Java线程池ThreadPoolExecutor详解 Java线程池ThreadPoolExecutor详解1、线程池的工作原理?线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。 当调用 execute() 方法添加一个任务时,线程池会做如下判断: 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务; 如果正在运行的线程数量大于...
如何保证缓存与数据库的双写一致性? 分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?Cache Aside Pattern最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,...
Hbase深入浅出 目录HBase 在大数据生态圈中的位置HBase 与传统关系数据库的区别HBase 相关的模块以及 HBase 表格的特性HBase 的使用建议Phoenix 的使用总结HBase 在大数据生态圈中的位置提到大数据的存储,大多数人首先联想到的是 Hadoop 和 Hadoop 中的 HDFS 模块。大家熟知的 Spark、以及 Hadoop 的 MapRedu...
通过注解扫描加载指定路径下的所有注解定义的规则类 通过注解,扫描加载指定路径下的所有注解定义的规则类,实现方法。思想:扫描注册,映射匹配。优势:解耦,代码易读,组件化等等应用场景和具体实现大家可自行摸索。以下为示例代码,提供思路,可自行修改。方法一:扫描class文件,通过反射实例化对象,适合有状态对象。import java.util.ArrayList;import java.util.List;imp...
Spring Boot中使用Swagger2构建强大的RESTful API文档 Spring Boot中使用Swagger2构建强大的RESTful API文档由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。这样一来,我们的RE...
java并发编程:多线程通信 线程间的通信这里我们有一个需求,如下: 分别开一个线程代表两个工作者,一个负责挖坑,一个负责埋土,要求挖一个埋一个,实现挖坑、埋土、挖坑、埋土.....循环下去 先看一下下边得实现public class Test { String s = ""; public synchronized void dig() { s = "挖坑"; } public sync...
数据结构及算法:链表相关(如何判断单链表是否存在环、找出入环点、链表相交等问题) 目录一、如何判断单链表是否存在环方法一、穷举遍历方法二、哈希表缓存方法三、快慢指针(推荐)方法四、Set集合大小变化二、如何找出有环链表的入环点?方法一、用HashSet来解决方法二、计算循环(快慢指针)情况一:多走一个环情况二、当fast比slow 多走n个环代码实现三、如果存在环,求出环上节点的个数;四、如果存在环,求出链表的长度;...
java容器:HashMap HashMap 概述Map 是 Key-Value 对映射的抽象接口,该映射不包括重复的键,即一个键对应一个值。HashMap 是 Java Collection Framework 的重要成员,也是Map族(如下图所示)中我们最为常用的一种。简单地说,HashMap 是基于哈希表的 Map 接口的实现,以 Key-Value 的形式存在,即存储的对象是 Entry (同时包含了 Key 和 ...
软件开发模式:各软件开发模式对比(瀑布、迭代、螺旋、敏捷) 1、瀑布模型是由W.W.Royce在1970年最初提出的软件开发模型, 瀑布式开发是一种老旧的计算机软件开发方法。瀑布模型式是最典型的预见性的方法,严格遵循预先计划的需求分析、设计、编码、集成、测试、维护的步骤顺序进行。步骤成果作为衡量进度的方法,例如需求规格,设计文档,测试计划和代码审阅等等。瀑布式的主要的问题是它的严格分级导致的自由度降低,项目早期即作出承诺导致对后期需求的变化难...
JAVA消息系列:JMS详解 目录JAVA消息系列—JMS前言基本概念消息模型P2P模式Pub/Sub模式消息的消费JMS编程模型JAVA消息系列—JMS前言java 消息模块个人理解分为两种: 同步消息(RPC调用) 异步消息(本篇讲解部分) 同步消息java提供了多种方案: 新比较常用的方式就是s...
基础框架:mybatis工作原理 引言在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹(参考:《MyBatis————基础知识》)。但是,为什么还要要学习mybatis的工作原理?因为,随着mybatis框架的不断发展,如今已经越来越趋于自动化,从代码生成,到基本使用,我们甚至不需要动手写一句SQL就可以完成一个简单应用的全部CRUD操作。从原生mybatis到mybatis-spring,到myb...
设计模式:抽象工厂模式 目录概述解决问题代码实现visio图概述 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。可以理解成是多个工厂方法的组合。解决问题 在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的对象,工厂方法就满足不了需求了。这时我们可以把多个工厂方法组合到一个类,这就是抽象工厂模式...
设计模式:工厂方法模式 简介工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让实例化推迟到子类。代码pizza抽象类public abstract class Pizza { protected String name; // 名称 protected String dough; // 面团 protected String sause; // 酱料 prot...
设计模式:简单工厂模式 目录简介代码示例:visio图优缺点及使用场景简介简单工厂模式又称之为静态工厂方法,属于创建型模式。在简单工厂模式中,可以根据传递的参数不同,返回不同类的实例。其可以使调用方不用关注对象的构造过程,直接在工厂中提取需要的依赖对象,可以把调用方和对象构造进行解耦。代码示例:定义pizza抽象类public abstract class Pizz...
数据结构:B+树 目录B+树B+树特点插入操作查找操作遍历操作B+树B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点、内部节点和叶子节点。多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率。另外因为叶子节点相连遍历操作很方便,而且数据也具有顺序性,便于区间查找。B+树特点B+树可以定义一个...
数据结构:B树 目录B树B树特点插入查找B树B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树、B_树。是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找、插入和删除。B树一般较多用在存储系统上,比如数据库或文件系统。B树特点B树可以定义一个m值作为预定范围,即m路(阶)B树。 每个节点最多有m个孩子。 每个节点至少有ceil(m/2)...
数据结构:红黑树 目录红黑树红黑树性质旋转和变色插入操作查找红黑树红黑(Red-black)树是一种自平衡二叉查找树,1972年由Rudolf Bayer发明,它与AVL树类似,都在插入和删除操作时能通过旋转操作保持二叉查找树的平衡,以便能获得高效的查找性能。它可以在 O(logn)时间内做查找,插入和删除等操作。红黑树是2-3-4树的一种等同,但有些红黑树设定只能...
数据结构:2-3树 目录2-3树2-3树特点插入操作查找2-3树2-3树,是最简单的B-树,其中2、3主要体现在每个非叶子节点都有2个或3个子节点,B-树即是平衡树,平衡树是为了解决不平衡树查询效率问题,常见的二叉平衡书有AVL树,它虽然提高了查询效率,但是插入操作效率不高,因为它需要再每次插入节点后维护树的平衡,而为了解决查询效率同时有兼顾插入效率,于是提出了2-3树。...
数据结构:AVL树(平衡二叉树) 目录AVL树AVL树特点二叉搜索树的平衡为什么要旋转插入方式右单旋左单旋左右双旋右左双旋插入查找删除情况二AVL树AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写。AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高。AVL树特点AVL树是一...
数据结构:基于数组的栈 目录栈栈的实现pushpop栈栈是一种线性存储结构且运算受限的线性表,它的插入和删除运算操作被限制在表的一端,该端称为栈顶,而另外一端则称为栈底。栈中的数据以后进先出(Last In First Out 即LIFO)方式进出栈。栈的实现栈的实现方式有多种方式,主要是使用不同的结构来存储栈元素,比如使用数组、单向链表、双向列表等。这里看数组方式的实现。实...
数据结构:二叉搜索树 目录关于树树的特点二叉搜索树二叉搜索树特点插入操作-插入顺序性查询操作删除操作关于树对于树的数据结构大家都了解,只是树的类型有很多,所以可能又会对树产生一种陌生感。树其实就是由有限n(n>=1)个节点组成的一个具有层次关系的集合,它看起来像一棵倒挂的树,所以称之为“树”。树的特点每个节点有若干个或0个子节点; 根节点没有父节点; 每一...
数据结构:双向链表 目录双向链表双链表特点双链表创建插入链尾创建迭代器插入节点删除节点双向循环链表双向链表双向链表属于链表的一种,也叫双链表双向即是说它的链接方向是双向的,它由若干个节点组成,每个节点都包含下一个节点和上一个节点的指针,所以从双向链表的任意节点开始,都能很方便访问他的前驱结点和后继节点。双链表特点创建双链表时无需指定链表的长度。 比起单链表,双链...
数据结构:单向链表 目录单向链表单链表特点单链表创建创建迭代器插入节点删除节点单向链表单向链表属于链表的一种,也叫单链表,单向即是说它的链接方向是单向的,它由若干个节点组成,每个节点都包含下一个节点的指针。单链表特点创建单链表时无需指定链表的长度,这个比起数组结构更加有优势,而数组纵使实现成动态数组也是需要指定一个更大的数组长度,而且要把原来的数组元素一个个复制到新数组中...
数据结构:数组 目录数组一维数组二维数组三维及更高维数组数组数组是最熟悉也是最基础的一种结构了,有限个相同数据类型的元素按顺序排列的集合为数组。数组的数据是连续的,有上界下界,在其中的元素都有属于自己的索引值,即下标,通过这些下标就能定位到数组值。根据维度的不同可以将数组分为一维数组、二维数组、三维数组等等,以此类推。一维数组创建一个长度为10的数组,如果将11...
基础算法:希尔排序 希尔排序,也称递减增量排序算法,1959年Shell发明。是插入排序的一种高速而稳定的改进版本。希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。1、基本思想(1)设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为i...
基础算法:快速排序 快速排序(Quicksort)是对冒泡排序的一种改进,借用了分治的思想,由C. A. R. Hoare在1962年提出。1、基本思想快速排序的基本思想:挖坑填数+分治法。首先选一个轴值(pivot,也有叫基准的),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2、算法描述快速排...
基础算法:冒泡排序 1、基本思想冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。2、算法描述冒泡排序算法的运作如下:①. 比较相邻的元素。如果第一个比第二个大,就交换他们两...
基础算法:选择排序 算法图示1、基本思想选择排序的基本思想:比较 + 交换。在未排序序列中找到最小(大)元素,存放到未排序序列的起始位置。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。2、算法描述①. 从待排序序列中,找到关键字最小的元素;②. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;③. 从余下的 N – 1 个元素中,找出关键字最小的元素,...
基础算法:直接插入排序 插入排序:它的算法思想是:把要排序的数组分为了两个部分, 一部分是经过插入排序后有序的部分, 另一部分是除去第一部分待插入的元素; 先将第一部分排序完成, 然后再插入这个元素.。插入排序由于操作不尽相同, 可分为直接插入排序,折半插入排序(又称二分插入排序),链表插入排序,希尔排序。我们先来看下直接插入排序。1、基本思想直接插入排序的基本思想是:将数组中的所有元素依次...
如何理解算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)等? 这里提供一点直观的视角:先从 O(1) 来说,理论上哈希表就是O(1)。因为哈希表是通过哈希函数来映射的,所以拿到一个关键字,用哈希函数转换一下,就可以直接从表中取出对应的值。和现存数据有多少毫无关系,故而每次执行该操作只需要恒定的时间(当然,实际操作中存在冲突和冲突解决的机制,不能保证每次取值的时间是完全一样的)。举个现实的例子,比如我的身后有一排柜子,里面有香蕉(代号B),苹果(代号A),...
Springboot项目中普通类直接调用注解类bean 写一个工具类,并托管。import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframe...
java并发编程:AQS 目录简介CLH同步队列入列出列同步状态的获取与释放独占式独占式同步状态获取独占式获取响应中断独占式超时获取独占式同步状态释放共享式共享式同步状态获取共享式同步状态释放阻塞和唤醒线程简介java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁...
java并发编程:可重入锁是什么? 释义广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。ReentrantLock和synchronized都是可重入锁,下面是一个用synchronized实现的例子:public class ReentrantTest implements Runnable { pub...
java并发编程:CAS 目录CAS分析CAS缺陷循环时间太长只能保证一个共享变量原子操作ABA问题CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchron...
java并发编程:基于JMM分析DCL 目录问题分析解决方案基于volatile解决方案基于类初始化的解决方案DCL,即Double Check Lock,中卫双重检查锁定。问题分析我们先看单例模式里面的懒汉式: public class Singleton { private static Singleton singleton; private Singleton(){} ...
java并发编程:JMM内存模型及volatile关键字内存语义 目录 Java内存区域划分(数据区域)方法区(Method Area):JVM堆(Java Heap):程序计数器(Program Counter Register):虚拟机栈(Java Virtual Machine Stacks):本地方法栈(Native Method Stacks)Java内存模型概述硬件内存架构与Java内存模型硬件内存架构Ja...
java并发编程:synchronized 目录 synchronized三种应用方式synchronized作用于实例方法当前锁?:解决的问题:存在的问题:synchronized作用于静态方法synchronized同步代码块synchronized底层语义原理理解Java对象头与MonitorJava对象头monitorJava虚拟机对synchronized的优化偏向锁轻量...
java并发编程:原子变量 当几个线程都不能访问某个数据(通常是某个变量)时,你必须同步数据的访问以确保变量的可见性和正确性。举个例子,如果你有如下一个简单的计数器:public class Counter { private int value; public int getValue(){ return value; } public int getNextVal...
java并发编程:ExecutorService详解 接口 java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行。一个 ExecutorService 实例因此特别像一个线程池。事实上,在 java.util.concurrent 包中的 ExecutorService 的实现就是一个线程池的实现。ExecutorService 样例 这里有一个简单的使用Java 实现的 Exe...
一款好用的json解析工具,JsonPath。 1. 介绍包: com.jayway.jsonpath.JsonPath;pom: <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> </...
java并发编程:ThreadLocal 概述相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!more看看JDK中的源码是怎么写的:This class provides thr...
java关键字 一、 关键字总览:访问控制privateprotectedpublic 类,方法和变量修饰符abstractclassextendsfinalimplementsinterfacenativenewstaticstrictfpsynchronizedtransientvolatile 程序控制breakcontinuereturndowhileifelseforinstanceo...
CentOS7安装MySQL问题解决方案 问题1:[root@localhost install-files]# rpm -ivh MySQL-server-5.6.27-1.el6.x86_64.rpmPreparing... ################################# [100%] file /usr/share/mysql/charsets/README fr...
Spring Boot视频 1. Spring Boot 项目实战 ----- 技术栈博客企业前后端链接:https://pan.baidu.com/s/1hueViq4 密码:4ma82.Spring Boot 项目实战 -----传智播客Spring Boot视频教程附代码笔记资料链接:https://pan.baidu.com/s/1o9M2bGI 密码:jxg83. Spring Boot 项目实战 -----...
《深入理解 Java 内存模型》 整理 基础并发编程的模型分类在并发编程需要处理的两个关键问题是:线程之间如何通信 和 线程之间如何同步。通信通信 是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存 和 消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信...
IDEA里Maven依赖无法下载的解决办法 1.确认pom.xml中的远程仓库或者nexus私服配置正确有些项目的pom.xml会配置nexus私服,用于下载一些局域网依赖或者其他公开私服的依赖,请确认这里配置正确。(没有使用远程仓库或本地nexus私服的请跳至下一步~)当前也可以改为使用一些国内比较好用的仓库镜像配置,如阿里云,从而加快包的下载,不再从官方仓库缓慢下载而导致下载不下来。项目中pom.xml中的远程仓库配置示例: //阿里...
java并发编程:synchronized与static synchronized 的区别 1.synchronized与static synchronized 的区别 synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时...
java并发编程:根据线程名获取线程及停止线程 根据线程名获取线程及停止进程 线程的命名与获取名称方法 设置名称可以使用Thread类的如下方法:*构造方法:public Thread (Runnable Target,String name)*设置名字:public final void setName(String name)获取线程名城:*当前运行的线程名称:Thread.current...
java并发编程:正确停止一个线程 停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。在java中有以下3种方法可以终止正在运行的线程:使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 使用stop方法强行终止,但是不推荐这个方法,因...
跟我学Nginx 跟我学Nginx(转载请注明出处)点击下载word简介Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。Nginx的安装准备好安装包 http://nginx.org/en/download.h
Spring和Mybatis整合过程中遇到的Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required的异常 Dao层继承了SqlSessionDaoSupport,该类会自动注入SQLSessionFectory,我们只要使用this.getSqlSession()就可以拿到SqlSession。但是如果使用的是"mybatis-spring-1.0.0-RC3.jar"这个版本是没有问题的。但是高版本就会有问题,原因是Mybatis3依赖的jar包"mybatis-spring-1.2.0.j
springmvc获得项目根目录(绝对路径) 只需要在web.xml中添加listener配置,具体如下: context-param> param-name>webAppRootKeyparam-name> param-value>evan.webappparam-value> context-param> listener> listener-
MyBatis的Mapper接口以及Example的实例函数及详解 一、mapper接口中的方法解析mapper接口中的函数及方法方法功能说明int countByExample(UserExample example) thorws SQLException按条件计数int deleteByPrimaryKey(Integer id) thorws SQLException
spring 静态注入 一般需要在一个工具类中使用@Autowired 注解注入一个service。但是由于工具类方法一般都写成static,所以直接注入就存在问题。使用如下方式可以解决:/** * */ package cn.ffcs.drive.common.util; import javax.annotation.PostConstruct; i
MySQL性能分析及explain的使用 使用explain语句去查看分析结果,如 explain select * from test1 where id=1;会出现:id selecttype table type possible_keys key key_len ref rows extra各列其中,type=const表示通过索引一次就找到了,key=primary的话,表示使用
获取html页面代码的方法 var q = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");q.open("GET", location.href, false);q.send();document.write(q.responseText.replace(/&/g, "&").replac
VUE(七) 组件(一) 组件 app-1: //注册全局组件 使用 Vue.component(tagName, options) Vue.component('my-component', { template:"" }) var vm =new Vue({ el:"#app",
Java8,第 5 部分 传递表达式(pass-through lambdas)的替代方案学习如何识别 Java 代码中的传递 lambda 表达式(pass-through lambdas)并替换为方法引用Lambda 表达式被广泛用在函数式编程中,但它们很难阅读和理解。在许多情况下,lambda 表达式的存在只是为了传递一个或多个形参,最好将它替换为方法引用。在本文中,您将学习如何识别代码中的传
Java 8 ,第 4 部分 提倡使用有帮助的编码Java 8 约定令人惊喜的好处表达能力是函数式编程的优势之一,但这对您的代码意味着什么?在本文中,我们将比较命令式和函数式代码的示例,判断这两者的表达能力和简洁性的品质。您将了解这些品质如何帮助确保可读性,还会考虑一个反面示例:对简洁性的过度追求导致代码无用。最后,我将介绍 Java 8 对于函数组合中的垂直对齐点的约定。尽管一些 Java
Java 8 ,第 3 部分 传统 for 循环的函数式替代方案3 个消除复杂迭代中的麻烦的新方法尽管 for 循环包含许多可变部分,但许多开发人员仍非常熟悉它,并会不假思索地使用它。从 Java™ 8 开始,我们有多个强大的新方法可帮助简化复杂迭代。在本文中,您将了解如何使用 IntStream 方法range、iterate 和 limit 来迭代范围和跳过范围中的值。您还将了解新的 t
Java 8,第 2 部分 函数组合与集合管道模式迭代 Java 中集合的函数模式在开始采用函数式编程风格时,您的程序中会自然而然地出现一些函数设计模式,但您仍需要努力掌握它们。本文将介绍函数组合和集合管道,您可以结合使用这两种函数式模式来迭代代码中的集合。了解这些模式的结构有助于您搭建自己的 Java™ 程序,从而充分利用高阶函数和拉姆达表达式。。语句与表达式如果在代
Java 8 ,第 1 部分 Java 中的一种更轻松的函数式编程途径以声明方式思考如何在 Java 程序中采用函数方法Java 开发人员早已习惯了命令式编程和面向对象的编程,因为 Java 语言从第一个版本开始就支持这些格式。在 Java 8 中,我们获得了一组强大的新的函数特性和语法。函数式编程已有数十年的历史,而且与面向对象的编程相比,函数式编程通常更简洁、更具表达力、更不容易出错,而且更容易并行
VUE(六) VUE学习(六)事件监听处理为了实现各种效果,我们总是不可避免的为一些元素绑定事件,例如,给一个按钮绑定一个点击事件,点击之后弹出窗口。 事件监听 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。--> : 示例--> Add 1 T
Tomcat 系统架构与设计模式,第 2 部分 设计模式分析门面设计模式门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到了这种设计模式。门面设计模式的原理这么多场合都用到了这种设计模式,那这种设
Tomcat 系统架构与设计模式,第 1 部分 本文以 Tomcat 5 为基础,也兼顾最新的 Tomcat 6 和 Tomcat 4。Tomcat 的基本设计思路和架构是具有一定连续性的。Tomcat 总体结构Tomcat 的结构很复杂,但是 Tomcat 也非常的模块化,找到了 Tomcat 最核心的模块,您就抓住了 Tomcat 的“七寸”。下面是 Tomcat 的总体结构图:图 1.Tomcat 的总体结构
VUE(五) VUE学习(五)列表渲染 for迭代一个数组 迭代一个数组--> :v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名。--> 我要把items中的东西取出来 item就是每次取出来的对象-->