自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Blog

Keep on going never give up

  • 博客(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

原创 数据结构之B-树、B+树

数据结构之B-树、B+树、B*树

2018-04-20 10:42:24 11183

原创 数据结构之红黑树及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

一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际应用开发需求,书中所涵盖的知识点都是Android应用开发者和系统开发者需要重点掌握的。共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对Android系统架构和源码阅读方法的介绍;第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等进程的工作机制,同时还讨论了Android的启动速度、虚拟机HeapSize的大小调整、Watchdog工作原理等问题;第5章讲解了Android系统中常用的类,包括sp、wp、RefBase、Thread等类,同步类,以及Java中的Handler类和Looper类,掌握这些类的知识后方能在后续的代码分析中做到游刃有余;第6章以MediaServer为切入点,对Android中极为重要的Binder进行了较为全面的分析,深刻揭示了其本质。第7章对Audio系统进行了深入的分析,尤其是AudioTrack、AudioFlinger和AudioPolicyService等的工作原理。第8章深入讲解了Surface系统的实现原理,分析了Surface与Activity之间以及Surface与SurfaceFlinger之间的关系、SurfaceFlinger的工作原理、Surface系统中的帧数据传输以及LayerBuffer的工作流程。第9章对Vold和Rild的原理和机制进行了深入的分析,同时还探讨了Phone设计优化的问题;第10章分析了多媒体系统中MediaScanner的工作原理。适合有一定基础的Android应用开发工程师和系统工程师阅读。通过对本书的学习,大家将能更深刻地理解Android系统,从而自如应对实际开发中遇到的难题

2017-11-16

Android API

Android API 文档

2017-08-23

空空如也

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

TA关注的人

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