java
文章平均质量分 75
lx_Frolf
以实战为主的系列知识分享愿景
展开
-
java多线程一定快吗?
多线程一定快吗?先看下面的例子: 总结: 当count = 100时,同步运行的时间较短,当count = 10000时,异步运行的时间较短。看起来,并不是异步一定比同步快。这是因为在程序执行时,CPU会通过时间片分配算法来循环执行任务,在多个任务之间不停的来回切换线程。当并发执行累计操作数量较小时,执行的速度会比串行慢,因为线程有创建和上下文切换的性能开销。所以,在实际使用过程中...原创 2018-08-22 13:03:31 · 702 阅读 · 0 评论 -
java中的排序算法——快速排序
快速排序快速排序是最流行的排序算法,在大多数情况下,快速排序都是最快的,执行时间为O(N*logN)级。快速排序通常比其他算法更快,因为它的内部循环在大部分的架构上效率很好。快速排序使用分而治之 的策略来把一个串行分为两个子串行。一般采用元素组合的第一个元素作为基准值,小的放在一边,大 的放在一边,在采用递归的方法分别对两边的元素集合进行循环排序。 理想状态下,应该有一半的数据项大于选择的枢纽...原创 2018-10-22 18:38:15 · 245 阅读 · 0 评论 -
java中的排序算法——冒泡排序
冒泡排序工作原理: 重复的访问要排序的序列,一次比较两个元素,如果他们的顺序错误就把它们交换过来,重 复进行访问,直到排序完成,越小的元素会经过不停的交换慢慢浮到序列的最上层。 即每轮循环把最大的数放在最后,与选择排序的区别,无需记录最大数的位置,一边比较一边交换位置。Java代码如下:输出结果:时间复杂度冒泡N-1轮,每轮最长N-1次,最短1次,总共(N-1)+(N-2)+……+1...原创 2018-10-22 18:40:58 · 231 阅读 · 0 评论 -
java中的数据结构——堆
堆这里的堆是一种特殊的二叉树,不是java中用关键字new得到的计算机内存中的可用空间。堆的特点:1.它是完全二叉树,除了树的最后一层节点不需要是满的,其他的 每层从左到右都完全是满的;2.通常用一个数组表示;3.堆中的每个节点都满足堆的条件,即每个节点的关键字都大于或 等于这个节点的子节点的关键字。 堆是完全二叉树的事实说明表示堆的数组中的下标对应的每个单元 都有值。扩展堆数组 在程...原创 2018-10-22 18:47:29 · 1071 阅读 · 0 评论 -
java中的数据结构——队列
队列与栈相似,队列也是顺序存储元素的线性数据结构,但队列是先进先出。操作插入:put,add,enque删除:delete,get,deque 插入数据项的队尾:back,tail,end 移除数据项的队头:head查看:peek,返回队头数据项的值,并不从队中删除这个项。新建:new 队空移除,队满插入都会报错。 Enqueue,Dequue,isEmpty,top队列的效率 和栈...原创 2018-10-22 18:50:46 · 803 阅读 · 0 评论 -
java中的数据结构——哈希表
哈希表哈希法是一个用于唯一标识对象并将每个对象存储在一些预先计算的唯一索引(键)中的过程,因此, 对象以键值对的形式存储,键值对的集合称为字典,可以使用键搜索每个对象。哈希法有很多不同的数 据结构,但最常用的是哈希表。 哈希表通常使用数组实现,它可以提供快速的查找和插入操作,哈希表不仅速度快(比树快),编程实 现也相对容易。缺点:基于数组,数组创建后难以扩展,某些哈希表被基本填满时,性能下降的...原创 2018-10-22 18:55:04 · 823 阅读 · 0 评论 -
java中的数据结构——链表
链表链表也是线性数据结构,与数组相比,在内存分配、内部结构及数据插入和删除的操作上均有不同。 链表用途广泛,适用于许多通用的数据库,也可以取代数组,作为其他存储结构的基础。 在链表中,每个数据项都被包含在链节点中,一个链节点是某个类的对象,这个类叫做Link。因为一个 链表中有许多类似的链节点,所以要用一个不同于链表的类来表达链节点。每个Link对象都包含一个对 下一个链节点引用的字段,即nex...原创 2018-10-22 19:00:42 · 1069 阅读 · 0 评论 -
java中的数据结构——树
树树形结构是一种层级式的数据结构,由节点和连接它们的边组成, java语言编写的程序中常常用引用来表示边。根是树中顶端的节 点:它没有父节点。节点表示保存在树中的数据对象。非平衡树是 指根左边的后代比右边多,或者相反。 区分树和图的主要特征是树中不存在环路。树的节点 Root,parent,child,leaf,sibling 。树的主要类型 N元树 平衡树 二叉树 二叉搜索树 AVL树 红...原创 2018-10-22 19:05:49 · 6235 阅读 · 0 评论 -
java中的数据结构——数组
在Java中,数组非常常用,大部分的数据结构也是基于数组来实现的。与数组有关的话题:1.在java中,声明一个数组过程中,是如何分配内存的?A. 当声明数组类型变量时,为其分配了(32位)引用空间,由于未赋值,因此并不指向任何对象;B.当创建了一个数组对象(也就是new出来的)并将其地址赋值给了变量,其中创建出来的那几个数组元素相当于引用类型变量,因此各自占用(32位的)引用空间并按其默认...原创 2018-10-24 09:01:15 · 1330 阅读 · 0 评论 -
java中的数据结构——栈
栈的工作原理,后进先出。栈,队列是比数组和其他数据结构更抽象的结构,主要通过接口对栈,队列进行定义,而他们的主要实 现机制对用户是不可见的。栈的主要机制可以用数组来实现,也可以用链表来实现。优先级队列的内部 实现可以用数组或一种特殊的树(堆)来实现。 栈只允许访问一个数据项,即最后插入的数据项。栈的应用,比如调用一个方法时,把它的返回地址和 参数压入栈,当方法结束返回时,那些数据出栈。操作...原创 2018-10-24 09:06:59 · 5496 阅读 · 0 评论 -
java中的数据结构——图
图是一种以网络形式相互连接的节点,图是一种与树有些相似的数据结构,图通常有一个固定的形状, 这是由物理或抽象的问题所决定的。图包含由边连接的顶点。类型,无向图,有向图(边有方向,通常用箭头表示)图可以用两种形式表示,邻接矩阵,邻接表,邻接矩阵或邻接表提供了关于当前顶点的位置信息,当前 顶点通过边与哪些顶点相连。深度优先搜索 在搜索到尽头的时候,深度优先搜索使用栈标记下一步的走向。 栈的内容就...原创 2018-10-24 09:13:06 · 5296 阅读 · 0 评论 -
作为程序员,我们为什么要关心java8?
作为程序员,我们为什么要关心java8?1.在java8里面可以编写更为简洁的代码(Lambda表达式),这些代码读起来更接近对于问题的描述;2.Java8对硬件也有影响,java8之前,必须利用线程才能使用多核处理器,但是线程用起来很难,容易出现错误。在java1里面有线程和锁,内存模型,java5添加了线程池和并发集合,java7添加了分支、合并(fork/join)框架,而java8有了...原创 2018-11-14 11:18:49 · 331 阅读 · 0 评论 -
java 8新特性之收集器,Optional类
一.收集器接口Collectors类的静态工厂方法能够创建的所有收集器总结:所有这些收集器都是对Collector接口的实现,以下时Collector接口声明的五个方法:二.Optional类是一个容器类,代表一个值存在或不存在,这样就避免了和null检查相关的bug。当变量存在时,Optional类只是对类简单封装,变量不存在时,缺失的值会被建模成一个“空”的Optional...原创 2018-11-15 08:53:45 · 321 阅读 · 0 评论 -
微服务概述
一。微服务微服务是一种更细粒度的SOA架构,用于建立分布式软件系统(主要是分布式计算),可以解决单体应用规模增加时所带来的问题。微服务是一种软件架构,并没有约束要用哪个技术或者绑定在哪个平台。如果细到代码层面是分层,细到工程方面是模块化,细到应用层面是服务拆分(微服务,SOA)。微服务不只针对于Java,PHP,NodeJS都可以做,一个单体应用程序把所有的功能放在一个单一进程中,并且通过在多个...原创 2019-01-24 11:44:53 · 454 阅读 · 0 评论 -
SpringWebMVC
一。静态Web内容Http请求内容由Web服务器文件系统提供,常见静态Web内容如html,css,js.jpg,flash等。静态Web的特点计算类型:IO类型(socket必须有服务器的IP、port和进程内的IO,文件在内存中的缓存,文件存在于磁盘上);交互方式单一;资源内容基本相同;资源路径:物理路径(包括文件,目录等)请求方法:主要是Get方法。常见使用场景:信息展示,样式文件(...原创 2019-01-24 11:48:19 · 592 阅读 · 0 评论 -
SpringBoot与servlet
一、servlet,servlet容器Servlet 是一种基于 Java 技术的 Web 组件,用于生成动态内容,由容器管理。类似于其他 Java 技术组件,Servlet 是平台无关的 Java 类组成,并且由 Java Web 服务器加载执行。在以前的servlet规范中,必须放在相应的目录中才可以执行,比如web-inf,而SpringBoot就非常简单,不需要复杂的步骤。Servle...原创 2019-01-24 11:59:01 · 10099 阅读 · 1 评论 -
SpringBoot项目从0开始搭建
SpringBoot并不是新的框架,他默认配置了很多框架的使用方式,就像maven整合了所有的jar包一样,SpringBoot整合了所有的框架,并通过一行简单的main 方法启动应用。一。搭建环境jdk:1.8开发工具:idea二。创建项目选择这种maven创建方式,创建的项目是一个jar包的形式对外输出,也是最快的构建SpringBoot项目的方式。如果没有SpringBoot...原创 2019-01-10 09:34:18 · 1094 阅读 · 0 评论 -
java中的排序算法——基数排序
基数排序原理:将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串和特定 格式的浮点数,所以基数排序也不一定只能用于整数。当数据量很多,而数据值较小时具有效率优势。Java代码如下:运行结果:效率: 在绝大多数的情况下,算法的执行效率为O(N*logN),和快速排序算法相同,与归并排序类似,基数排序 所需要的存储空间是快速排序的两倍时间复杂度循环次数,...原创 2018-10-22 18:34:00 · 257 阅读 · 1 评论 -
java中的排序算法——堆排序
堆排序利用堆这种数据结构设计的一种排序算法。堆是一个近似完全二叉 树的结构,并同时满足堆的性质:子节点的键值或索引总是小于 (或大于)它的父节点。对于大(小)顶堆而言,堆顶元素的权值 大(小)。堆排序是一个非常稳定的算法,对于堆排序而言,数 据的初始顺序对它的复杂度并没有影响。原理:将待排序的数组建堆,然后不断的将堆顶元素与数组中的 后一个元素交换位置,就实现了按照大或小的排序。 代码实现...原创 2018-10-22 18:29:50 · 234 阅读 · 0 评论 -
Java中的各种数据结构和算法的比较
线性表相关:线性表是一种逻辑结构,相同数据类型的N个数据元素的有限序列,除了第一个元素外,每个元素有且仅有一个直接前驱,除了最后一个元素外,每个元素有且仅有一个直接后继。线性表的特点:1.元素个数有限2.逻辑上元素有先后次序3.数据类型相同4.仅讨论元素间的逻辑关系线性表的层次关系:栈和队列是两种操作受限的线性表:栈的插入和删除只能在表尾端进行,即栈顶;队列只能在表尾插入元素,在...原创 2018-10-22 18:24:51 · 1343 阅读 · 0 评论 -
java 8新特性之Lambda表达式
Java8的最大变化是引入了Lambda表达式,Lambda表达式更像是一个匿名方法,增加Lambda表达式是为了让开发者能够编写处理批量数据的并行类库。面向对象编程是对数据进行抽象,函数式编程是对行为抽象。Lambda表达式新增了操作符 “->”。一.参数类型推断看看Lambda表达式的几种写法: Javac可以根据程序的上下文在后台推断出参数的类型,所以Lambda表达...原创 2018-08-23 13:00:58 · 997 阅读 · 0 评论 -
Java 8新特性之流
四.类型推断首先看一下Java 7中引入的目标类型推断,即菱形操作符。在Java 7 中变量list使用了菱形操作符,不用明确声明泛型类型,编译器就可以自己推断出来,而Lambda表达式中的类型推断则是对它的扩展,可以省略表达式中的所有参数类型,但程序依然要经过类型检查来保证运行的安全性,因为编译器可以根据Lambda表达式的上下文信息推断出正确的参数类型。 1.Predicate接口 ...原创 2018-08-23 13:16:53 · 274 阅读 · 0 评论 -
多线程的发展历史及使用场景
一.多线程的发展历史多线程的发展大约经过了三个历史阶段: 1.最早出现的计算机主要是为了解决复杂的计算问题,而早期的计算机只能够接受一些特定的指令,当用户在输入这个指令的时候,计算机才会去工作,如果不输入指令,计算机就不会工作,因为计算机本身不会存储指令,很多情况下,计算机都会处于等待状态,并没有真正利用计算机本身的资源。于是进入了批处理操作系统的演变过程。 2.批处理操作系统:用户把需要...原创 2018-08-27 18:38:15 · 1985 阅读 · 2 评论 -
java中的排序算法——希尔排序
算法二:希尔排序也称作递减增量排序算法,是插入排序的改进版,但希尔排序是非稳定排序算法。 与插入排序的比较:插入排序在对几乎已经排好序的数据进行操作时,效率高,但一般来说是低效的,因为插入排序每次只能将数据移动一位。希尔排序的思想是,先将整个待排序的记录序列分割成若干子序列分别进行插入排序,待整个序列中的记录基本有序时,再对全体记录进行依次直接插入排序。也可以把希尔排序看成是对插入排序的一个...原创 2018-08-28 12:45:00 · 372 阅读 · 0 评论 -
关于i++是不是原子操作的问题
i++是不是原子操作?这个看似简单的问题,实则背后有很深的坑,今天就来踩踩这个坑。 之所以要讨论某个操作是不是原子操作,是因为一旦确认某个操作是原子操作的话,就不用为了去保护这个操作而加上昂贵又要耗费性能的锁。而在单核CPU中,中断只会发生在指令间,可以把能够在一个指令间完成的操作,看成是原子操作。 处理器虽然会自动保证基本的内存操作的原子性,但对于多核CPU的复杂的内存操作,处理器是不能保证...原创 2018-08-31 12:48:38 · 11157 阅读 · 0 评论 -
java中的排序算法——插入排序
Java中的排序算法可以分为内部排序和外部排序,如果数据小,可以在内存中排序,就可以用内部排序;如果数据量大,内存中一次性不能容纳全部的排序记录,就要使用外部排序。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序。 算法一:插入排序 工作原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 代码示例: ...原创 2018-08-24 18:37:49 · 255 阅读 · 0 评论 -
java中的排序算法——选择排序
算法三:选择排序实现步骤:先在未排序序列中找到最大(小)元素,放在排序序列的起始位置,再从剩余未排序元素中继续寻找最大(小)元素,放到已排序序列的末尾,不断重复,直到所有元素排序完成。 Java代码如下: ...原创 2018-08-29 12:41:51 · 248 阅读 · 0 评论 -
java多线程的几种状态
Java线程既可以创建,也可以销毁,所以线程是有生命周期的,而线程的生命周期就可以用线程的六种状态来描述。从Thread类的源码中可以看出线程一共有6种状态:这六种状态分别是: 1. New:初始状态,线程被创建,没有调用start() 2. Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中” 3. Blocked:阻塞,线程进入等待状态,...原创 2018-09-04 13:00:38 · 13090 阅读 · 4 评论 -
Java中是如何实现原子操作的?
原子(atomic)在物理上的定义是,不能被分割的最小的粒子。而在Java中,原子操作指的是不能被中断的一个或一系列操作。那么Java里面是如何实现原子操作的呢?第一个方法是循环CAS先简单说明一下什么是CAS。 CAS即compare and swap,比较并交换。CAS操作包含三个操作数:内存位置(V),预期原值(A),新值(B)。比较和交换就体现在这三个操作数上面,如果内存位置的值...原创 2018-08-30 12:41:06 · 1221 阅读 · 1 评论 -
多线程的几种实现方式
在Java中,有三种方式来实现多线程,分别是:1. 继承Thread类 先看一下Thread类的源码: 从源码可以看出,Thread类本质上是实现了Runnable接口的一个实例,启动线程的唯一方式就是通过Thread类的start()方法,start()方法是个native方法,它会启动一个新的线程,并执行run()方法。用这种方式启动线程,直接用自己的类继承Thread类,...原创 2018-09-02 20:22:32 · 23066 阅读 · 1 评论 -
java中的排序算法——归并排序
归并排序归并是将两个或两个以上的有序表合并成一个新的有序表,可分为多路归并排序、两路归并排序,可用于内排序,也可用于外排序。 原理:先将长度为n的一个有序列表以n/2的长度进行递归分割,直到分割为n个有序列表,每个有序列表的长度为1,再进行两两归并,得到n/2个长度为2的有序列表,进行递归合并后归并成一个长度为n的有序列表。 Java实现的二路归并排序算法代码实现如下: 输出...原创 2018-09-03 12:56:28 · 458 阅读 · 0 评论 -
java线程停止的几种方法
要终止一个线程,并不是简单的调用stop()方法,stop()就像linux中的kill一个线程一样是非常暴力的,虽然在Java的API中仍然可以调用stop()方法,但是和suspend,resume方法一样,是过期了的,不建议使用的,因为stop()在结束一个线程时并不会保证线程的资源正常释放,会导致程序可能会出现一些不确定的状态。 正确终止一个线程的方法有以下几种:一.inte...原创 2018-09-09 18:23:04 · 27893 阅读 · 5 评论 -
线程安全性问题之硬件层面
一.CPU高速缓存线程是CPU调度的最小单元,线程出现的目的是为了更高效的利用CPU的计算处理能力,但是大部分的计算任务并不是仅仅依靠计算机的“计算”就能完成,处理器在读取运算数据,存储运算结果的过程中,还需要与内存进行交互,这个IO操作几乎是不能消除的。由于计算机的存储设备与处理器的计算速度差距非常大,所以现代的计算机都会增加一层读写速度尽可能接近处理器计算速度的高速缓存来作为内存与处理器之...原创 2018-09-09 18:30:08 · 603 阅读 · 0 评论 -
线程安全性问题之JMM内存模型
由于在硬件层面存在缓存一致性问题,而缓存一致性会导致可见性问题,处理器的乱序执行会导致原子性问题,指令重排序会导致有序性问题,可见性(volatile的内存屏障可以解决可见性问题),原子性,有序性(指的是在程序运行的过程中代码的执行顺序和我们的编写顺序是不一致的,这是由于编译器的执行重排序,处理器的指令重排序,内存系统的重排序引起的,因为多个线程访问内存的时候,他们之间是没有顺序的,要做到有序就要...原创 2018-09-12 12:44:51 · 503 阅读 · 0 评论 -
JMM是怎么解决原子性、可见性、有序性问题的?
Java内存模型封装了底层的实现后提供给开发人员一系列和并发处理相关的关键字,,比如volatile、Synchronized、final等,在开发多线程代码的时候,我们可以直接使用 这些关键词来控制并发,从而不需要关心底层的编译器优化、缓存一致性的问题了,所以JMM除了定义了一套规范外,还给开发人员提供了一套在底层封装后的开放的指令。 一.原子性 在java中提供了两个高级的字节码指令moni...原创 2018-09-13 12:33:04 · 2650 阅读 · 0 评论 -
java中各种算法和数据结构的使用场景
一。通用数据结构:数组,链表,树,哈希表通用数据结构通过关键字的值来存储并查找数据,如报表,合同,记录,业绩等数据。通用数据结构可以用速度的快慢来分类,数组和链表是最慢的,树相对较快,哈希表是最快的。请注意,并不是最快的就一定是最好的,因为最快的结构的程序在不同程度上比数组和链表的复杂,而且哈希表要求预先要知道存储多少数据,数据对存储空间的利用率也不是非常高。普通的二叉树对顺序的数据来说,会变成...原创 2018-09-28 12:54:30 · 5879 阅读 · 1 评论 -
报错:Unknown lifecycle phase mybatis-generator-generate
在使用Mybatis自动生成器时,可能出现的错误及解决办法:错误描述:[ERROR] Unknown lifecycle phase "mybatis-generator-generate". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> ...原创 2019-01-10 09:40:01 · 2148 阅读 · 0 评论