Java
文章平均质量分 83
十一月上
ののののののののの
展开
-
ConcurrentHashMap源码详解
成员变量private static final int MAXIMUM_CAPACITY = 1 << 30;private static final int DEFAULT_CAPACITY = 16;static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private static final int ...原创 2018-08-01 16:31:02 · 188 阅读 · 0 评论 -
剑指Offer【21-30】Java实现
21、输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)import java.util.ArrayList;import java.ut...原创 2018-07-19 22:33:20 · 170 阅读 · 0 评论 -
剑指Offer【11-20】Java实现
11、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。public class Solution { public int NumberOf1(int n) { int num = 0; int[] arr = new int[32]; if(n > 0){ arr = getT(n);...原创 2018-07-19 22:27:18 · 155 阅读 · 0 评论 -
剑指Offer【1-10】Java实现
1、在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。public class Solution { public boolean Find(int target, int [][] array) { int i = 0; ...原创 2018-07-19 22:20:30 · 123 阅读 · 0 评论 -
单例模式中的double check
单例模式是设计模式中最简单的模式了,它的目的是为了保证一个流程中只有一个对象存在,相当于一个全局变量。1 单例模式的实现创建一个类,调用者不能通过默认构造方法的方式创建实例,而是提供一个接口用来返回唯一的实例。public class SingleInstance{ private static SingleInstance instance = null; p...原创 2018-07-24 21:05:11 · 7535 阅读 · 7 评论 -
Java并发总结
Java并发进程与线程的区别进程是程序的运行过程,引入进程可以使得多个程序并发执行。一个进程下可以包含多个进程,多个线程彼此之间独立,但是共享进程的资源。同步与异步同步是指按照顺序处理资源,当资源被占有时,后续操作需要等待占有结束才能继续运行。异步是指当A程序正在占用资源时,而B也需要对资源进行处理,发送通知给A后可以继续进行其他的操作,当A运行结束时,B再运行。...原创 2018-07-18 08:13:46 · 180 阅读 · 0 评论 -
Java多线程之线程同步
线程安全问题在单线程中不会出现线程安全问题,而多线程编程中,如果多个线程同时操作同一个资源,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,由于每个线程执行的过程是不可控的,比如两个线程同时检查某个文件是否存在,如果存在则文件数+1,不存在则创建新文件,最后产生的结果很可能创建两个新文件,原因就是第一个线程检测到文件不存在时,在创建新文件前,第二个线程也检测到文件...原创 2018-05-15 21:39:08 · 169 阅读 · 0 评论 -
Java多线程之线程创建与启动
一、线程与进程的区别二、线程的创建与启动1.继承Thread类创建线程类2.实现Runnable接口创建线程类3.使用Callable和Future创建线程三、三种创建方式的对比...原创 2018-05-08 14:22:45 · 213 阅读 · 0 评论 -
Java多线程之线程状态转换
一、线程生命周期的五种状态 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。二、线程状态转换...原创 2018-05-11 12:04:59 · 135 阅读 · 0 评论 -
排序算法之快速排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、快速排序的原理快速排序采用了分治的思想,将一个数组分成多个子数组,当子数组满足排序时,整个数组则已经排好序。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再...原创 2018-04-21 17:30:09 · 823 阅读 · 0 评论 -
剑指Offer【31-40】Java实现
31、求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。public class Solution { public i...原创 2018-07-19 22:39:22 · 155 阅读 · 0 评论 -
ClassLoader中的loadClass和findClass方法
Java中ClassLoader的具体实现Java虚拟机的类加载器本身可以满足加载的要求,但是也允许开发者自定义类加载器。jdk中classloader中loadclass方法的实现如下所示:protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundExcep...原创 2018-07-25 19:44:39 · 13353 阅读 · 3 评论 -
static关键字能修饰什么
static关键字是Java中常用的关键字之一,可能最常用的就是修饰变量和方法了,但是仅仅知道这些还远远不够。问题虽然很小,但是却反映了对Java的了解程度。static修饰变量和方法static可以修饰变量,这个变量属于类本身,不需要创建实例就可以直接获取到值。static可以修饰方法,这个方法属于类本身,同样,不要创建实例就可以通过类调用。需要了解的是,static修饰的变量...原创 2018-07-25 20:17:36 · 22651 阅读 · 0 评论 -
Hashtable源码详解
成员变量private transient Entry<?,?>[] table;//存储链表的数组private transient int count;private int threshold;private float loadFactor;private transient int modCount = 0;private static class...原创 2018-08-01 14:38:23 · 186 阅读 · 0 评论 -
HashMap源码详解
成员变量static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16static final int MAXIMUM_CAPACITY = 1 << 30;// aka 2^30static final float DEFAULT_LOAD_FACTOR = 0.75f;static fina...原创 2018-08-01 13:28:45 · 235 阅读 · 0 评论 -
LinkedList源码详解
成员变量声明private static class Node<E> { E item; Node<E> next; Node<E> prev; //Node是一个双向链表 Node(Node<E> prev, E element, Node<E> next) { this....原创 2018-08-01 12:13:28 · 118 阅读 · 0 评论 -
ArrayList源码详解
成员变量的声明// 成员变量的声明private static final Object[] EMPTY_ELEMENTDATA = {};transient Object[] elementData;//存储元素的数组private static final int DEFAULT_CAPACITY = 10;构造方法初始化//初始数组的大小为传入的initialC...原创 2018-08-01 11:07:09 · 115 阅读 · 0 评论 -
volatile为什么不能保证原子性
首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢?可见性可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对...原创 2018-07-27 14:13:11 · 50620 阅读 · 81 评论 -
多线程中的join方法——源码分析
join方法的作用是等待线程销毁,当主线程中调用了其他线程的join方法时,主线程需要等到该线程执行完毕才可以继续执行,示例如下:public class MyThread extends Thread{ public void run() { try { int value = (int)(Math.random(...原创 2018-07-26 19:01:49 · 724 阅读 · 1 评论 -
对象何时进入老生代
内存分配策略对象的内存分配其实就是在堆上分配,那么细分呢,什么时候在新生代什么时候在老生代都是需要了解的问题。这些问题与虚拟机垃圾回收器有关,但是大多数情况下,对象优先在新生代的Eden区上分配空间,但是也有直接在老生代分配内存的情况。1 对象优先在Eden区分配内存如果Eden区的空间足够大,那么就将新创建的对象放在Eden区,如果Eden区剩余空间不足以放置新的对象了,则会触发一次...原创 2018-07-26 13:37:50 · 1512 阅读 · 0 评论 -
自动装箱和自动拆箱——源码分析
自动装箱和拆箱是Java提供给程序员的语法糖,方便了程序员开发,Java为每种基本数据类型都提供了对应的包装器类型。Integer和int类型变量的相互转换,代码如下所示:Integer i = 1;int j = i;int m = 2;Integer n = m;但是既然是语法糖,那就意味着编译器帮助程序员完成了一些看不到的工作,通过javap反编译可以看到执行指令在自动装箱的...原创 2018-07-25 20:47:05 · 397 阅读 · 0 评论 -
Java基础总结
Java基础面向对象的特性封装,将程序实现的细节隐藏起来,公开的方法显示对象的功能。继承,子类继承父类后,具有父类的功能和属性,避免代码重复。多态,父类可以声明子类,运行时依然保持子类的特征。Java与C++的区别1 Java是解释型语言,一次编译到处运行,Java首先需要将代码编译为字节码文件,之后由虚拟机解释执行,C++为编译型语言,则编译时将代码编译为机器...原创 2018-07-14 20:49:34 · 202 阅读 · 0 评论 -
排序算法之桶排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、桶排序的原理之前介绍的算法都是非线性时间比较类排序,而桶排序是一种线性时间非比较类的排序算法,它是常见排序算法中最快的一种,但是也同时非常耗费空间,是典型的空间换时间的排序算法。桶排序的原理是申请一个数组空间,遍历待排序数...原创 2018-04-25 16:10:03 · 759 阅读 · 0 评论 -
排序算法之堆排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、堆排序的原理堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆...原创 2018-04-25 14:45:26 · 1281 阅读 · 1 评论 -
数据结构之二叉树及Java实现
一、二叉树的基本介绍链表、栈以及队列都是线性的数据结构,元素存储起来较为简单,元素只存在一个对一个的关系,而树则是一种更为复杂的数据结构,这种结构元素存在一个对多个的关系,一个父节点可以包括多个子节点。二叉树是一种特殊的树,每个节点最多只有两个子树,而且子树区分是左节点和右节点,次序不能颠倒。 树和二叉树的区别如下所示:树中节点的最大度数没有限制,而二叉树节点的最大度数为2,也就是说最...原创 2018-04-18 15:34:34 · 3509 阅读 · 0 评论 -
数据结构之队列及Java实现
一、队列的基本介绍队列也是一种特殊的线性表,特点是先进先出,只能在表的一端进行插入,在另一端进行删除。向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue),并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列则称为空队。其一般结构如下所示: 二、队列的Java实现与栈的实现相似,队列也有两种实现方式,分别基于数组和基于链表。...原创 2018-04-17 20:31:00 · 270 阅读 · 0 评论 -
Java中创建对象的几种方法
创建一个对象不是只有通过new操作可以完成,还可以有其他的方法,比如clone(),反射等。但是总的来说,一般归类为四种情况:调用new语句创建对象,也是最常见的一种运用反射手段创建对象调用对象的clone()方法运用序列化手段接下来详细概述这四种情况 1. new语句创建对象new关键字创建对象是最简单最常见的方式,通过这种方式,可以调用任意的构造函数。//...原创 2018-04-10 13:24:54 · 1050 阅读 · 0 评论 -
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 · 1462 阅读 · 0 评论 -
Java中==和equals的区别
在Java中,可以采用两种方式来比较值是否相同,分别为==和equals,他们具有相同之处,也有很大的不同。1. ==比较的是变量的实际内存地址。如果比较的是数据类型,只要他们的值相等,比如两种类型的100和100.0,结果返回为true。如果比较的是同一种类型的对象,则必须该对象变量指向内存的地址必须相同才能返回true,也就是说,两个对象变量需要指向同一块内存区域。2. e...原创 2017-12-31 22:03:08 · 185 阅读 · 0 评论 -
Java中访问权限简述
封装是面向对象程序设计的三大特征之一,对象的状态信息可以隐藏在对象内部,其他程序无法直接访问,Java通过使用访问控制符来实现对内部信息的访问。Java提供了4个访问控制符,分别为private、protected、public以及默认的default控制符。访问控制级别由小到大分别为private——>default——>protected——>public。四类访...原创 2018-04-07 17:06:31 · 575 阅读 · 0 评论 -
Java中抽象和接口的联系与区别
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。抽象和接口的联系如下所示:接口和抽象类都不能被实例化,它们都位于继承树的顶端,...原创 2018-03-24 21:12:50 · 171 阅读 · 0 评论 -
Java中三大内置注解总结
在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。Java中有三种内置注解,这些注解用来为编译器提供指令。它们是:@Deprecated 已过期,表示方法是不被建议使用的@Override 重写,标识覆盖它的父类的方法@SuppressWarnings 压制警告,抑...原创 2018-03-30 10:56:54 · 2444 阅读 · 0 评论 -
Java和C++的区别
Java和C++都是面向对象的语言,都具有面向对象思想的特点,封装、继承和多态。但是相对于C++而言,Java面向对象的思想更加纯粹,因为C++语言兼容了C语言的特点,影响了其面向对象思想的彻底性。 Java和C++存在的差异如下:Java是解释性语言,Java首先将.java文件编译为字节码即class文件,之后利用JVM虚拟机解释,而C++是编译性语言,首先将源代码编译和链接生成机器码...原创 2018-03-19 21:11:53 · 241 阅读 · 0 评论 -
数据结构之链表及Java实现
一、链表的基本介绍链表是最基本的数据结构,Java中LinkedList的实现原理就是链表。链表是由多个节点组成的,每个节点只存储数据和下一个节点的位置,这样就可以一级一级地将多个节点串在一起,最后一个节点指向为空,因此链表不需要连续的内存空间,存储是分散的,通过每个节点的地址将各个节点连起来。链表向外暴露的只有一个头节点,通过头节点就可以对整个链表进行操作,链表在进行循环遍历时效率不高,但是...原创 2018-04-12 14:27:29 · 254 阅读 · 1 评论 -
数据结构之二叉查找树及Java实现
一、二叉查找树的介绍二叉查找树(Binary Search Tree),又被称为二叉搜索树或二叉排序树,是一种特殊的二叉树,利用它可以很方便的对树中节点进行排序和检索。 二叉查找树需要满足以下的性质:若它的左子树不为空,则左子树上的所有节点的值都小于根节点的值若它的右子树不为空,则右子树上的所有节点的值都大于根节点的值它的左、右子树也都是二叉查找树对于二叉查找树,按照中序遍历...原创 2018-04-18 17:12:41 · 347 阅读 · 0 评论 -
数据结构之栈及Java实现
一、栈的基本介绍栈是一种只允许在一端进行插入或删除的线性表,也就是说先进后出。栈的操作端通常被称为栈顶,另一端被称为栈底,栈的插入操作称为压栈(push),栈删除操作称为出栈(pop)。压栈是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;出栈则是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 二、栈的Java实现栈的实现方式主要分为两种,一种是基于数组实现的,另一种则是...原创 2018-04-12 23:00:29 · 2052 阅读 · 2 评论 -
排序算法之直接插入排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、直接插入排序的原理插入排序通俗来讲,就是在一组无序的数组中一个个地取出值,将其放在有序的数组中合适的位置,使有序的数组再次有序,直到无序的数组为空,循环结束。三、直接插入排序的实现public class Inser...原创 2018-04-20 21:18:34 · 635 阅读 · 0 评论 -
排序算法之归并排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、归并排序的原理归并排序利用的是分治的思想实现的,对于给定的一组数据,利用递归与分治技术将数据序列划分成为越来越小的子序列,之后对子序列排序,最后再用递归方法将排好序的子序列合并成为有序序列。合并两个子序列时,需要申请两个子序列...原创 2018-04-24 21:15:32 · 11119 阅读 · 2 评论 -
排序算法之希尔排序及Java实现
一、排序算法的分类选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,希尔排序) 归并排序桶式排序 基数排序 二、希尔排序的原理希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。它的主要思想是将整个序列分成多个子序列,之后依次对每个子序列进行直接插入排序,经过多次不同的子序列分割并排序后,整个数...原创 2018-04-24 20:22:53 · 528 阅读 · 0 评论 -
Java中的异常处理
一、Java异常介绍Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。1.Java异常框架Java提供了丰富的异常类,这些异常类之间有严格的继承关系。Java常见的异常类继承关系如下图所示: Throwable为顶层父类,Throwable又派生出Error类和Exc...原创 2018-05-02 15:11:01 · 173 阅读 · 0 评论