您的位置:首页 > 其它

集合和泛型知识记录

2015-11-27 15:22 239 查看
每一种容器对数据的存储方式不同。
ArrayList底层使用的数组结构。LinkedList使用链表结构。
ArrayList的特点是查询速度快,增删慢,线程不同步,默认容量10.
LinkedList则增删快,查询慢。
Vector,线程同步。

Set集合的元素无序,并且元素不重复。
HashSet的数据结构是哈希表。HashSet通过元素的两个方法来保证元素唯一性:hashCode()和equals()。如果元素的hashCode()能比较出大小,则不会调用equals(),否则会比较equals()。注意,对于判断元素是否存在以及删除的操作方法,也依赖于这两个参数。
TreeSet可以对Set集合中的元素进行排序,底层数据结构是二叉树,保证元素不相同的依据是compareTo方法,如果return不是0则不相同。
TreeSet有两种方法排序:
一是让元素自身具备可比性,元素所属类实现Comparable接口,覆盖compareTo方法。也成为自然排序
二是使用比较器Comparator,让集合自身具备比较性,在集合初始化时就有了比较方式。

泛型概述
泛型源自JDK1.5新特性,用于解决安全问题,是一个安全机制。
好处:
1,将运行时才出现的问题ClassCastException转移到了编译时期,方便与程序员解决问题,让运行时问题变少。
2,避免了强制转换的麻烦。
通配符
<?>无界通配符
<? extends parents>确定上界
<? super children>确定下界
对于通配符,我被弄得很疑惑,半天都没弄透彻,于是查阅了thinking in java的关于通配符的讲解

public static void main(String[] args) 
{
List<? extends Fruit> flist=new ArrayList<Apple>();
flist.add(new Apple());
flist.add(new Fruit());
}

}

class Fruit

{}

class Apple extends Fruit

{}

class Orange extends Fruit

{}

class Hfs extends Apple

定义一个集合类型的时候这样使用泛型限定是没有意义。
起初我非常迷惑,按字面看上界是Fruit,我理解的意义是只要是Fruit或者其子类都可以作为元素,但事实明显错误。书本上的代码传入了一个为null的元素,编译就没有发生错误。然而书的讲解翻译的十分晦涩。反复读了很多遍,看到? super MyClass的时候终于明白了。不管是上界还是下届,都是指向的在这个范围中一个具体的类,但是这个类编译器并不知道,譬如如果是orange的时候,传入什么显然都不合适,但是List<?
super Fruit> flist=new ArrayList();这样一个语句就可以传入无论Fruit或者Apple的对象的,因为在这个上界之上,无论是什么具体的对象都是都是这个对象的子类,向上转型都是完全匹配的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: