集合和数组一样,都是存储数据的容器
数组定义:相同数据类型的有序集合,只能存储相同类型的数据,有序,支持索引,长度固定
数组特点:
- 一个数组存储相同的数据类型
- 有序,支持索引
- 内存空间连续(查询效率高,增删慢)
- 数组对象一旦创建,长度固定
集合定义:集合只能存储引用数据类型,存储的是引用变量的地址值(存储基本类型实际上就是存储对应的包装类类型)
特点:集合不是一个类或者一个接口,他是一个体系,每个集合底层数据结构实现不一样,特点也不一样。
集合框架分成两大类:
- 单列集合:Collections是单列集合的父接口,一次存储一个数据
- 双列集合:Map集合是双列集合的父接口,一次存储两个数据(key-value),key值唯一。
单列集合Collection接口
常用方法:
- 添加元素 add();
- 删除元素remove();
- 清空容器 clea();
- 获取元素个数 size();等
- list接口及其实现类
list接口特点:支持索引,有序,可以存储重复的元素。
list接口实现类:
- Arraylist:底层采用可变长数组,内存连续,查询速率高,增删慢,线程不同步; 不能在创建new Arraylist()时直接创建出长度为10的数组,而是采用懒加载机制,在第一次add的时候创建;扩容机制,arraylist扩容是新容量是旧容量的1.5倍
- Linkedlist:底层采用双向链表实现,内存不连续,查询速率低,增删快,线程不同步;
- vector:底层采用可变长数组实现,早于Arraylist出现,线程同步,效率低;扩容机制:新容量是旧容量的2倍;
- set接口及其实现类
set接口特点:无序,不支持索引,不能存储重复的元素。
set接口实现类:
- HashSet:是HashMap实现的,底层采用Hash算法,查询效率高,线程不同步; 去重原理:首先通过比较Hashcode方法,如果哈希吗值不一样,直接存储,否则,比较equles方法,如果返回值是flase,则存储该元素,如果返回值是true,则认为容器中存在该元素,不存储; 如果HashMap存储自定义类型对象,一定要重写 类的hashcade和equles方法
- TreeSet:是TreeMap实现的,底层采用红黑树, 要求元素有序, 线程不同步; 用法分为两种: 让元素自身具备比较性,容器存储元素所属的类 实现comparable 接口;从而实现conpareTo方法;如果返回值是 0;不存该元素 ; 也可以让容器具备比较性,创建TreeSet时指定构造器 compator类型的参数,实现其中的compare方法,指定比较规则,该方法返回值为0,不存该元素
- linkedlist:在HashSet集合的基础上 增加了链表支持,成为 有序的HashSet;
双列集合Map接口
map接口特点:
- map集合一次存储一对数据,键值对形式存储(k-v)
- map中的键是唯一的,如果多次存储相同的key,那么value会被覆盖
- map元素无序
- Set接口及其实现类
- HashMap:key和value都可以为null,jdk7及以前,底层采用数组+链表,jdk8及以后,底层采用数组+链表+红黑树,提高数据查询功能
- TreeMap:底层采用红黑树,key值不能为null,元素或者容器需要具备比较性;
用法有两种:
1)让key具备比较性。容器存储元素所属的类实现Comparable接口,从而实现compareTo方法,该方法如果返回值为0,不存该元素。
2)让容器具备比较性。创建TreeMap时指定构造器中的Comparator类型的参数,实现其中的