本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能够适时得销毁,以及如何管理对象和销毁之前必须进行的各种清理动作。

第1条:考虑用静态工厂方法代替构造器

这条感觉就是推荐我们尽量使用静态方法来生成实例对象。

1
2
3
4
public static Boolean valueOf(boolean b)
{

return b?Boolean.TRUE:Boolean.FALSE;
}

推荐的理由如下:

  1. 静态构造方法有自己的名称。(这理由是不是有点。。,个人感觉绝大部分程序猿在创建对象时都是首先尝试new Construct()
  2. 不必在每次调用它们时都创建一个新的对象。(单例中比较常用吧)
  3. 它们可以返回原返回类型的任何子类型的对象。(这个特征的确是比较有优势一点
  4. 在创建参数化类型实例的时候,它们使代码变得更加简洁。

Read More

对于Java枚举我之前所知道的是1

  1. 枚举本身就是一个类。
  2. 它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
  3. 所有枚举值都是public static final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
  4. Enum默认实现了java.lang.Comparable接口。
  5. Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString(),默认返回字符串”Blue”.
  6. Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一般来说应该相对应地重写valueOf方法。
  7. Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值
  8. Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序。

《Effective Java》中写着单例模式推荐的方式是使用单元素的枚举类实现,在查资料过程中竟然发现枚举值里面还能重写枚举的方法:

Read More

喜欢啃鸡爪,喜欢各种做法的鸡爪,包括泡椒凤爪,鸡爪煲,红烧鸡爪等。
咱这次做了一次可乐鸡爪,哈哈

食材

  • 鸡爪:10个
  • 油、料酒、酱油~~~~
  • 生姜、大蒜:适量
  • 八角、香叶:适量
  • 辣椒:一点点就好了
  • 可乐(别太少了,估计3.5元的小瓶装可能不够)

Read More

将自己之前写好的hadoop程序拷贝给师弟时候总是会报下面的错:

1
2
3
4
java.lang.ClassCastException: org.apache.hadoop.fs.LocalFileSystem cannot be cast to org.apache.hadoop.hdfs.DistributedFileSystem
at hadoop.mapreduce.ali.recommend.common.HdfsHelper.<clinit>(HdfsHelper.java:25)
at hadoop.mapreduce.ali.recommend.LogisticRegression.LRProgram.run(LRProgram.java:53)
at hadoop.mapreduce.ali.recommend.LogisticRegression.LRProgram.main(LRProgram.java:23)

字面自已上就是本地文件不能转为分布式文件,自己在输入文件上加hdfs前缀也是无济于事,搜索关键字了半天也没找到匹配的方案,后来终于在一个博客找到了解决方案:

hadoop/conf/下面的core-site.xmlhdfs-site.xml复制到工程文件的/bin/目录下面就可以了(使用的是Eclipse的IDE),坑爹。


本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言

LinkedHashMap是基于HashMap实现的,但是与之不同的是LinkedHashMap在遍历取值时可以保序,这是通过双向链表来实现的。

我们知道HashMap在增删改查方面非常高效,但是遗憾的时候在迭代遍历HashMap时是不保序的,常常我们有时候即需要这种高效的操作,同时还希望在遍历数据集时要保序的需求,所以这个时候LinkedHashMap就出来了,接下来文本讲解LinkedHashMap是如何基于HashMap来完成遍历保序的功能。

Read More

HashSet在针对单个项的增删改几乎具有O(1)的性能,也常常被用于快速查找需要下的集合存储,相信各位这些特性很容易联想到HashMap,那么各位了解这两者的区别和联系不?

看了源代码估计大家会大吃一惊,这,这HashSet不就是HashMap的简化无value版本嘛?对,HashSet就是基于HashMap实现的(通过组合的方式),并且几乎所有方法都是调用了HashMapapi,最大的区别是将HashMapvalue直接用new Object()对象来替换了。所以你可以这么认为:

HashSet<T> hashSet=new HashMap<T,Object>()

Read More

本教程介绍了关于服务声明相关的OSGI服务用法,Eclipse Equinox作为OSGI的服务器使用,本教程使用了Eclipse4.3(Kepler)。

1. 准备

下面的教程假定你已经熟悉OSGI的运行时以及模块层(原文,译文)相关的描述。

2. OSGI服务

2.1. 什么是OSGI服务

一个OSGI的服务被定义为一个标准的Java类或者接口,通常一个Java接口被作为服务的接口来使用。一个bundle可以注册或者使用服务,为了达到此功能,OSGI提供了中心的服务注册表。

一个服务可以被动态的启动和停止,bundle在使用服务时必需有这种操控动态行为的能力,bundle服务可以注册一个监听器来监听服务的启动和停止。

2.2. 定义服务的最佳实践

定义一个服务最通常的方法就是通过一个含有接口的bundle来定义,其他的bundle将会提供这个服务的实现,这就可以允许你通过不同的bundle来改变服务的实现。

Read More

1.OSGI 概述

1.1. 什么是OSGI

OGSI是一种规范,OSGi 规范的核心定义 Java 组件和服务模型,组件和服务可以动态地安装、 激活、 取消激活、 更新以及卸载。软件中的每个组件在OSGI中称为Bundle

OSGi 的一个非常实用的优点是每一个Bundle都必须定义其导出的 Java 包和所需的依赖项。通过这种方式可以有效地控制提供的 API 和插件的依赖项。

1.2. Bundle与插件

插件是Eclipse中的最小模块单元,Bundle与插件几乎是可以互换的,一个插件也是一个OSGI Bundle,反之亦然。

1.3. 实现

OSGI已经有很多实现,例如Equinox, Knopflerfish OSGi or Apache Felix.

1.4. Eclipse的Equinox

Eclipse的Equinox是基于OSGI规范的实现,也这是Eclipse程序的运行时环境,Eclipse的扩展点是基于OSGI的BundleService的概念来进行的。

2. OSGI Bundle和依赖管理

2.1. OSGI Bundle

OSGI规范定义了OSGI Bundle为模块化的单元。
一个Bundle是一个紧密结合的、自包含的单元,它明确定义了对其他模块的依赖关系和服务,同时还定义了对外开放的API。

从技术上讲Bundle是一个带有额外元数据的.jar文件,这个元数据存储在META-INF/MANIFEST.MF中,META-INF/MANIFEST.MF文件是Java规范的一部分,任何非 OSGi 得运行时将忽略 OSGi 的元数据。因此 OSGi Bundle可以不受限制的在非 OSGi Java 环境中使用。

Read More

OSGI

OSGi是Open Services Gateway initiative的缩写,叫做开放服务网关协议。OSGI是用于定义Java动态化组件系统的标准,这些标准通过为大型分布式系统以及嵌入式系统提供一种模块化架构减少了软件的复杂度,基于OSGI比较成功的项目有Equinox,felix,Knopflerfish,关于OSGI的详情参考http://osgi.com.cn/article/7289226,接下来使用OSGI来演示我们最熟悉的Hello world

开发环境

Eclipse4.2.2 (他是基于Equinox实现的,已经自带osgi framework),jre1.7

OSGI服务的创建

首先新建名称为osgiDemoService的一个OSGI项目:File->New->Project->Plug-in Project

Read More

创新工场面试题目

一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序。

此题网上看到别人的做法都说的比较迷糊,好多也都是用快排之类来做的,现在来说一下我的思路:可以将这些字符转为ascii码,小写在前,大小在中间,数字在最后,正好是按ascii倒着排过来,现在已经确认待排序的内容都是在ascii的范围内,所以可以借鉴位排序的方法,申请一个128位的int数组,将每个字符映射到这个数组里面,多个出现在字符累加起来,如果没有出现则置0,最后按顺序输出即可,不需要任何比较。最终整个算法的复杂度为O(N)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
char[] cs={'a','Q','7','b','9','P','a','c','8','O','Q','d','N','2','e','M'};
int[] ascii=new int[128];


for(int i=0;i<cs.length;i++)
{
ascii[cs[i]]+=1;//逐个对应的放入桶中
}

int t=0;
for(int i=97;i<=122;i++)//输出小写字母到cs原数组中
{
for(int j=0;j<ascii[i];j++)
{
cs[t++]=(char)i;
}
}

for(int i=65;i<=90;i++)//输出大小字母
{
for(int j=0;j<ascii[i];j++)
{
cs[t++]=(char)i;
}
}

for(int i=48;i<=57;i++)//输出数字
{
for(int j=0;j<ascii[i];j++)
{
cs[t++]=(char)i;
}
}

for(int i=0;i<cs.length;i++)
{
System.out.print(cs[i]);//最后正真输出
}

本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言