做CS61B的homework6,碰到了一个问题,本来想忽视,问了之后才发现是大问题。
前提:
我现在要构造一个size = 100 的哈希表,里面装LinkedList, 然后每个链表用来装发生冲突的,Key相等的类 Entry。
hashTable = new LinkedList<Entry>[sizeEstimate];
是错的。但是如果写,
hashTable = (LinkedList<Entry>[])new LinkedList[sizeEstimate];
这么写就对了。
其中就涉及到 泛型的问题。之前也或多或少碰到过。刚刚仔细查了下,有些收获,总体而言,如下。
Java中的数组必须知道它所持有的确切类型。
然而,对于一个泛型,程序无法获得它的具体的参数类型。
即,**数组是具体化的(reified),而泛型在运行时是被擦除的(erasure)。这句话的意思是数组是在运行时才去判断数组元素的类型约束,而泛型正好相反,在运行时,泛型的类型信息是会被擦除的,只有编译的时候才会对类型进行强化。 **
所以数组和泛型是水火不容的。
那么这个问题有什么解决方法。
方法一就是用 Cast,如我上所说。但也有不好的地方。强制转换对程序影响不好。具体哪里不好我也不懂,那老头这么说的。那就这么说吧。
方法二:用ArrayList 来解决问题。
先说下,ArrayList。目前我的理解。
他是一个List,实现了List的接口,但同时,他又拥有一些Array的特点。
比如,
ArrayList a = new ArrayList<LinkedList<Entry>>();
for (int i = 0; i < 100; i++)
a.add(new LinkedList<Entry>());
就等效于:
hashTable = new LinkedList<Entry>[100]; //ILLEGAL!!违法的
然后,需要在哈希值87处插入元素时,就:
(a.get(87)).add(new Entry());
然后,这个的复杂度只有O(1).也就是,基本实现了数组的特征,可以常数时间内快速定位。实现操作。而且,这个ArrayList 可以动态改变大小。毕竟本质是List.
但同时,他又拥有List的属性,比如, remove(), 等,都是线性的。
有时间可以好好研究下源码。
要做的好多啊。。
最推荐的泛型的一个文章。
http://zddava.iteye.com/blog/352850
下面几个也都还不错。
http://m.blog.csdn.net/blog/bhq2010/12653797
http://www.ibm.com/developerworks/cn/java/j-jtp01255.html
http://blog.csdn.net/eric_sunah/article/details/7262486
**
总结:
Java泛型, ArrayList
**
今天妹子就要考托福了。希望她可以上92.
Anyway, Good luck, Richardo!