Java - 泛型的理解

做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!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • http://www.jianshu.com/p/7e3e2b898143这是上次写的泛型,当时其实还是一知半解。...
    Richardo92阅读 2,944评论 0 1
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,732评论 0 16
  • 泛型是Java SE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型...
    流氓剑客阅读 1,729评论 0 0
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 8,041评论 3 10
  • 2010.9我(右3)和初中同学(右2) 一起考上了 北方的大学,正在前往城市-哈尔滨。高中好友们都过来机场相送。...
    爱娇阅读 1,625评论 0 2