MXOXW

Life always finds a way.

NodeJS 模块修改

| Comments

##HEXO
###新建博客时,将中文标题转换为拼音
/node_modules/hexo/lib/plugins/console/new.js
修改部分如下

1
2
3
4
5
6
7
8
9
10
var tr = require('transliteration');

var data = {
title: args._.pop(),
layout: args._.length ? args._[0] : this.config.default_layout,
slug: args.s || args.slug,
path: args.p || args.path
};
// 中文标题转换为拼音
data.slug = tr.slugify(data.title);

JavaScript 权威指南总结

| Comments

##二进制浮点数和四舍五入错误

JavaScript采用了IEEE-754浮点数表示法(几乎所有现代编程语言所采用),这是一种二进制表示法,可以精确地表示分数,比如1/2、1/8和1/1024。遗憾的是,我们常用的分数(特别是在金融计算方面)都是十进制分数1/10、1/100等。二进制浮点数表示法并不能精确表示类似0.1这样简单的数字。

1
2
3
4
5
var x = .3 - .2;        // 30美分减去20美分
var y = .2 - .1; // 20美分减去10美分
x == y // => false:两值不相等!
x == .1 // => false: .3-.2 不等于 .1
y == .1 // => true: .2-.1 等于 .1

JavaScript的未来版本或许会支持十进制数字类型以避免这些舍入问题。在这之前你可能更愿意使用大整数进行重要的金融计算,例如,要使用整数“分”而不要使用小数“元”进行基于货币单位的运算。

Java集合类详解

| Comments

##集合类说明及区别
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set

Map
├Hashtable
├HashMap
└WeakHashMap

##Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。

如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

1
2
3
4
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
  Object obj = it.next(); // 得到下一个元素
}

  由Collection接口派生的两个接口是List和Set。

##List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

和下面要提到的Set不同,List允许有相同的元素。

除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

Java Classloader

| Comments

Java类加载器(英语:Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。学习类加载器时,掌握Java的委派概念很重要。

每个Java类必须由某个类加载器装入到内存。Java程序可以利用外部库(即由其他作者编写的软件库)。

JVM中有3个默认的类加载器:

  • 引导(Bootstrap)类加载器。由原生代码(如C语言)编写,不继承自java.lang.ClassLoader。负责加载核心Java库,存储在<JAVA_HOME>/jre/lib目录中。
  • 扩展(Extensions)类加载器。用来在<JAVA_HOME>/jre/lib/ext,或java.ext.dirs中指明的目录中加载 Java的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。该类由sun.misc.Launcher$ExtClassLoader实现。
  • Apps类加载器(也称系统类加载器)。根据 Java应用程序的类路径(java.class.path或CLASSPATH环境变量)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。该类由sun.misc.Launcher$AppClassLoader实现。
    每个类装载器有一个父装载器(parent class loader)。

##User-defined class loaders
可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求而不需要完全了解Java虚拟机的类加载的细节。

可用于:

  • 运行时装载或卸载类。这常用于:
    • 实现脚本语言
    • 用于bean生成器
    • 允许用户定义的扩展性
    • 允许命名空间之间的通信。这是CORBA / RMI协议的基础。
  • 改变Java字节码的装入,例如,可用于Java类字节码的加密装入。
  • 修改已装入的字节码(weaving of aspects when using aspect-oriented programming).

Javascript Public And Private Properties And Methods

| Comments

与java等基于类的面向对象语言的private、protected、public等关键字的用途类似,基于对象的JavaScript语言,在对象构造上也存在类似的成员可见性问题。
JavaScript对象构造的可见性定义可以分为以下几种:

##私有属性(private properties)
  
  通过var关键字定义对象构造中变量的作用域,该变量只能在对象构造方法的作用域内被访问。如:

1
2
3
4
5
6
function VariableTest() 
{
var myVariable;//private
}
var vt = new VariableTest();
vt.myVariable;//这里会出现undefined异常

##私有方法(private methods)
  与私有属性类似,只能在对象构造方法作用域内被访问。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
function MethodTest() {
var myMethod = function() //private
{
alert("private method");
}
this.invoke = function() {
//能够访问到myMethod
myMehtod();
}
}
var mt = new MethodTest();
mt.myMethod(); //错误。使用trycatch的话,可捕获“对象不支持此属性或方法”异常
mt.invoke();

##公共属性(public properties)
  有两种定义公共属性的途径:
  (1)通过this关键字来定义。如:

1
2
3
4
5
function PrivilegedVariable() {
this.variable = "privileged variable";
}
var pv = new PrivilegedVariable();
pv.variable; //返回 "privileged variable"

(2)通过构造方法的原型来定义。如:

1
2
3
4
function PublicVariable() {}
PublicVariable.prototype.variable = "public variable";
var pv = new PublicVariable();
pv.variable; //返回"public variable"