java---容器
J2SDK提供的容器API位于java.util包内。
当我们需要保持一组一样(类型相同)的元素的时候,我们应该使用一个容器来保存,数组就是这样一个容器。
那么,数组的缺点是什么呢?
数组一旦定义,长度将不能再变化。
然而在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。我们将数据结构在Java中实现,于是就有了我们的集合框架。
区分 |
长度 |
存放类型 |
集合类 |
可变 |
引用类型 |
数组 |
固定 |
基本类型+引用类型 |
1136:1个图,1个类,3个知识点,6个接口
1个图
1个类----Collections类
|
区别 |
Collection |
是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法 |
Collections |
是针对集合类的一个包装类,它提供一系列静态方法以实现对各种集合的搜索、排序、线程安全化等操作 |
3个知识点---For、Generic、Auto-bocing/unboxing
自动增强的For
Generic泛型
起因:JDK1.4以前类型不明确
装入集合的类型都被当做Object对待。从而失去自己的实际类型
从集合中取出时往往需要转型,效率低,容易产生错误。
解决办法:在定义集合的时候同时定义集合中对象的类型
好处:增强程序的可读性和稳定性。
Auto-boxing/unboxing
自动打包---自动将基础类型转换为对象
自动解包---自动将对象转换为基础类型
6个接口----Collection、Iterator、Set、List、Comparable、Map接口
Collection接口定义了存取一组对象的方法
容器类对象在调用remove、contains等方法时需要比对对象是否相等,这会涉及到对象类型的equals方法和hashCode方法;对于自定义的类型,需要重写equals和hashCode方法以实现自定义的对象相等规则。
注意:重写equals方法,必须重写hashCode方法。相等的对象应该具有相等的hash Codes。
Iterator接口
所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象
Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
Iterator接口定义了如下方法:
boolean hasNext();
Object next();
void remove();
|
储存形式 |
顺序 |
重复 |
List |
value |
有序 |
可以 |
Set |
value |
无序 |
不可以 |
Map |
Key-value |
|
|
list
|
底层使用 |
优点 |
缺点 |
安全性 |
ArrayList |
数组 |
便于随机访问 |
插入删除比较慢 |
线程不安全 |
LinkedList |
链表 |
快速的插入和删除 |
查询效率低 |
线程不安全 |
Vector |
|
|
|
线程安全 |
Set
|
区别 |
HashSet |
不保证Set的迭代顺序 |
TreeSet |
实现了SortedSet接口,因此TreeSet容器中的元素是有序的。 |
retailAll()交集
addAll()并集
Map接口定义了存储“键-值映射对”的方法
|
相同点 |
不同点 |
||
HashMap |
都可以用来存储key-value |
允许null键/值 |
线程不安全 |
效率高 |
HashTable |
不允许null键/值 |
线程安全 |
效率低 |
|
TreeMap |
不允许null键 |
有序,因为其实现了SortMap |
HashMap类实现的Map集合添加和删除映射关系更高,故建议使用HashMap类实现Map集合。HashMap通过哈希码对其内部的映射关系进行快速查找。
TreeMap中的映射关系存在一定的顺序,如果希望Map集合中的对象也存在一定顺序,应该使用TreeMap类实现Map集合。
Comparable接口
所有可以“排序”的类都实现了java.lang.Comparable接口,Comparale接口中只有一个方法
public int compareTo(Object obj);
该方法返回0,表示this==obj;
返回正数,表示this>obj
返回负数,表示this<obj;
实现了Comparable接口的类通过实现comparaTo方法从而确定该类对象的排序方式。
衡量标准:读的效率和改的效率
Array读快改慢
linked改快读慢
Hash两者之间