1、为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常有的一个方式。
2、数组和集合类同是容器,区别?
1.数组虽然可以存储对象,但是长度是固定的,集合长度是可变的。
2.数组中可以存储基本数据类型,集合只能存储对象。
3、集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
4、集合框架的构成以及分类
5、为什么会出现这么多容器?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构
6、集合中存储的都是对象的引用(地址)
7、什么是迭代器?
其实就是集合的取出元素的方式
8、为什么集合取出方式定义在内部?
把取出方式定义在集合内部,这样取出方式就可以直接访问集合内容的元素,那么取出方式就被定义成了内部类,而每一个容器的数据结构不同,所以取出的细节也不一样,但是都有共性内容,判断和取出,那么就可以将共性抽取.
9、对集合使用迭代器的两种循环
Iterator it = list.iterator();
While(it.hasNext()){
//…..
}
//while循环完后迭代器对象还存在于内存,还占用内存空间
//for循环之后it作为局部变量就不存在于内存,不占用内存空间
For(Iterator it = list.iterator();it.hasNext();){
//….
}
Collection:
|------List: 元素是有序的,元素可以重复,因为该集合、体系有索引
|--------ArrayList : 底层使用数组结构
特点: 查询速度快,增删速度慢,线程不同步
|--------LinkedList : 底层使用链表结构
特点: 增删速度很快,查询速度稍慢。
|--------Vector: 底层是数组数据结构,线程同步,被ArrayList替代了
枚举就是Vector特有的取出方式,因为枚举的名称以及方法都过长,所以被迭代器取代了
|------Set : 元素是无序(存入和取出的顺序不一定一致的),元素不可以重复。
|--------HashSet: 底层数据结构是哈希表,线程是非同步的
1. HashSet是通过元素的两个方法: hashCode()与equals(),如果元
素的hashCode值相同,才会判断equals()
2.对于判断元素是否存在,以及删除操作,依赖的是hashCode()和equals()方法
|--------TressSet: 可以对Set集合中的元素进行排序
保证元素唯一性: compareTo方法return 0
TreeSet排序的第一种方式 : 让元素自身具有比较性,元素需要 实现Comparable接口覆盖compareTo方法,这种方式也称为元 素的自然排序,或者叫做默认排序
TreeSet排序的第二种方式: 当元素自身不具备比较性时,或者具备的比较性不是所需要的, 这时就需要让集合自身具备比较性,在集合初始化时,就有了比 较方式
往TreeSet里面存储的元素必须具有比较性,排序时主要条件相同时一定要比较次要条件
|---------Map<K,V>: 该集合存储键值对,一对一往里存,而且要保证键的唯一性
1,添加
Put(K,V);
2,删除
Clear();
3,判断
containsValue(Object value);
containsKey(Object key);
isEmpty();
4,获取
Get(Object key);
Size();
Values();
entrySet();
keyset();
|-------Hashtable: 底层是哈希表数据结果,不可以存入null键null值,线程同步 jdk 1.0
|-------HashMap:底层是哈希表数据结果,可以存入null键null值,线程不同步
Jdk1.2开始,效率高
|-------TreeMap: 底层是二叉树结构,线程不同步,可以用于给map集合中的键进行排序;
和Set很像,其实Set底层就是使用了Map集合
Map集合的两种取出方式
1, Set keySet<k> 将map中所有的键存入到Set集合,因为set具备迭代器,所以可以迭代方式取出所有的键,根据get方法,获取每一键对应的值,Map集合的取出原理: 将map集合转成set集合,在通过迭代器取出
2,Set<Map.Entry<k,v>> entrySet() map集合中的映射关系取出来
|-----ArrayList:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。
增
Add(index,element);
addAll(index,Collection);
删
Remove(index);
改
Set(index,elemet);
查
Get(index)
subList(from,to); //包含头不包含尾
listIterator();
|------LinkedList: 特有方法
addFirst();
addLast();
//获取元素,但不删除元素,抛出异常NoSuchElementException - 如果此列表为空
getFirst();
getLast();
//获取元素,但是元素被删除,抛出异常NoSuchElementException - 如果此列表为空
removeFirst();
removeLast();
在JDK1.6出现了替代方法.
//在此列表的开头插入指定的元素。
offerFirst();
offerLast();
//获取元素,但不删除元素, 此列表的第一个元素;如果此列表为空,则返回 null
peekFirst();
peekLast();
//获取元素,但是元素被删除, 如果此列表为空,则返回 null
pollFirst();
pollLast();
Iterator接口
Ø 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
Ø Iterator对象称为迭代器,用以方便的实现对容器内元素的遍历操作。
Ø Iterator接口定义了如下方法:
Boolean hashNext(); //判断是否有元素没有被遍历
Object next(); //返回游标当前位置的元素并将游标移动到下一位置
Void remove(); //删除游标左面的元素,在执行了next操作之后该操作只能执行一次
List集合特有的迭代器,ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException,,所以,在迭代器时,Iterator方法优先,只能对元素进行判断,取出,删除操作,对List集合迭代时若想其它操作,就只能选用子接口.
泛型
概念: 泛型就是参数化类型,使用广泛的类型
起因:数据类型不明确
--- 装入数据的类型都被当作Object对待,从而”丢失”自己的实际类型。
--- 获取数据时往往需要转型,效率低,容易产生错误。
作用: 安全: 在编译的时候检查类型安全。
省心: 所有的强制转换都是自动和隐式的,提高代码的重用率。
泛型方法 <> 返回类型签名 --- 只能访问对象的信息,不能修改信息
泛型的限定:
? extends E: 可以接收E类型或者E的子类型,上限
? super E: 可以接收E类型或者E的父类型,下限