- 博客(34)
- 资源 (2)
- 收藏
- 关注
原创 volatile为什么不能保证原子性
首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢?可见性可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对...
2018-07-27 14:13:11
54053
82
原创 ClassLoader中的loadClass和findClass方法
Java中ClassLoader的具体实现Java虚拟机的类加载器本身可以满足加载的要求,但是也允许开发者自定义类加载器。jdk中classloader中loadclass方法的实现如下所示:protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundExcep...
2018-07-25 19:44:39
13787
3
原创 单例模式中的double check
单例模式是设计模式中最简单的模式了,它的目的是为了保证一个流程中只有一个对象存在,相当于一个全局变量。1 单例模式的实现创建一个类,调用者不能通过默认构造方法的方式创建实例,而是提供一个接口用来返回唯一的实例。public class SingleInstance{ private static SingleInstance instance = null; p...
2018-07-24 21:05:11
7779
7
原创 Java并发总结
Java并发进程与线程的区别进程是程序的运行过程,引入进程可以使得多个程序并发执行。一个进程下可以包含多个进程,多个线程彼此之间独立,但是共享进程的资源。同步与异步同步是指按照顺序处理资源,当资源被占有时,后续操作需要等待占有结束才能继续运行。异步是指当A程序正在占用资源时,而B也需要对资源进行处理,发送通知给A后可以继续进行其他的操作,当A运行结束时,B再运行。...
2018-07-18 08:13:46
242
原创 Java基础总结
Java基础面向对象的特性封装,将程序实现的细节隐藏起来,公开的方法显示对象的功能。继承,子类继承父类后,具有父类的功能和属性,避免代码重复。多态,父类可以声明子类,运行时依然保持子类的特征。Java与C++的区别1 Java是解释型语言,一次编译到处运行,Java首先需要将代码编译为字节码文件,之后由虚拟机解释执行,C++为编译型语言,则编译时将代码编译为机器...
2018-07-14 20:49:34
269
原创 Java多线程之线程同步
线程安全问题在单线程中不会出现线程安全问题,而多线程编程中,如果多个线程同时操作同一个资源,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,由于每个线程执行的过程是不可控的,比如两个线程同时检查某个文件是否存在,如果存在则文件数+1,不存在则创建新文件,最后产生的结果很可能创建两个新文件,原因就是第一个线程检测到文件不存在时,在创建新文件前,第二个线程也检测到文件...
2018-05-15 21:39:08
222
原创 Java多线程之线程状态转换
一、线程生命周期的五种状态 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。二、线程状态转换...
2018-05-11 12:04:59
189
原创 Java多线程之线程创建与启动
一、线程与进程的区别二、线程的创建与启动1.继承Thread类创建线程类2.实现Runnable接口创建线程类3.使用Callable和Future创建线程三、三种创建方式的对比...
2018-05-08 14:22:45
281
原创 Java中的异常处理
一、Java异常介绍Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。1.Java异常框架Java提供了丰富的异常类,这些异常类之间有严格的继承关系。Java常见的异常类继承关系如下图所示: Throwable为顶层父类,Throwable又派生出Error类和Exc...
2018-05-02 15:11:01
265
原创 排序算法之性能分析及总结
一、排序算法说明排序的定义:对一个无序的序列进行排序的过程。 输入:n个数:a1,a2,a3,…,an。 输出:n个数的排列:a1,a2,a3,…,an,使得a1<=a2<=a3<=…<=an。排序的稳定性:相同值的节点相对位置是否会发生改变。 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定:如果a原本在b的前面,而a=b,排序之后a...
2018-04-25 21:41:34
13581
原创 排序算法之桶排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、桶排序的原理之前介绍的算法都是非线性时间比较类排序,而桶排序是一种线性时间非比较类的排序算法,它是常见排序算法中最快的一种,但是也同时非常耗费空间,是典型的空间换时间的排序算法。桶排序的原理是申请一个数组空间,遍历待排序数...
2018-04-25 16:10:03
827
原创 排序算法之堆排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、堆排序的原理堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆...
2018-04-25 14:45:26
1354
1
原创 排序算法之归并排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、归并排序的原理归并排序利用的是分治的思想实现的,对于给定的一组数据,利用递归与分治技术将数据序列划分成为越来越小的子序列,之后对子序列排序,最后再用递归方法将排好序的子序列合并成为有序序列。合并两个子序列时,需要申请两个子序列...
2018-04-24 21:15:32
11337
2
原创 排序算法之希尔排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、希尔排序的原理希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。它的主要思想是将整个序列分成多个子序列,之后依次对每个子序列进行直接插入排序,经过多次不同的子序列分割并排序后,整个数...
2018-04-24 20:22:53
612
原创 排序算法之快速排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、快速排序的原理快速排序采用了分治的思想,将一个数组分成多个子数组,当子数组满足排序时,整个数组则已经排好序。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再...
2018-04-21 17:30:09
903
原创 排序算法之直接插入排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、直接插入排序的原理插入排序通俗来讲,就是在一组无序的数组中一个个地取出值,将其放在有序的数组中合适的位置,使有序的数组再次有序,直到无序的数组为空,循环结束。三、直接插入排序的实现public class Inser...
2018-04-20 21:18:34
702
原创 排序算法之冒泡排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、冒泡排序的原理冒泡排序需要重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,该数列就已经排序完成。步骤如下所示:比较相邻的元素。如果第一个比第...
2018-04-20 13:51:59
718
原创 排序算法之直接选择排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、直接选择排序的原理选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。三、直接选择排序的实现public...
2018-04-20 13:30:09
1772
原创 数据结构之红黑树及Java实现
一、红黑树的基本介绍红黑树也是一种特殊的二叉查找树,与平衡树相似,它也是为了解决普通二叉查找树的检索效率问题而设计的,红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树并不是真正的平衡二叉树,但在实际应用中,红黑树的统计性能要高于平衡二叉树,但极端性能略差。红黑树在原有排序二叉树的基础上增加了几个特性: (1)每个节点或者是黑色,或者是红色。 (2...
2018-04-20 10:36:11
379
原创 数据结构之平衡二叉树及Java实现
一、平衡二叉树的基本介绍平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法平衡二叉树的常用算法有红黑树、AVL、Treap等。最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量...
2018-04-19 14:49:33
579
1
原创 数据结构之二叉查找树及Java实现
一、二叉查找树的介绍二叉查找树(Binary Search Tree),又被称为二叉搜索树或二叉排序树,是一种特殊的二叉树,利用它可以很方便的对树中节点进行排序和检索。 二叉查找树需要满足以下的性质:若它的左子树不为空,则左子树上的所有节点的值都小于根节点的值若它的右子树不为空,则右子树上的所有节点的值都大于根节点的值它的左、右子树也都是二叉查找树对于二叉查找树,按照中序遍历...
2018-04-18 17:12:41
428
原创 数据结构之二叉树及Java实现
一、二叉树的基本介绍链表、栈以及队列都是线性的数据结构,元素存储起来较为简单,元素只存在一个对一个的关系,而树则是一种更为复杂的数据结构,这种结构元素存在一个对多个的关系,一个父节点可以包括多个子节点。二叉树是一种特殊的树,每个节点最多只有两个子树,而且子树区分是左节点和右节点,次序不能颠倒。 树和二叉树的区别如下所示:树中节点的最大度数没有限制,而二叉树节点的最大度数为2,也就是说最...
2018-04-18 15:34:34
3594
原创 数据结构之队列及Java实现
一、队列的基本介绍队列也是一种特殊的线性表,特点是先进先出,只能在表的一端进行插入,在另一端进行删除。向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue),并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列则称为空队。其一般结构如下所示: 二、队列的Java实现与栈的实现相似,队列也有两种实现方式,分别基于数组和基于链表。...
2018-04-17 20:31:00
324
原创 数据结构之栈及Java实现
一、栈的基本介绍栈是一种只允许在一端进行插入或删除的线性表,也就是说先进后出。栈的操作端通常被称为栈顶,另一端被称为栈底,栈的插入操作称为压栈(push),栈删除操作称为出栈(pop)。压栈是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;出栈则是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 二、栈的Java实现栈的实现方式主要分为两种,一种是基于数组实现的,另一种则是...
2018-04-12 23:00:29
2161
2
原创 数据结构之链表及Java实现
一、链表的基本介绍链表是最基本的数据结构,Java中LinkedList的实现原理就是链表。链表是由多个节点组成的,每个节点只存储数据和下一个节点的位置,这样就可以一级一级地将多个节点串在一起,最后一个节点指向为空,因此链表不需要连续的内存空间,存储是分散的,通过每个节点的地址将各个节点连起来。链表向外暴露的只有一个头节点,通过头节点就可以对整个链表进行操作,链表在进行循环遍历时效率不高,但是...
2018-04-12 14:27:29
315
1
原创 Java中创建对象的几种方法
创建一个对象不是只有通过new操作可以完成,还可以有其他的方法,比如clone(),反射等。但是总的来说,一般归类为四种情况:调用new语句创建对象,也是最常见的一种运用反射手段创建对象调用对象的clone()方法运用序列化手段接下来详细概述这四种情况 1. new语句创建对象new关键字创建对象是最简单最常见的方式,通过这种方式,可以调用任意的构造函数。//...
2018-04-10 13:24:54
1145
原创 Java中Hashtable与HashMap的区别
Java中Map用于保存具有映射关系的数据,Map集合中保存着两组值,一组用来存放key,另外一组用来存放value,key和value为一对一的单向关系,即每个key值对应唯一一个value,其中key值不允许重复。Map接口中定义了如下常用的方法: Map中还包括一个内部类Entry,该类封装了一个key-value对。Entry包含如下三个方法: Map集合最典型的用法就是成对地...
2018-04-08 23:10:46
1624
原创 Java中访问权限简述
封装是面向对象程序设计的三大特征之一,对象的状态信息可以隐藏在对象内部,其他程序无法直接访问,Java通过使用访问控制符来实现对内部信息的访问。Java提供了4个访问控制符,分别为private、protected、public以及默认的default控制符。访问控制级别由小到大分别为private——>default——>protected——>public。四类访...
2018-04-07 17:06:31
690
原创 Java中三大内置注解总结
在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。Java中有三种内置注解,这些注解用来为编译器提供指令。它们是:@Deprecated 已过期,表示方法是不被建议使用的@Override 重写,标识覆盖它的父类的方法@SuppressWarnings 压制警告,抑...
2018-03-30 10:56:54
2601
原创 Java垃圾回收算法
Java语言相对于其他语言最大的一个特点就是引入了垃圾回收机制,这样程序员在编写程序的时候不用再考虑申请或者释放内存,极大的增加了开发者的开发效率。虽然垃圾回收是由JVM虚拟机负责完成的,但了解虚拟机的垃圾回收算法有利于编写更高效的代码。一、如何判断一个对象是否应该被回收1. 引用计数法(Reference Counting)引用计数是垃圾收集器中的早期策略,在这种方法中,堆中...
2018-03-28 21:42:51
282
原创 Java中抽象和接口的联系与区别
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。抽象和接口的联系如下所示:接口和抽象类都不能被实例化,它们都位于继承树的顶端,...
2018-03-24 21:12:50
224
原创 Java中类的加载顺序总结
类的加载顺序如下所示:父类静态对象和静态代码块子类静态对象和静态代码块父类非静态对象和非静态代码块父类构造函数子类非静态对象和非静态代码块子类构造函数 其中1和2中的静态块按照声明顺序依次执行,在类加载到方法区的时候执行的,不需要new类的实例,而且只需执行一次。而非静态代码块是在创建对象时执行,执行顺序为静态块>main()>构造块>构造方法。代码示例...
2018-03-23 10:53:03
232
原创 JVM运行时数据区域划分
运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、Java堆、方法区以及方法区中的运行时常量池程序计数器: 线程私有,是当前线程所执行的字节码的行号指示器,如果线程正执行一个java方法,计数器记录正在执行的虚拟机字节码指令的地址,如果线程正在执行的是Native方法,则计数器值为空;虚拟机栈: 即栈区,线程私有,为虚拟机执行Java方法(字节码)服务,每个方法在执行的时会创建一...
2018-03-22 16:03:47
262
深入理解Android 卷1.pdf
2017-11-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅