java
文章平均质量分 83
weiers
逝去了青春至少还留下了代码
展开
-
【数据结构】二叉树
前言数据结构还是大二的时候学过的,当然由于是非计算机专业的学生,所以学的也不怎么样,去年用c++实现了最基本的数据结构,链表/栈/队列/二叉树,三月份看的时候还贴到了博客上。然而当时由于代码量不够,其实写的并不是很好,理解也太不到位。最近在看算法导论,当然最基本的就是数据结构,于是打算将基本的知识在回顾一下。我是一个疯狂的人,一旦决定做一件事,就会全天埋头去干,因为总有一种恨不得赶快学原创 2015-11-13 19:01:51 · 3147 阅读 · 5 评论 -
【数据结构】二叉排序树BST
二叉排序树二叉排序树(Binary Sort Tree)也叫二叉搜索树(Binary Search Tree)二叉排序树本质上还是一个二叉树,只不过在其上定义了一些规则:一个结点的左子树中所有的结点不大于该结点的值,而其右子树中的所有结点不小于该结点的值。由此规则可得BST中序遍历是有序的。BST中定义的操作有:minNode:某个子树中的关键字最小的结点maxNode:某个子原创 2015-11-14 11:20:21 · 2707 阅读 · 0 评论 -
【数据结构】堆
堆这种数据结构。一般堆用来实现优先级队列。优先级队列:和通常的栈和队列一样,只不过里面的每个元素都有一个“优先级”,在处理的时候,首先处理优先级最高的。通常包含三个操作getMax/delMax/insert栈和队列算是优先级队列的特例。使用其他数据结构均不能同时在O(lgn)的复杂度下完成。至少有一种操作要耗时O(n).比如链表的插入操作O(1),但是获取最大值必须遍历链表O(N)。原创 2015-11-12 10:27:37 · 2192 阅读 · 0 评论 -
你真的理解Java的按引用传递吗?
首先我们来看下面这段代码:public class Test1 { String a = "123"; public static void change(Test1 test) { test.a="abc"; } public static void main(String[] args) { Test1 test1=new原创 2015-11-02 10:42:31 · 16994 阅读 · 14 评论 -
读Socket流时产生阻塞的解决方案
在用socket写一个服务器时遇到了问题于是将主要的问题抽了出来,代码如下,由于代码很简单于是也没有注释。public class Main { private static ServerSocket serverSocket; private final static ExecutorService exec = Executors.newFixedThreadPool(30);原创 2015-11-01 08:50:52 · 21408 阅读 · 12 评论 -
【算法】希尔排序
希尔排序希尔排序(Shell Sort)是插入排序的一种更高效的改进版本。他是通过比较相距一定间隔的元素来工作,各趟比较所用距离随着算法的进行而减小,直至只比较相邻元素的最后一趟排序,因此也称递减增量排序算法。直接插入排序在当序列恰好为顺序时,时间消耗为O(n),因此若某个序列已基本有序,直接插入排序的效率就会提高。希尔排序使用一个序列h1,h2...ht的增量序列,只要h1=1,任何原创 2015-11-19 13:18:38 · 1494 阅读 · 0 评论 -
【算法】桶排序
桶排序桶排序(Bucket Sort)假设输入数据服从均匀分布,然后将输入数据均匀地分配到有限数量的桶中,然后对每个桶再分别排序,对每个桶再使用其他的排序算法,最后将每个桶中的数据有序的组合起来。前面了解到基数排序假设输入数据属于一个小区间内的整数,而桶排序则是假设输入是由一个随机过程生成,该过程将元素均匀的分布在一个区间[a,b]上。由于桶排序和计数排序一样均对输入的数据进行了某些假设限制,原创 2015-11-19 13:18:59 · 11226 阅读 · 1 评论 -
java class文件结构
看了一周深入理解java虚拟机了,今天看到第六章,最近一直处在接受新知识的快感之中,不由得感慨基础知识的重要性,学起来相当过瘾!类文件结构这部分实践性较强,对于分析java代码有很重要的帮组,于是有做点笔记的必要了,在参考书的基础上,将一段代码的字节码完全解析了一遍。class文件的结构如下ClassFile { u4 magic; u2 minor_version; u2 majo原创 2015-12-11 17:44:10 · 2291 阅读 · 0 评论 -
JAVA并发编程6_线程协作/生产者-消费者
前面通过同步锁来同步任务的行为,两个任务在交替访问共享资源的时候,可以通过使用同步锁使得任何时候只有一个任务可以访问该资源,见博客:线程同步之synchronized关键字。下面主要讲的是如何使任务彼此间可以协作,使得多个任务可以一起工作去解决木某个问题,因为有些问题中,某些部分必须在其他部分被解决之前解决,就像在餐厅服务员要端菜就必须有厨师做好了菜。在任务协作时,可以让任务自身挂起,直至某些外部原创 2015-08-25 23:06:04 · 2556 阅读 · 0 评论 -
Java NIO传输文件
首先请确保已经学习了Java NIO的基础知识,包括Buffer,Channel文件通道和Socket通道,Selector。关于NIO比起I/O的好处,区别等这里就不说了。具体可以参考后面的参考链接等。这篇博客主要以一个使用NIO传输文件的例子来学习NIO中网络的基本操作传统的监控socket方式存在的问题传统的监控多个socket的Java解决方案是为每个socket创建一个线程并原创 2015-12-01 18:32:21 · 6715 阅读 · 1 评论 -
Unix中的I/O模型和Java NIO
Unix网络编程中的五种I/O模型阻塞式I/0、非阻塞I/O、I/O复用、信号驱动式I/O、异步I/O以一个网络输入为例,一个输入操作通常包括两个不同的阶段:等待数据准备好,将数据从内核拷贝到进程中。具体过程参考下面的图。阻塞式I/O默认情况下的I/O模型都是阻塞式I/O,应用进程从调用recvfrom开始到它返回的整个时间段内都是被阻塞的。此也就是说,应用程序进程原创 2015-12-06 18:47:44 · 2813 阅读 · 1 评论 -
硬盘缓存方案DiskLruCache源码解析
硬盘缓存方案DiskLruCache前面研究了LruCache,它作为现在用的最多的内存缓存方案已经在很多开源缓存框架中使用,同样的还有硬盘缓存方案也就是DiskLruCache。它的大致用法如下存储:DiskLruCache diskLruCache= open(File directory, int appVersion, int valueCount, long maxS原创 2016-02-18 21:00:35 · 5176 阅读 · 0 评论 -
从HashMap到LruCache的源码分析
android的图片加载库Android-Universal-Image-Loader中的缓存策略,内存缓存LruCache,是一个最近最少使用算法LRU。前几天看操作系统也看到了LRU算法,是用在缺页中断发生时,进行置换算法才用的一种。缓存中的LruCache和操作系统中的页置换算法思想是一样的,于是心血来潮,决定把这部分实现看看,然后就有了这篇博客,从HashMap的实现到LinkedHash原创 2016-01-07 00:43:15 · 2938 阅读 · 3 评论 -
简单说Binder(1)
Binder算是Android中比较难懂的一部分内容了,但是非常的重要,要想研究Framework层无论如何也绕不开Binder。网上也有很多讲解Binder的文章,有的很深入涉及到底层C层面,理解起来难度较大,要完全理解还需要Linux驱动的知识,看了还也是似懂非懂,我认为也不需要理解那么深入。写这篇博客主要是我从最学习理解Binder的过程的角度出发,也来谈谈Binder。Binder是什原创 2016-02-20 01:29:12 · 7730 阅读 · 12 评论 -
简单说Binder(2)
几个问题接着上一篇的内容,本片博客讨论几个问题1.跨进程传递IBinder对象的情形2.跨进程回调3.分析Toast的显示过程:跨进程回调的例子跨进程传递IBinder对象的情形会不会觉得传递IBinder有点奇怪呀?Binder机制不是用来做进程间通信的吗,那传递IBinder是为了干啥呢?没错,通信可以是双向的呀,Process A和Process B通信,进程A作为客原创 2016-02-23 20:45:23 · 2351 阅读 · 3 评论 -
【算法】基数排序
计数排序学习基数排序之前首先学习计数排序。计数排序假设每个元素都是在0到k之间的一个整数。基数排序的基本思想,对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的位置,那么直接将元素x放到输出数组中。比如有3小于x的元素,那在输出数组中,x肯定位于第4个位置。计数排序的算法用伪代码描述为:COUNTING-SORT(A,k) // 初始化数组C原创 2015-11-11 15:01:47 · 4294 阅读 · 0 评论 -
【算法】快速排序/数组第K小的元素
快速排序和归并排序一样,也是采用分治(Divide and Conquer)思想。分为三步:分解:将数组A[p...q]划分成两个数组A[p..r-1]和A[r+1..q],使得A[p..r-1]中的每个元素都小于等于A[r],并且A[r+1..q]中所有元素大于等于A[r],A[r]称为主元。解决:递归调用快速排序,对两个子数组进行排序合并:不需要合并操作,子数组采用原址排序,已原创 2015-11-10 23:04:18 · 4931 阅读 · 0 评论 -
JAVA内部类
1.普通的内部类(内部类非static)内部类可以访问外围对象的所有成员,某个外围类对象创建一个内部类对象时,此内部类对象会捕获一个指向外围类的引用。然后在访问外围类的成员时,就是用那个引用来选择外围类的成员。编译器访问不到这个引用就会报错。普通内部类不能有static的属性和方法,若有则要使用嵌套类。class Outer{ public class Inner{ } Inne原创 2015-04-26 22:18:09 · 1115 阅读 · 0 评论 -
JAVA类加载和初始化
Java程序运行由java虚拟机负责。类从加载到虚拟机内存到卸载出内存,包括加载-----链接-----初始化-----使用------卸载链接具体包括:验证-----准备-----解析 加载:由类加载器执行,查找字节码并从这些字节码中创建一个Class对象。链接:验证类中的字节码;为静态域分配存储内存并赋予默认值;解析这个类创建的对其他类的所有引用。初始化:该类具有基类,原创 2015-04-23 22:25:06 · 1942 阅读 · 0 评论 -
JAVA并发编程1_多线程的实现方式
JAVA中创建线程的两种方式:继承Thread或实现Runnable接口。1 继承Thread类,重写run方法:/** * 实现线程的第一种方式 :继承Thread * 实现数据共享需要设置属性为静态 * @author qhyuan1992 * */class MyThread extends Thread{ private int count;// static pu原创 2015-05-14 18:09:57 · 3387 阅读 · 1 评论 -
JAVA 反射
每个类都会有一个Class对象,所有的类都是在首次使用时动态加载到JVM中。类加载器首先会检查该类的Class对象是否已经被加载,如果尚未被夹在。默认的类加载器就会根据类名查找.class文件,然后加载该类到内存。他就用来创建这个类的所有对象。1. Class对象:1.1 获取一个类的Class对象: Class.forName();或使用类字面常量,这样做在编译期会接受检查,不需要捕获异原创 2015-04-29 22:40:06 · 1068 阅读 · 0 评论 -
JAVA并发编程4_线程同步之volatile关键字
上一篇博客JAVA并发编程3_线程同步之synchronized关键字中讲解了JAVA中保证线程同步的关键字synchronized,其实JAVA里面还有个较弱的同步机制volatile。volatile关键字是JAVA中的轻量级的同步机制,用来将变量的更新操作同步到其他线程。从内存可见性的角度来说,写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块。旧原创 2015-05-26 18:08:33 · 1873 阅读 · 0 评论 -
JAVA并发编程2_线程安全&内存模型
”你永远都不知道一个线程何时在运行!“在上一篇博客JAVA并发编程1_多线程的实现方式中后面看到多线程中程序运行结果往往不确定,和我们预期结果不一致。这就是线程的不安全。线程的安全性是非常复杂的,没有任何同步的情况下,多线程的执行顺序是不可预测的。当多个线程访问同一个资源时就会出现线程安全问题。例如有一个银行账户,一个线程往里面打钱,一个线程取钱,要是得到不确定的结果那是多么可怕的事情。引原创 2015-05-15 23:16:42 · 3305 阅读 · 0 评论 -
JAVA并发编程5_线程状态
JAVA线程的可能处于一下几种状态,任意的时间点一个线程只能处于一个状态。1. 新建状态(New):创建后尚未启动的线程处于这种状态。转移时机:创建一个新线程。2. 就绪状态(Runnable):调用了start()方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。转移时机:调用start()方法。处于Running状态的线程被CPU选择执行其他线程。原创 2015-08-25 11:39:50 · 2387 阅读 · 0 评论 -
JAVA并发编程7_线程封闭:ThreadLocal类
多线程访问共享数据时,通常需要同步,一种避免使用同步的方式就是不共享数据。如果仅在单线程里访问数据,那么就不需要使用同步,这种技术被称为线程封闭。Ad-hoc线程封闭:维护线程封闭性的职责完全由程序实现来承担。栈封闭:我的理解就是局部变量,局部变量是线程私有的,不会被共享,也就不存在竞争问题。因此能使用局部变量的地方就不要使用全局变量。ThreadLocal类:一种维护线程封闭性更规范原创 2015-08-26 12:00:48 · 3056 阅读 · 0 评论 -
JAVA并发编程8_线程池的使用
不使用线程池1.串行执行任务class SingleThreadWebServer { public static void main(String[] args) { ServerSocket socket = new ServerSocket(80); while (true) { Socket conn = socket.accept(); handleRequ原创 2015-08-27 16:06:25 · 5203 阅读 · 0 评论 -
JAVA并发编程9_正确关闭线程
Java没有提供任何的安全机制来终止线程,程,虽然Thread.stop和suspend等方法提供了这样的机制,但是存在严重的缺陷,应该避免使用这些方法。 它提供了中断(interrupt),这是一种协作机制,能够使一个线程终止另一个线程当前的工作。 一种协作机制是设置一个“已请求取消(Cancellation Requested)”标志,而任务定期查看该标志。“已请求取消”标志private原创 2015-09-02 00:04:54 · 4378 阅读 · 1 评论 -
Java设计模式-装饰者模式
模拟穿衣服场景我们来看下面一个具体的案例:每个人一天起床之后都要穿衣服(来装饰自己),这是必不可少的,这样问题就来了,穿什么?按照什么顺序穿? 如何用程序方便的模拟这个场景的,代码如下:/*** 程序模拟一个人穿衣服的过程* @author: qhyuan1992*/// 抽象接口,用来规范将要被附加一些操作的对象interface People{ public void we原创 2015-09-06 09:53:13 · 6447 阅读 · 2 评论 -
Java设计模式-代理模式
代理设计模式代理设计模式:为其他对象提供一种代理以控制对这个对象的访问。 所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理设计模式结构类图: 代理模式中类或接口的作用:抽象主题角色(Subject):可以使抽象类也可以是接口,是一个最普通的业务类型定义。声明了具体主题原创 2015-09-11 13:43:23 · 1766 阅读 · 0 评论 -
由一道面试题所想到的--Java实例变量初始化
该题目源自微信公众号(程序员的那些事)的推送:携程 Java 工程师的一道面向对象面试题题目是这样的:求下面程序的输出:public class Base{ private String baseName = "base"; public Base() { callName(); } public void callName() {原创 2015-10-07 09:26:48 · 5674 阅读 · 7 评论 -
【算法】插入排序/冒泡排序/选择排序
插入排序插入排序的思想为:从数组的第二个元素开始遍历整个数组。针对每个元素,依次将其前面的所有元素和他进行比较,大于它的元素均向后移动,最后将该元素插入。插入排序是一种稳定的排序算法。时间复杂度T(n)=O(n^2)最好情况下已排好序,T(n)=O(n)private void swap(int[] a, int i, int j) { int temp = a[j];原创 2015-11-10 20:33:52 · 2482 阅读 · 1 评论 -
【算法】归并排序
归并排序采用分治(Divide and Conquer)思想。主要思想:将数组分成两部分,如果这两部分均有序,那么便可在O(n)的时间内合并成一个完整的有序数组。以此类推将区间划分下去,直到每个区间只有一个元素,即可认为已经有序,然后两两合并。T(n)=T(n/2)+O(n) 其中O(n)是合并两个有序数组产生的。求解递归式可得归并排序的时间复杂度为T(n)=原创 2015-11-10 21:10:47 · 1615 阅读 · 0 评论 -
JAVA并发编程3_线程同步之synchronized关键字
在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题。不安全线程分析public class Test implements Runnable { private int i = 0; private int getNext() { return i++; } @Overri原创 2015-05-20 08:50:54 · 4825 阅读 · 0 评论