集合的由来:
我们学习的是面向对象编程,而面向对象语言对事务的表现是通过对象来体现的,为了方便管理对多个对象进行操作,我们就将将这多个对象存储到一个容器当中,在我们目前所有学的知识体现当中,基础到的容器只有数组和StringBuffer,但是呢?StringBuffer的结果是一个字符串,不能满足存储对象的要求,所以我们只能用数组,但是数组的长度是固定的,不可能满足我们灵活多变的需求,这个时候,为了适应程序的开发,Java提供了一种技术。
这种技术叫做:集合
集合和数组的区别?
1.长度区别
数组的长度是固定
集合的长度是可变的
2.内容区别
数组只能存储同一种数据类型的元素
集合存储不同数据类型的元素
3.类型区别
数组既能够存储基本数据类型,也能够存储引用数据类型
集合只能存储引用数据类型
刚说了,集合是可以存储多个元素,但是 存储多个元素我们也可能有不同需求,比如说,我需要存储这个元素的不同内容 怎么办。
Collection:是集合类的顶层接口,他的子体系是有重复的、有唯一的、有排序的、有无序的。
Collection的功能:
添加功能:
c.add(Object obj):添加一个元素
c.addAll(Collection c):添加一个整个集合的元素(放的一个集合对象)
删除功能:
c.clear();清除集合当中的所有元素
c.remove(Object obj):移除指定元素
c.removeAll(Collection c):移除指定的集合元素
判断功能:
c.contains(Object obj):判断集合中是否存在某个元素
c.containsAll(Collection c):判断集合当中是否存储了指定的集合
获取功能:
Interface Iterator(重点)
长度获取
c.size() 获取集合长度
面试题:
数组有么有length()方法? 没有,只有成员变量。
字符串有么有length方法()?有
集合当中有没有length方法?没有
交集功能:
retainAll(Collection c):两个集合,保留进行交集的元素值
将集合转换为数组:
Object [] obj = (Object[])c.toArray();
创建迭代器,因为迭代器是一个接口 所以不能实例化
如果需要实例化则需要通过具体实现子类来完成
而我们的集合就正好有迭代器的具体对象返回 c.iterator();
Iterator it = c.iterator();
我们现在使用的循环次数是不确定,所以it.hasNext()可以判断你这个迭代器里面是不是有更多元素
如果有,就返回true 没有了就不用进行循环 返回的是false
while(it.hasNext()) {
it.next();可以获取迭代器里面的下一个具体元素
//获取的是一个对象的具体地址值 将这个地址值赋值给对应类型进行接收即可
Student s = (Student)it.next();
}
list集合的特点:
有序的(存储的顺序和取出的顺序是一致的),可重复
List的特有功能:
1.添加功能
void add(int index, E element):在列表中指定的位置上插入指定的元素(可选操作)。
2.获取功能
Object get(int index):返回此列表中指定位置的元素。
3.列表迭代器
ListIterator():列表迭代器,很少使用
4.删除功能
Object remove(int index):根据指定索引删除元素
5.修改功能
Object set(int index,Object e):根据指定索引替换指定内容
ConcurrentModificationException:当检测到对象有并发行为时,
不允许修改这个对象时,所触发的异常
List list = new ArrayList();
…
String s = (String)list.get(i);
ArrayList:
底层的数据结构为数组,查询快 增删慢
线程不安全,效率高
LinkedList:
底层的数据结构为链表,查询慢,增删快
线程不安全,效率高
Vector:
底层数据接口是数组,查询快 增删慢
线程安全,效率低
List子类的区别:
List的三个儿子,我们一般使用谁?
查询多:ArrayList / Vector
要安全吗:Vector(即使安全也不用 因为被淘汰)
如果懒得选,就直接用ArrayList 其余几个很少用到
注意:
如果你的变量是Object类型 ,所用的equals方法需要被重写。
因为在object类中的 ,equals方法是对比它们的地址是否相同。