自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第三章 Java内存模型之final域的重排序⑦

这是是一个我们平时不太注意的一个重点知识。写final域的重排序规则禁止把 final 域的写重排序到构造方法之外。这个规则的实现是以下两点:1)JMM 禁止编译器吧 final 域的重写排序到构造函数之外。就是说构造函数里的写操作,必须要在构造函数内完成。2)编译器会在 final 域的写之后,在构造方法 return 返回之前,插入一个 Sto...

2018-11-20 11:18:00 352

原创 第三章 Java内存模型之volatile⑥

接上一章Java内存模型之顺序一致性,我们来了解下volatile。理解volatile特性,一个好方法就是把volatile变量的单个读、写 ,可以看成是使用同一个锁对这些单个读/写进行了同步。class demo{volatile long v1 = 0L;public void set(long l){v1 = l;}public ...

2018-11-19 15:14:00 112 2

原创 第三章 Java内存模型之顺序一致性⑤

接上一章Java内存模型之重排序,我们来了解下顺序一致性。学习完重排序之后,顺序一致性这个概念,也就很好懂了。顺序一致性内存模型是一个理论参考模型,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参考。也就是为行业制定了一系列的标准。一致性分三点来说明:1)数据竞争与顺序一致性2)顺序一致性内存模型3)未同步程序的...

2018-11-19 14:02:00 146

原创 Android系统启动

说起Android的系统启动,真的是很恐怖的一件事,因为里面具体设计的东西很多,但是我们如果不是搞系统开发的是不需要学习那么细致的,我们要做的是了解这个过程,以及过程里的作用。每年Android源码多多少少都有一些变化,如果我们只是记住了细节而不在乎这个整体思想,那么无异于自寻死路,苦恼不已。首先我们大概的了解一下 Android 系统启...

2018-11-18 18:56:00 182

原创 第三章 Java内存模型之重排序

接上一章Java内存模型之基础,我们接着探究Java内存模型。我们在上一章已经接触过重排序了,但是还没有那么透彻,这章重点来说下一下重排序。定义:重排序是编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。我们需要理解这几点:1)数据依赖性2)as-if-serial3)程序顺序规则4)重排序对多线程的影响数据依赖性:如果两...

2018-11-14 19:29:00 167

原创 第三章 Java内存模型之基础

平时我们很少会注意Java内存模型,对于一些概念很多都是背诵,不是甚解,纳闷这一章,将把这个透明层给扯开,让他再也遮不住我们眼睛。首先两个关键问题1)线程之间如何通信2)线程之间是如何同步线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型中,线程之间共享程序的公共状态,通过读-写内存中的公共状态进行隐式通信。在消息传递的并发模型...

2018-11-13 23:21:00 137

原创 第二章:Java并发机制的底层实现原理

这一章应该是很枯燥,很晦涩的一章。总要面对的,不是吗?先来简单的探探路~~1、volatile的应用在并发编程中我们经常会使用synchronize和volatile。volatile是轻量级的synchronize,成本较低。且不会引起线程上下文的切换和调度。volatile的定义与实现原理Java编程语言允许线程访问共享变量,为了确保共享变量...

2018-11-12 19:15:00 287

原创 第一章:并发编程的挑战

我们的认知里,并发编程的目的是为了让程序运行的更快,更能充分利用现在的多核CPU。但是多线程就一定快吗?什么时候应该用多线程呢?这需要面临很多的挑战,也挑战着我们的认知。首先我们要明白一个道理,没有免费的午餐,一切皆有成本。第一个挑战:上下文切换单核处理器也是支持多线程执行的。CPU会给每个线程分配CPU时间片来实现这个机制。这个时间通常很短(通常几...

2018-11-12 13:33:00 168

原创 算法(16)合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。随着做题越来越感觉递归可以让复杂的问题简单话,我们只需要清楚最根本的操作之后,递归帮你做了重复的事情。拨开云雾见本质。我们最基本的操作就是两个节点进行比较,对于值小的进行赋值,然后移到后面的节点,再进行比较。以此类推,直到一个为null。也就是比较...

2018-11-11 21:06:00 209 1

原创 算法(15)翻转链表

题目描述输入一个链表,反转链表后,输出新链表的表头。思路:就是把原节点的next节点当做头结点,然后将头结点的next指向原节点,其实就是互换一下,依次进行,知道把最后一个节点转换成了头结点。新建一个空节点,命名为preNode,然后将pNode节点(原节点)的next节点指向这个前节点,然后将我们自身的地址给这个前节点,我们自身节点往后移动,...

2018-11-08 16:58:00 118

原创 算法(14)链表中倒数第k个结点

题目描述输入一个链表,输出该链表中倒数第k个结点。这道题的难度中等 主要检验鲁棒性。思路:依次存储目前位置 链表的倒数第K个节点。需要注意的是越界,空的处理。 public ListNode FindKthToTail(ListNode head, int k) {//判断 是否为空链表 if (head == null)...

2018-11-08 13:52:00 104

原创 算法(13)调整数组顺序是奇数位于偶数前面

题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:那我们就for循环把奇数放到奇数列表,把偶数放到偶数列表,最后拼接一下奇数和偶数列表,替换一下全数组的内容就可以了。 public static void reOr...

2018-11-08 13:04:00 164

原创 算法(12)数值的整数次方

题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。很简单的一道题,分为两种情况,一种是 平方是正 一种是平方是负数。如果是负数 base 变成它的倒数,平方exponent取反就可以了。 public double Power(double base, int expon...

2018-11-08 12:24:00 121

原创 算法(11)二进制表示中1的个数

题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。借用了Java的系统方法,没啥可以说的。 public static int NumberOf1(int n) { int t=0; char[]ch=Integer.toBinaryString(n).toCharArray(); ...

2018-11-07 17:43:00 410

原创 算法(10)矩形覆盖

题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?看到这个题感觉有点熟悉啊,仔细一想不正是跳台阶的问题吗?一次一个或者两个,这个本质也是啊。一个的相当于竖着的,两个的相当于横着放。具体可以参照跳台阶。递归方法 public static int JumpFloo...

2018-11-07 16:55:00 782

原创 算法(9)疯狂跳台阶

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。这个问题首先看是很难看出来的,那只好自己写写画画找找规律。笨方法:f(1) = 1f(2)= 2f(3)= 4f(4)= 8貌似发现什么了,有时间的同学可以算算f(5),我是数不下去了。分析法:f(n)= f(n-1...

2018-11-07 16:21:00 149

原创 算法(8)跳台阶

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。其实无论哪一种方法思想是一样的f(n) = f(n-1)+f(n-2)我们通过数据可以得出这个公式,这是肉眼法。当然可以通过分析也可得出来结论。比如要跳到 f(10) 在跳到10的前一个情况 可能在f(9) 也可能...

2018-11-07 15:44:00 222

原创 算法(7)斐波那契数列

题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0 n<=39)这是递归思路看的比较简洁 public static int Fibonacci(int n) { if (n < 0) { return 0; } ...

2018-11-06 16:08:00 225

原创 算法(6)旋转数组的最小数字

题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 public int minNumberInRotateArr...

2018-11-05 15:35:00 106

原创 算法(5)用两个栈来实现队列

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 /** * 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 */ Stack<Integer> stack1 = new Stack<Integer>(); ...

2018-11-04 17:46:00 164

原创 算法(4)重建二叉树

题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 /** * 首先拿到这个问题的时候 我也尝试着画出 自己的二叉树来找规律 发现不行 ...

2018-11-04 17:10:00 211

原创 刷题(1)二维数组中的查找

题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 public boolean Find(int target, int[][] array) {//思路 那就先从一个维度走起 比大小 如果小 ...

2018-11-02 18:08:00 114

原创 刷题(2)替换空格

题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 public String replaceSpace(StringBuffer str) {//如果是空的时候 返回 null if(str==null)...

2018-11-02 18:08:00 130

原创 刷题(3)从头到尾打印链表

题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。public class Solution { ArrayList<Integer> arrayList = new ArrayList<>();//这里运用了递归的思想//首先判断 后面是否有next节点 如果有那么进入这个方法的递归...

2018-11-02 18:08:00 131

空空如也

空空如也

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

TA关注的人

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