Java输出自己(zt)

public class SelfPrint {

public static void main(String args[]) {

char s = 34;

String a = “public class SelfPrint {public static void main(String args[]) {char s = 34; String a = %s;System.out.printf(a, s+a+s);}}//一段打印自身的代码”;

System.out.printf(a, s + a + s);

}

}// 一段打印自身的代码

java程序员的集合使用误区

ArrayList用到底, 其他选择 LinkedList, set, treeset,stack 关键是你要解决什么问题
一直以来, 在没有什么特殊情况下, 只要是元素数量不确定, 必然会用ArrayList. 除了增加了变长的特性外, ArrayList本质上就是个数组.
因此在创建ArrayList时应对其中要存储的对象数量有个估计, 否则经常性的扩容操作和remove带来的下标移位操作会影响程序的性能.
如果需要经常性的删除, 可以考虑hashset. 当然hashset不支持随机访问, 只能通过遍历.所以要根据需求来决定.
Linked***和其他集合的区别基本就是底层实现用链表和数组的区别. 链表和数组的区别请自行翻阅课本.

HashMap不指定size
由于HashMap的实现也是基于数组进行散列, 所以同样存在扩容时的性能问题. 所以尽量要指定合理的大小和factor

鄙视(膜拜)数组
最原始意味着最好或最坏, 每个人的看法都不一样. 数组的局限在于它是定长且只能是一种类型(java中).(当然你可以声明Object数组然后放任何东西, 但相信我, 你很少需要这么做)
通过下标访问数组元素是最快的
如果是频繁的数据访问, 计算(比如位图处理). 建议还是用数组, 最简单最纯粹也最高效.

随意使用concurrent
当发现HashMap存在多线程修改的情况时, 会立刻Map m = Collections.synchronizedMap(new HashMap(…));
实际上很多时候应该在集合操作以外保证并发的情况, 当然这里再加上一道也更稳妥,但能不用就不用
小心集合类的垃圾回收陷阱
集合对象如果没有设置为null的时候, 其中所有的对象即便设置为null都是无法被回收的, 因为集合仍然有该对象的引用.
所以当使用集合对象时 要记得集合中对象的生命周期, 以免造成泄漏.

参考:
深入Java集合学习系列:ArrayList的实现原理-http://zhangshixi.javaeye.com/blog/674856
深入Java集合学习系列:LinkedHashMap的实现原理-http://zhangshixi.javaeye.com/blog/673789
深入Java集合学习系列:LinkedHashSet的实现原理-http://zhangshixi.javaeye.com/blog/673319
深入Java集合学习系列:HashSet的实现原理-http://zhangshixi.javaeye.com/blog/673143
深入Java集合学习系列:HashMap的实现原理-http://zhangshixi.javaeye.com/blog/672697

如何javame调用goo.gl短网址服务

直接上代码:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

import org.json.me.JSONObject;

public class GooglUtils {
private static String GOOGL_API_ENDPOINT=”http://goo.gl/api/shorten?security_token=null&url=”;
public static String shorten(String url) throws Exception{
HttpConnection con = null;
InputStream in = null;
OutputStream out = null;
ByteArrayOutputStream bos = null;
OutputStreamWriter osw = null;
InputStreamReader isr = null;
byte[] request;
int messageLength;

try {
bos = new ByteArrayOutputStream();
osw = new OutputStreamWriter(bos, “UTF-8”);
//            osw.write(url);
osw.flush();

request = bos.toByteArray();
messageLength = request.length;

con = (HttpConnection) Connector.open(GOOGL_API_ENDPOINT+url, Connector.READ_WRITE);
con.setRequestMethod(HttpConnection.POST);
con.setRequestProperty(“Content-Length”, Integer
.toString(messageLength));
con.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded;charset=utf-8″);
out = con.openOutputStream();
out.write(request);
in = con.openInputStream();
isr = new InputStreamReader(in,”UTF-8”);

char[] buf = new char[256];
int rsize = 0;
StringBuffer sb = new StringBuffer();
while((rsize=isr.read(buf))>0){
sb.append(buf,0,rsize);
}
System.out.println(sb.toString());

JSONObject jo = new JSONObject(sb.toString());
String shorturl = (String) jo.get(“short_url”);
System.out.println(shorturl);
return shorturl;

} catch (Exception x) {
throw x;
} finally {
try {
if (con != null)
con.close();
if (in != null)
in.close();
if (out != null)
out.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}

jdepend分析研究

jdepend使用起来还是比较容易的,但是report分析,以及背后的一些事情还是要弄明白的.否则report就真的成了只是report而没有任何实际价值.

使用jdepend的目的
分析包的依赖情况是否满足面向对象的依赖原则.其实面向对象,设计模式变出那么多花样最后无非就是要解决依赖的问题.但很多情况下,我们用了技巧却忘了为什么用,最后便的为了技巧而技巧,为了设计而设计,而忽略了最终目的.
也许这种感觉只有在深刻的体会过”混乱”之后才能理解吧.

如何分析jdepend的report

Abstractness – 抽象度,该包中抽象类所占的比例

Afferent coupling(Ca) – 被依赖度,有的翻译成传入耦合.我觉得传入耦合不是很清楚,很容易让人理解反了.指依赖该包的其他包的总数. 这个值越高说明他应该要么是公用包,要么是抽象(接口)包
Efferent coupling(Ce) – 依从度,有的翻译是传出耦合.指该包依赖于其他包的个数.通常越高表明依赖其他包越严重,如果这个包不是实现包,并不意味着ce就越大越好.依从度应该在一个合理的范围.同时依从的包应该是stable的.

Instability(I) – 不稳定性.公式 ce/(ce+ca).即依从度在所有依赖中的比例.还比较好理解,如果是完全抽象包(ca=N,ce=0),I=0,如果是完全具体实现包(ca=0,ce=N),I=1.

Distance – 指该包和理想情况的最大差距.这个有点绕.举个例子,如果一个包的A=1,也就是完全抽象的.那么他的I应该是=0的,但如果不是(也即是他还要依赖其他更抽象的包).那么distance=Instability-0(理想值).而如果一个包的A=0,即该包完全是实现,那么他的I应该是1,那么distance = 1(理想值)-Instability
而如果0<A<1,那么就不知道他的I的理想值是什么了.这个时候理想值应该是A,distance=|A+I-1|.

参考资料1

java获取昨天的日期

如果不小心还是会栽跟头,看到网上有的人只是roll(Calendar.Date,-1)就了事了。要么就是判断日,月写一大堆。
其实最简单的应该是:

GregorianCalendar cal = new GregorianCalendar();
if(cal.get(Calendar.MONTH)==0 && cal.get(Calendar.DAY_OF_YEAR)==1){
     cal.roll(Calendar.YEAR, -1);
}
cal.roll(Calendar.DAY_OF_YEAR, -1);

不知道是不是最简单的

对Java技术面试非常有用的几本书

Effective Java – 2002年的Jolt大奖,详细讲解了57个平时 不大会深入了解而又非常重要的知识点。作者Joshua Bloch还有一本类似的书 – Java Puzzlers
Effective Enterprise Java – Effective Java的姊妹篇,专注于企业级Java应用的各种蹊跷和最佳实践。
Bitter Java – 从负面学习,在教训和犯错中成长。作者列举了大量的反模式来挑战我们那些被动接受的先入为主。
高质量Java程序设计:2003年的一本书,作者是几个国内的程序员。模仿Effective Java的组织形式,通过35个条款,讲解了一些在实际工作中经常会忽视的问题。
SCEA study guide – 考试用书,如果可能遇到面试=笔试的情况,当然还可以把其他的study guide都拿出来看看。
各种specification,直接到JCP找相应的JSR:

针对特定的工具和领域:推荐 in action 系列,比如hibernate in action, spring in action, lucene in action …

facebook-java-api验证问题

想要用facebook-java-api做一个简单的登录验证并获取用户信息,可是:
用facebook的login页面验证后,居然是自动跳转到app的中定义的callbackUrl(也就是app host的url)。这样就给本地调试带来很大的麻烦,难不成每次做了修改都要发布到host上然后再测试?

how big should the byte array be in java me(j2me)

Keep getting the out of memory error when handling the image file in emulator(wtk) and device(e61i)
Just had a simple test and here is what I found:
The code is simple:
for(int i=1000;i<Integer.MAX_VALUE;i++){
System.out.println(i);
byte[] buf = new byte[i];
}
and see when your program will crash. – Actually it won’t crash, as the OOME(out of memory error), is an Error rather RuntimeException, when the OOME is thrown, the program just go on.

Let’s see the result:
In wtk2.5.2 emulator: the size cannot beyond “2003765” byte(for comparison: we can reserve byte array of size  Integer.MAX_INTEGER/40 – 53687091 in standard version on my laptop).
In e61i: not instrumented yet. My guess is maybe much smaller, as I had experience that OOME thrown when the image size is only 300k, what different is: the byte array CAN take up to that size, however error happened when handling the image(when trying to createImage from byte array).
I followed this thread and the guys found that 400k bytes is the limit on nokia6681.

Another depressing result.

关于java6中scripting engine的invoke和invokeFunction的问题

在java6中加入了对scripts的支持(jsr223),并且捆绑了一种javascript的实现(来自mozilla的rhino)。
但是今天在使用时候发现一个小问题,jdk-6u12和jdk-6u13里的Invocable居然是不兼容的!

在jdk-6u12中是
invokeFunction(String name, Object… args)
而jdk-6u13中是
invoke(String name, Object… args)

在网上发现大多数的写法都是前一种(invokeFunction),搞不清楚为什么会出现这样的问题。但如果这的出现开发环境和部署环境稍有不同岂不是搞的很不爽,明明只是一个很小的问题。却可能造成很奇怪的结果,还要改代码重新编译才行。

解决方法:
1.开发环境和部署环境的jdk版本统一。
2.干脆使用BSF或者BSH。
虽说两种方法和简单直接,但是总觉得因为这么一点点问题而动这么大的干戈真不应该。

Google App Engine Java

http://code.google.com/appengine/docs/java/overview.html