自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 Java注解

一、什么是注解(Annotation)我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一些事情,注解是注释的升级版,它可以向编译器、虚拟机等解释说明一些事情。比如我们非常熟悉的@Override就是一种注解,它的作用是告诉编译器它所注解的方法是重写父类的方法,这样编译器就会去检查父类是否存在这个方法,以及这个方法的签名与父类是否相同。注解是描述Java代码的代码,它能够被编译

2017-07-24 23:10:50 437

原创 数据库事务的四大特性

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。一致性(Consistency)  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状

2017-07-21 00:54:12 475

原创 数据库事务隔离级别

Read uncommitted 读未提交脏读:一个事务读到了另一个事务尚未提交的数据脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。举例:公司发工资了,领导把5000元打到singo的账号上,但是该

2017-07-21 00:21:19 378

原创 数据库设计三大范式

范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),

2017-07-20 23:37:49 494

原创 二、计算机网络知识汇总

一、TCP/IP四层模型和OSI七层模型的概念TCP/IP四层模型TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为: 1、应用层:应用程序间

2017-07-19 16:19:08 465

原创 二、Spring知识汇总

Spring简介spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。 Spring总结起来优点如下:低侵入式设计,代码的污染极低。独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。S

2017-07-18 12:29:40 400

原创 Java 笔记2

类修饰符1、内部类可以是静态static的,也可用 public,default,protected 和 private 修饰。 2、与第一条相比,普通类只能由public或默认访问权限修饰符(类名前没有访问权限修饰符)。内部类的作用使用内部类可以给我们带来以下优点:内部类可以很好的实现隐藏(一般的非内部类,是不允许有 private 与 protected 权限的,但内部类可以);内部类拥有外围

2017-07-17 22:52:27 223

原创 面试题38:数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{ 1, 2, 3, 3, 3, 3, 4, 5}和数字3 ,由于3 在这个数组中出现了4 次,因此输出4 。解题思路顺序查找,统计二分查找的递归形式,找出所有的target二分查找: 分别找到第一个target和最后一个target解法3就是利用改进的二分算法:   如何用二分查找算法在数组中找到第一个k,二分查找算法总是先拿数

2017-07-14 22:55:01 388

原创 面试题37:两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点。解题思路第一种:直接法  在第一个链表上顺序遍历每个结点,每遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链表上的结点一样,说明两个链表在这个结点上重合,于是就找到了它们的公共结点。如果第一个链表的长度为m,第二个链表的长度为n,显然该方法的时间复杂度是O(mn) 。第二种:使用栈  所以两个有公共结点而部分重

2017-07-13 11:56:26 325

原创 面试题36:数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7, 5, 6, 4 中, 一共存在5 个逆序对,分别是(7, 6)、(7,5),(7, 4)、(6, 4)和(5, 4)。解题思路第一种:直接求解  顺序扫描整个数组。每扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数

2017-07-13 11:52:10 376

原创 面试题35:第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。解题思路第一种:直接求解:  从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n^2)。第二种:记录法  由于题目与字符出现的次数相关, 我们是不是可以统计每个字符在

2017-07-13 11:35:45 233

原创 JVM内存调优

对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。

2017-07-12 17:38:29 183

原创 内存分配与回收策略

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况也可能直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃

2017-07-12 16:44:07 246

原创 垃圾收集器

上文解释了垃圾收集的算法,本文将会介绍内存回收的具体实现-垃圾收集器。Serial收集器  这是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾手机工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。“Stop the world”,由虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把用户正常工作的线程全部停掉,这对

2017-07-12 15:26:50 271

原创 垃圾收集算法

判定出垃圾对象之后,便可以进行垃圾回收了。下面介绍一些垃圾收集算法,由于垃圾收集算法的实现涉及大量的程序细节,因此这里主要是阐明各算法的实现思想,而不去细论算法的具体实现。标记—清除算法(Mark-Sweep)标记—清除算法是最基础的收集算法,它分为“标记”和“清除”两个阶段:首先标记出所需回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实就是前面的可达性分析算法中判定垃圾对象的标

2017-07-12 13:36:24 383

原创 垃圾对象的判定

引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器都为0的对象就是不可能再被使用的。引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的选择,当Java语言并没有选择这种算法来进行垃圾回收,主要原因是它很难解决对象之间的相互循环引用问题。考虑一种情形:对象objA和objB都有字段instance,赋值令obj

2017-07-12 13:16:54 408

原创 类加载器

一、类与类加载器回顾一下,加载阶段进行的操作: 1、通过一个类的全限定名来获取其定义的二进制字节流。2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3、在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。 加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个j

2017-07-11 16:47:47 367

原创 类加载机制

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示: 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期

2017-07-11 00:16:37 345

原创 面试题34:丑数

题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。例如6、8 都是丑数,但14 不是,它包含因子7。习惯上我们把1 当做第一个丑数。解题思路第一种:逐个判断每个数字是不是丑数的解法,直观但不够高效。/** * 判断一个数是否只有2,3,5因子(丑数)

2017-07-07 17:48:37 603

原创 面试题33:把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则扫描输出这3 个数字能排成的最小数字321323。解题思路:第一种:直观解法先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最大值。第二种:排序解法找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。要确定排序规则,就要比

2017-07-07 15:55:51 348

原创 排序算法总结

希尔排序是不稳定的。 简单选择排序是不稳定的,{2,2,1}。 堆排序是不稳定的。 快速排序是不稳定的。对n较大的排序记录。一般的选择都是时间复杂度为O(nlog2n)的排序方法:快速排序(不稳定)、堆排序(不稳定)或归并排序(稳定)。

2017-07-05 16:44:50 200

原创 排序之冒泡排序

冒泡排序思想在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。代码实现package sort;public class BubbleSort { public static void bubbleSort(int[] data) {

2017-07-05 16:11:04 264

原创 排序之简单选择排序

简单选择排序思想固定了位置来找相应的元素。 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。代码实现package sort;//选择排序:固定位置找元素//插入排序:固定元素找位置public class SimpleSelect

2017-07-05 15:32:23 348

原创 排序之直接插入排序

直接插入排序思想将一个记录插入到已排序好的有序表中,从而得到一个记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。代码实现package sort;public class InsertSort { public static void insertSort(int[] data) { if (data =

2017-07-05 13:49:12 271

原创 Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore。一.CountDownLatch用法  CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLa

2017-07-04 23:31:21 294

原创 Java并发编程:Callable、Future和FutureTask

在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。一.Call

2017-07-04 22:57:26 228

原创 Java并发编程:线程池

ThreadPoolExecutor 深入分析java线程池的实现原理 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:  如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。  那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以

2017-07-03 17:43:16 314

原创 Java并发编程:中断机制

之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点—-中断机制。Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自

2017-07-03 15:55:59 391

原创 Java并发编程:认识线程组

可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。一、线程关联线程组:1级关联所谓1级关联就是父对象中有子对象,但并不创建孙对象。这种情况在开发中很常见,比如创建一些线程时,为了有效对这些线程进行组织管理,通常情况下是创建一个线程组,

2017-07-03 15:28:17 424 1

原创 Java并发编程:同步容器、并发容器和阻塞队列

为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。一.为什么会出现同步容器在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,必须要求程序员手动地在任何访问到这些容器的地方进行同步

2017-07-02 16:51:21 1236

原创 Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资

2017-07-01 23:21:17 365

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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