- 博客(39)
- 资源 (7)
- 收藏
- 关注
原创 单例模式
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式有两种实现方式懒汉式和饿汉式,前者可以一般可以由编程语言本身保证多线程环境下不会有并发问题,而后者需要程序员自己加锁实现并发访问。java中其实推荐使用enum来实现单例。
2014-12-04 20:28:42
561
原创 IdentityHashMap和WeakHashMap源码阅读
当比较key和value的时候,IdentityHashMap利用引用相等(==)来代替普通Map利用值相等(equals)。即IdentityHashMap中两个键值k1和k2当k1==k2则认为相等,普通map对象只有(k1==null ? k2==null : k1.equals(k2))才认为相等。 WeakHashMap将键存储在WeakReference中,就是说,如果没有强引用指向键对象的话,这些键就可以被垃圾回收线程回收。值被保存在强引用中。因此,你要确保没有引用从值指向键或者将值也保存在
2014-12-04 15:51:37
655
原创 抽象工厂模式
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。抽象工厂中有多个工厂方法,工厂方法数量一般对象产品种类的数目,来自同一个工厂方法返回的产品一般在一起使用。抽象工厂模式通常用工厂方法模式来实现,也可以Prototype实现。一个具体的工厂通常是Singleton。
2014-12-02 19:35:23
737
原创 工厂方法模式
工厂方法模式定义一个创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。(类创建模式)
2014-11-24 16:30:19
914
原创 EnumMap源码阅读
EnumMap的键值必须是Enum类型,而且put的时候只能是初始化时指定的Enum或者其子类型。同时不支持键值为null。EnumMap初始化会创建存放key和value的两个数组,大小为Enum类型中成员数量,同时会缓存所有Enum类型到key数组。EnumMap迭代保持键值的自然顺序(即枚举类型常量声明的顺序),其实通过Enum内部ordinal()方法实现,vals数组每次插入元素都放插入到key值对应的ordinal()返回的位置。
2014-11-19 20:21:35
981
原创 设计模式概述
面向对象设计的基本原则包括:单一职责原则,开闭原则,里氏替换原则 ,依赖注入原则,接口分离原则,迪米特法则,组合/聚合复用原则。设计模式是为了更好的满足这些设计原则,根据功能分为三类:创建型模式专注于对象创建、结构型模式处理类或对象的组合、行为型模式对类或对象怎样交互和怎么分配职责进行描述。
2014-11-14 11:30:18
991
原创 LinkedHashMap源码阅读
LinkedHashMap继承自HashMap,相关基本操作性能略低于HashMap,由于需要额外代价维护链表。其遍历操作是通过操作该双向链表实现,而非内部散列表数组,因此性能为O(size)比HashMapO(capacity)更高。支持两种顺序遍历:元素插入顺序(重复put不算)和最近使用优先顺序(调用put和get类似LRU),默认是按照元素插入顺序遍历。通过构造函数传入true可以实现最近使用优先遍历,每次put或get操作时,将该元素直接重新放置到链表头结点后面来实现最近使用优先遍历。Link
2014-11-06 19:19:37
1006
原创 HashMap源码阅读
HashMap本身是一个有数组和链表组成的数据结构,其插入和查找元素的消耗可以看成O(1)。默认散列表内部数组大小保证为2的幂次,由于内部采用了位运算代替了传统取模运算来确定元素插入位置。HashMap性能由散列表的容量和装填因子两部分决定,其中装填因子默认是0.75,容量默认是16。Map是独立接口,并非Collection子接口,但是提供三个集合类视图:键集合、值集合、键值对集合。分别对应keySet()、values()、entrySet()三个方法的返回值,这三个集合视图是无状态的,本身依赖Ma
2014-11-05 17:38:06
886
原创 LinkedList源码阅读
LinkedList实现了List和Deque接口,其中Deque是一个双端队列,可以在头部和尾部两端添加和删除元素,因此LinkedList既可以当作先进先出的队列,也可以当作后进先出的栈。LinkedList采用双向链表方式实现,因此插入、删除元素效率比较高,但不支持随机访问。多线程环境下LinkedList不能保证线程安全,因此对其结构修改的操作应当程序员来保证线程安全,其迭代器支持fail-fast,迭代过程中试图发现是否发生修改,若修改了容器则抛出ConcurrentModificationE
2014-11-04 20:06:40
725
原创 Executor框架
Executor和ExecutorService、Executors类方便创建线程池、Callable和Runnable、Future和FutureTask,以及Executor相关类的结构
2014-11-03 15:14:53
776
原创 CopyOnWriteArrayList源码阅读
1. CopyOnWriteArrayList的迭代器保留一个执行底层基础数组的引用,这个数组当前位于迭代器的起始位置,由于基础数组不会被修改(修改都是复制一个新的数组),因此对其同步只需要保证数组内容的可见性。多个线程可以同时对这个容器进行迭代,而不会彼此干扰或者与修改容器的线程互相干扰。不会抛出CocurrentModificationException,并且返回元素与创建迭代器创建时的元素完全一致,不必考虑之后修改操作带来影响。2. 每次修改容器都会复制底层数组,这需要一定开销,特别是容器规模较大。
2014-11-02 19:47:42
806
原创 ArrayList源码阅读
ArrayList实现继承关系java.lang.Object - java.util.AbstractCollection - java.util.AbstractList - java.util.ArrayList实现接口Serializable, Cloneable, Iterable, C
2014-10-30 16:10:53
811
原创 NodeJS学习资料合集
1. 官网 nodejs2. How do I get started with Node.js,stackoverflow提问,收集很多有用的站点3. node-books,github收集很多node相关书籍,可以clone下来4. Nblog,nodejs+express+mongodb实现的博客学习教程,有中文文档5. cnode,中文nodejs学习论坛
2014-08-20 17:59:52
1390
1
原创 深入浅出NodeJS——网络编程
Node提供丰富的网络编程模块包括net、dgram、http和https,分别对应TCP、UDP、HTTP和HTTPS协议。
2014-08-02 21:35:22
1346
原创 深入浅出NodeJS——Buffer
Node中为了应对文件读写,网络I/O处理,数据库访问等,需要高效操作二进制数据,Javascript中自带的字符串类型已远远不能满足要求,因此Buffer对象应运而生。Buffer对象内存分配并不在V8的堆内存而是C++外部内存申请,并在Javascript分配和使用。Buffer支持和String对象之间相互转换,但不是所有字符编码都支持,同时要注意转换过程中Buffer拼接造成的乱码问题。
2014-07-27 20:47:36
1654
原创 深入浅出NodeJS——内存控制
V8虚拟机的内存回收机制,和Java虚拟机类似采用分代回收机制,分为新生代和老生代,当满足一定条件新生代对象会晋级到老生代。利用Node在服务端编程要小心内存泄露问题,一个小的泄露由于大量并发访问可能会导致应用程序的崩溃。
2014-07-27 19:36:30
6095
原创 深入浅出NodeJS——异步I/O
NodeJS的异步I/O原理,涉及底层*nix和windows平台异步I/O实现方式,通常说Node.js是单线程的,但其底层实质是多线程利用多线程来实现异步I/O。
2014-07-19 21:55:19
1722
原创 Redis基本数据类型和相关操作
Redis: Remote Dictionary ServerRedis支持的健值数据类型字符串类型 string散列表类型 hash列表类型 list集合类型 set有序集合类型 zset
2014-03-23 16:53:21
1001
原创 JavaScript权威指南:类和模块(第九章)
JavaScript中类的实现是基于原型继承机制的。若两个类继承自同一个类,则它们是由同一个构造函数创建并初始化的。编程规范:定义构造函数既是定义类,并且类名首字母要大写。JavaScript中的继承构造函数对象:为JavaScript的类定义了名字,任何添加到这个构造函数对象中的属性都是类字段和类方法。原型对象:原型对象的属性被类的所有实例继承实例对象:类的每个实例都是同一个
2014-03-23 16:35:49
799
原创 JavaScript权威指南:函数(第八章)
函数是一段只定义一次,可能被执行或调用任意次的JavaScript代码。JavaScript函数调用会为形参提供实参的值,每次调用还会拥有本次调用的上下文this。若一个函数挂载在一个对象上,作为对象的属性,称为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用的上下文。JavaScript中函数即对象,程序可以任意操控。
2014-03-07 17:19:33
1197
原创 JavaScript权威指南:数组(第七章)
数组是值的有序集合。JavaScript中数组是无类型的:数组元素可以是任意类型。创建数组方法,字面量和构造函数。var count= [1,,3]; //3个元素,中间为undefindevar udefs=[,,,]; //允许有可选逗号作为结尾var a=new Array(10); //大小为10的数组每个数组有一个length属性,区别于常规对象。数组方法
2014-03-06 20:17:24
658
原创 JavaScript中的原型链
JavaScript中的继承机制和传统的面向对象语言如C++和Java等基于类的继承机制不同,JavaScript采用基于原型的继承机制。JavaScript中没有类这样的定义,所有都是对象。每个对象都有一个与之关联的原型对象,每一个对象都从原型继承属性。
2014-03-06 16:19:44
1043
原创 JavaScript权威指南:对象(第六章)
三类JavaScript对象内置对象:由ECMAScript定义的对象或类。例如,数组、函数、日期和正则表达式。宿主对象:由JavaScript解释器所嵌入的宿主环境定义的。如HTMLElement自定义对象:由运行中的JavaScript定义的对象自有属性:直接在对象中定义的属性继承属性:在对象的原型对象中定义的属性1.创建对象(1)、对象直接量var emp
2014-03-06 11:32:02
702
原创 Node.js入门经典-入门
Node.js介绍Node.js是一个事件驱动的 服务器端Javascript环境,专注于网络以及创建网络交互的软件。Node.js的作用回调机制 函数可以作为参数传递到另外一个函数中,然后被调用。同步(阻塞)指代码的执行会在函数返回之前停止,如果某个操作阻塞,脚本将无法继续执行。异步(非阻塞)指基于回调的、允许脚本并行执行操作的方
2014-02-24 15:51:21
1256
翻译 JavaScript Prototype in Plain Language
原文地址 http://javascriptissexy.com/javascript-prototype-in-plain-detailed-language/JavaScript关于Prototype有两个相关的概念1. prototype property. (看作为对象的成员,类成员)每个JavaScript函数(默认为空),可以附属上相关属性和方法在这个prototyp
2014-02-19 15:56:20
727
翻译 JavaScript Objects in Detail
原文 http://javascriptissexy.com/javascript-objects-in-detail/JavaScript核心最常用和最基础的数据类型是Object数据类型。JavaScript拥有一个复杂数据类型Object数据类型和五种简单数据类型Number,Boolean,Undefined,Null。这些简单数据类型是不可变的,但对象是可变的。对象的概念
2014-02-19 10:33:30
996
原创 codecademy.com之JavaScript学习
如何学习javascritpt http://javascriptissexy.com/how-to-learn-javascript-properly/javascript学习站点 http://www.codecademy.com/zh/tracks/javascriptData StructuresArraysObjects创建对象两种方式(1)obj
2014-02-15 15:22:08
1287
原创 linuxcast笔记:linux网络基本配置
一、网络基本linux中以太网命名为:eth0、eth1ifconfig -a 查看所有接口ifconfig eth0ifup eth0 (打开接口0)ifdown eth0 (关闭接口1)setup命令 设置网卡信息相关配置网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0DNS配置文件 /etc/
2014-02-12 16:22:40
675
原创 linuxcast笔记:linux重定向、管道和文本处理工具
一、重定向和管道一、重定向和管道linux中命令基本都实现简单功能,通过将不同命令组合在一起使用达到复杂功能。linux中提供管道和重定向机制来实现多命令协作,管道及重定向就是Linux多命令协作的基础机制Linux的Shell对数据流进行以下分类定义: 名称说明编号默认stdin标准输入
2014-02-12 15:41:34
796
原创 linuxcast笔记:linux基本操作
课程地址:http://itercast.com/library/1/course/8一、linux文件系统结构linux目录结构bin可执行文件(命令)boot引导目录(/boot/vmlinuz-2.6.23.1-10.fc7)dev 硬件设备etc
2014-02-12 11:06:04
705
原创 linuxcast笔记:linux用户权限基础
一、linux用户基础用户限制进程可以使用不可以使用哪些资源每个用户拥有一个userID,操作系统实际使用userID每个用户属于一个主组,属于一个或者多个附属组每个组拥有一个GroupID每个进程以一个用户的身份运行,并接受用户可访问的资源限制每个可登陆用户拥有一个指定的shell用户ID为32位,从0开始,但为了兼容老式系统,ID限制在60000以下用户类型
2014-02-11 22:15:47
671
转载 Integer.valueOf(String) 方法之惑
有个仁兄在 StackOverflow 上发起了一个问题,是这么问的:“ 我被下面的代码搞晕了,为什么它们会返回不同的值?”123System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));System.out.println(Integer
2014-02-11 16:57:58
675
原创 阿里笔试Java初始化
package dian;public class Test { public static int k=0; public static Test t1=new Test("t1"); public static Test t2=new Test("t2"); public static int i=print("i"); public static int n=99;
2013-09-23 08:21:47
1066
原创 锐捷笔试CountDownLatch
public static void main(String[] args) { final CountDownLatch countDown = new CountDownLatch(2); for(int i=0;i<10;i++){ Thread thread=new Thread(new Runnable(){ public void run() {
2013-09-14 15:00:50
536
原创 二叉树常用算法
#include #include #include #define MAX 100typedef struct Node{ int data; struct Node *lchild,*rchild;}BiTNode,*BiTree;void buildTree(BiTree *T){ char ch; scanf("%c",&ch);// printf("%c\n",
2013-09-12 19:21:08
611
关于Servlet API的介绍
2009-06-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人