- 博客(31)
- 资源 (1)
- 收藏
- 关注
转载 Java8重新认识HashMap
简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 H
2017-07-21 11:21:14
517
原创 CountDownLatch和CyclicBarrier使用及区别
CountDownLatchCountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这
2017-07-20 14:56:32
1299
原创 快速排序非递归java
private static void quickSort(int[] a, int start, int end) { LinkedList<Integer> stack = new LinkedList<Integer>(); // 用栈模拟 if (start < end) { stack.push(end); s
2017-06-30 13:01:59
2460
1
转载 深入分析java线程池的实现原理
转自占小狼 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处: 1、降低资源消耗; 2、提高响应速度; 3、提高线程的可管理性。Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。 dem
2017-06-27 09:55:37
692
转载 域名解析过程
一、主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。二、本地域名服务器向根域名服务器的查询的迭代
2017-06-26 15:33:34
1484
原创 搭建redis集群
1. 安装redis版本说明 本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。 安装的前提条件: 需要安装gcc:yum install gcc-c++1、下载redis的源码包。 2、解压源码包 tar -zxvf redis-3.0.0.tar.gz 3、Make 4、Make install [root@bogon redis-3.0.0]# m
2017-06-26 11:23:30
493
原创 java生产者和消费者案例
一、同步方法public class TestProductorAndConsumer { public static void main(String[] args) { // TODO Auto-generated method stub Clerk clerk = new Clerk(); Productor pro = new Produ
2017-06-26 11:01:05
420
原创 Juc开启三个线程打印A,B,C
要求开启3个线程,ID分别为A,B,C,每个线程将自己的ID在屏幕上打印10遍,要求输出的结果必须按顺序显示public class TestABCAlternate { public static void main(String[] args) { AlternateDemo ad = new AlternateDemo(); new Thread(new
2017-06-26 10:58:36
1113
转载 Redis面试题及分布式集群
1. 使用Redis有哪些好处?(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,sorted set,hash (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,
2017-06-19 15:20:03
61128
5
转载 大型网站架构之分布式消息队列
大型网站架构之分布式消息队列以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统)。本次分享大纲消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务 常用消息队列 参考(推荐)资料 本次分享总结一、消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性
2017-03-09 08:46:40
398
原创 comparable与comparator的区别
Comparable简介Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。该接口定义如下:package java.lang;import j
2017-03-06 15:45:13
316
原创 java ArrayList遍历时删除元素
for(int i = 0;i<10;i++){ list.add(i); } //第一种删除方式 Iterator<Integer> it = list.iterator(); while(it.hasNext()){ int t = it.next(); it.remove();//通过迭代器来删除元素不会发生Con
2017-02-27 11:03:02
905
原创 java 多种单例模式
单例设计模式Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。(3) 定义一个静态方法返回该类的实例。饿汉式天生就是线程安全的,可以直接用于多线程
2017-02-20 16:26:35
329
翻译 数据库存储过程
首先解释一下什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。优点 ①重复使用。存储过程可以重复使用,从而可以减少
2017-02-20 16:23:19
762
原创 QT QXlsx使用
最近一个项目需要读写excel,但是qt自带的读写方法效率低,经过查询发现可以使用Qxlsx ,是一个非常好的开源软件库。 QXlsx配置方法 首先,下载QtXlsx类,地址:https://github.com/dbzhang800/QtXlsxWriter 1.首先,下载Perl5地址:https://www.perl.org/get.html 下载相应电脑相应的版本 下载好了之
2016-10-25 21:24:30
26644
15
原创 Java Map遍历方法
public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); //第一种:普遍使用,二次取值 Syst
2016-10-12 08:39:04
315
原创 数据库索引
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引
2016-10-07 15:19:06
328
原创 类加载
ClassLoader(类加载器) java将结束生命周期:执行System.exit()程序正常执行结束程序在执行过程中遇到异常或者错误而异常终止由于操作系统出现错误导致java虚拟机进程终止加载:查找并加载类的二进制数据 连接: 验证:确保被加载类的正确性 准备:为类的静态变量分配内存,并将其初始化为默认值 解析:把类(常量池)中的符号引用转换为直接引用 初始化:为类的静态
2016-10-06 21:37:46
337
原创 数据库,部分函数依赖,完全函数依赖,传递函数依赖;1NF,2NF,3NF,BCNF
部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。 举个例子:学生基本信息表R中(学号,身份证号,姓名)当然学号属性取值是唯一的,在R关系中,(学号,身份证号)->(姓名),(学号)->(姓名),(身份证号)->(姓名);所以姓名部分函数依赖与(学号,身份证号);完全函数依赖:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X
2016-10-06 21:22:40
14256
原创 JAVA中方法和变量在继承中的覆盖和隐藏
我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下首先我们来看几个概念:类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量。实例变量:属于类的实例,即对象,通过对象可
2016-10-03 18:37:07
395
转载 java递归,非递归遍历二叉树
import java.util.Stack; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c;
2016-09-28 15:20:21
403
原创 内存泄漏和内存溢出的区别
欢迎使用Markdown编辑器写博客内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。mem
2016-09-26 09:43:58
299
原创 KMP模式匹配算法及改进
KMP算法void get_next(String T,int *next){ int i,j; i = 1; j = 0; next[1] = 0; while(i<T[0]) //T[0]表示串T的长度 { if(j == 0 || T[i] == T[j]) //T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
2016-08-18 21:07:48
681
原创 非递归实现二叉树遍历
借助栈来实现的非递归方式:先序遍历和中序遍历都比较简单,就不解释了。简单解释一下后序遍历,上述二叉树的后序遍历结果是:214538796。将后序遍历结果逆序得到:697835412。即逆后序遍历结果为:697835412。通过观察逆后序遍历结果,可发现,逆后序遍历结果可以通过将前序遍历的遍历顺序的第二步和第三步互换一下即可。即:先遍历根节点,然后遍历右孩子,最后遍历左孩子。//===========
2016-08-16 15:37:33
303
原创 java线程yield(),sleep(),wait()区别
1、sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。 例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优
2016-08-10 16:11:12
363
原创 java基本排序之归并排序
归并排序原理:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2](向上取整),个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。归并排序的一种稳定排序,即相等元素的顺序不会改变. 时间复杂度:归并排序的最好、最坏和平均时间复杂度都是O(nlogn),而空间复杂度是O(
2016-08-09 15:49:38
352
原创 java基本排序之希尔排序
希尔排序将原有大量记录数的记录进行分组。分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,注意只是基本有序,再对全体记录进行一次直接插入排序。 所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间。比如{2,1,3,6,4,7,5,8,9}这样的就可以称为基本有序。 采取跳跃分隔的策略:将相
2016-08-08 08:49:27
325
4
原创 java基本排序之简单选择排序
简单选择排序就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换。通俗来讲就是在排序的时候找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作。复杂度分析 - 最大的特点就是交换移动数据次数相当少,这样就节约了相应的时间。无论最好最差的情况,其比较次数都是一样的多,第i趟排序需要进行n-i次关键字的比较,比较需要n(n-
2016-08-07 10:58:25
287
原创 java基本排序之冒泡排序
冒泡排序是一种交换排序基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。问题:当序列已经基本有序,有很多没有必要的比较,尽管没有交换数据,可是之后的大量比较还是大大多余了,当进行完几次比较,序列已经变得有序,但是循环还没有执行玩,就不需要再继续后面的循环判断了,下面的的代码,增加一个标记变量flag来实现这个功能。public void BubbleSort(int[]
2016-08-06 08:44:41
306
原创 java基本排序算法之直接插入排序
直接插入排序的基本操作是将一个记录插入到已经安排好序的有序表中,从而得到一个新的,记录数增1的有序表时间复杂度最好情况,排序表本身基本有序,时间复杂度为O(n)最坏情况,排序表是逆序,时间复杂度为O(n2)平均情况,时间复杂度为O(n2) public void InsertSort(int[] array) { int j; for(int i =
2016-08-05 10:27:38
425
原创 java基本排序算法之快速排序
快速排序基本思想 快速排序(Quicksort)是对冒泡排序的一种改进。 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。时间复杂度分析最优情况下,快速排序算法的时间复杂度为O(nLogn);最坏情况下,待排序的序列
2016-08-05 10:15:59
453
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人