集合和泛型知识记录
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的对象的,因为在这个上界之上,无论是什么具体的对象都是都是这个对象的子类,向上转型都是完全匹配的。
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的对象的,因为在这个上界之上,无论是什么具体的对象都是都是这个对象的子类,向上转型都是完全匹配的。
相关文章推荐
- Problem executing commands on Windows over SSH
- Leetcode173: Add and Search Word - Data structure design
- Android之Intent 简介
- CentOS 设置快捷键启动Shell终端
- 安卓系统如何开启和关闭插入耳机时弹出的保护听力对话框
- 用 startActivityForResult 方法启动 Activity 的简单使用
- static_cast与dynamic_cast转换
- C# string.Format谨慎使用
- linux驱动程序调试常用方法
- JavaSript模块规范 - AMD规范与CMD规范介绍
- Ios高级绘图之路径剪切和蒙版
- iOS轮询请求并在图表中动态显示
- 开发工具准备
- 资源文件包 Bundle
- C#时间戳的获取与转换方法
- Sql 语句添加字段、修改字段类型、默认值语法
- CGContext
- ui-router
- Android动画小结
- 关于maven管理下的spring工程路径的问题