随笔 - 175  文章 - 202  trackbacks - 0
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

第一个Blog,记录哈哈的生活

常用链接

留言簿(16)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

Java links

搜索

  •  

最新评论

阅读排行榜

评论排行榜

最近一个朋友做猜数字游戏的解法,我也尝试了一下,在做数据生成器的时候,就希望做一个类型无关的,其实这个问题在去迅雷面试的时候就被问到,不过当时想都没想就放弃了,虽然面试当天回来的时候,完成了一下,但结果还是差强人意。所以想借这个机会弄一下。

在记录一条数据(Record)的时候,我本来使用了 List 实例化成 ArrayList,然后开始算,不过借助 JProbe 看了一下,List.size() 和 List.get(i) 这两个方法因为调用次数太多而占用了大部分的时间,所以第一想法是改成数组。

当我 new Record 的时候,使用的是 list ,自然想把这个 List<T> 转换成数组 T[] ,不过非常麻烦的是 list.toArray(T[]) 中的 T[] 不知道如何得到,不知道如何弄到 T[] 的实例,new T[list.size()] 是没办法的。

第一个反应是从 list 或是 List<T> 定义的 class 中得到成员的类型,然后使用 Arrays.newInstance 来创建一个,我花了好长的时间都没有能够得到,后来和同事聊天时,猜测是不是编译完的 class 文件中根本就没有类型的信息,不过当时没能确定。

晚上接着猜数字的时候,旧事重提,google 了一下,看到了一个非常好的文章。
http://www.ibm.com/developerworks/cn/java/j-jtp01255.html
将泛型说明的非常清楚,其中一句是这样的“Java 语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)”。

验证了我的想法,在 class 文件中,根本就没有泛型的信息。

实际上,声明一个泛型数据的方法是

T[] array = (T[])new Object[length];

这样,问题解决,对 Java 泛型的理解增加了一些。
posted on 2007-08-08 00:39 哈哈的日子 阅读(3885) 评论(3)  编辑  收藏 所属分类: Java

FeedBack:
# re: 创建泛型数据的方法,由 List.toArray(T[]) 想到。 2007-08-10 11:20 李敏
能否把那个迅雷面试的题目贴出来一下,想看看,这篇文章看的晕晕的!  回复  更多评论
  
# re: 创建泛型数据的方法,由 List.toArray(T[]) 想到。 2007-08-10 22:48 哈哈的日子
题目就是给定一些值,如 0~9,生成所有这些值的组合,如

1234567890
1234567809
1234567980  回复  更多评论
  
# re: 创建泛型数据的方法,由 List.toArray(T[]) 想到。 2007-08-25 21:24 李敏
无非就是生成没有重复的10位数的一个集合,没有什么难的!

public class Untitled1 {

public static void main(String[] args) {

for (long i = 1000000000L; i < 9999999999L; i++) {
String num = String.valueOf(i);
String[] bit = num.split("");
if (checkNum(bit)) {
System.out.println(num);
}
}

}

public static boolean checkNum(String[] num) {
Set set = new HashSet();
for (int i = 1; i < num.length; i++) {
set.add(String.valueOf(num[i]));
}
if (set.size() != 10) {
return false;
} else {
return true;
}

}
}

这个方法确实有点慢!还得想个好的方法!但是这个题目还真不难,顶多就是效率问题!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: