目录
一、为什么会有集合?数组不能满足使用吗?
首先Java是面向对象的语言,需要通过对象体现。为了方便对多个对象进行操作,我们需要存储多个对象的容器。
目前学过的容器有StringBuffer和数组。但是StringBuffer的结果是字符串,无法满足全部需求。而数组不能够适应我们变化的需求,因为数组的长度是固定的。这个时候Java就提供了集合。
二、数组和集合的区别
A:长度区别
数组的长度固定
集合的长度可变化
B:内容区别
数组只能存储一种类型的元素
集合可以存储不同类型的元素
C:元素的数据类型区别
数组能存储基础类型和引用类型
集合只能存储引用类型
三、集合
首先,针对不同的存储需求,Java提供了很多集合类。这些集合有共性,但是数据结构(数据的存储方式)的不同。通过提取集合共性,就形成了集合的继承体系。
集合体系图
Collection:集合的顶层接口,它的子体系有重复的,有唯一的,有无序的,有有序的
1)Collection的功能概述:
添加功能:
boolean add(E e) :添加一个指定元素
boolean addAll(Collection<? extends E> c):添加一个集合的元素
删除功能:
void clear() :清除所有元素
boolean remove(Object o) :移除一个元素
boolean removeAll(Collection<?> c):移除一个集合的元素
获取功能:
Iterator<E> iterator() :进行元素的遍历
判断功能:
boolean contains(Object o) :判断集合是否包含指定元素
boolean containsAll(Collection<?> c) :判断是否包含指定的集合元素
boolean isEmpty():判断集合是否为空
长度功能:
int size():元素的个数(集合没有length()方法)
交集功能:
boolean retainAll(Collection<?> c)
把集合转换成数组:
Object[] toArray()
2)Collection接口的实现:
因为Collection是一个接口类,因此不能实例化。所以:
Collection c=new Collection(); 是错误的
那么接口如何实例化呢?通过他的子类的具体实现类进行创建:
Collection c=new ArrayList();
3)Collection集合的高级功能的测试:
boolean addAll(Collection<? extends E> c):添加一个集合的元素
boolean removeAll(Collection<?> c):移除一个集合的元素
只要有一个元素(不必所有)就返回true
boolean containsAll(Collection<?> c) :判断是否包含指定的集合元素
只有包含所有元素,才叫包含,返回true
boolean retainAll(Collection<?> c)
假设有A,B两个集合,A对B做交集,交集的结果保存在A中,B不变,如果A发生了变化则返回true,否则返回false
4)Collection集合的遍历(依次获取集合中元素)
// 创建集合对象
Collection c = new ArrayList();
// 添加元素
c.add("hello"); // Object obj = "hello"; 向上转型
c.add("world");
c.add("java");
// 遍历
// Object[] toArray():把集合转成数组,可以实现集合的遍历
Object[] objs = c.toArray();
for (int x = 0; x < objs.length; x++) {
// System.out.println(objs[x] + "---" + objs[x].length());
//上面的实现不了,原因是objs是一个Object对象,而Object中没有length()方法
// 我们要想使用字符串的方法(输出元素的长度),就必须把元素还原成字符串
// 向下转型(obj->String)
String s = (String) objs[x];
System.out.println(s + "---" + s.length());
}
利用迭代器遍历(集合专用遍历方式)
Collection c=new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
//迭代器遍历
Iterator it=c.iterator();
//判断下一个元素是否存在
while (it.hasNext()) {
System.out.println(it.next());
}
注:boolean hasNext()
如果仍有元素可以迭代,则返回 true。
E next()
返回迭代的下一个元素。
利用for循环改写while,因为效率高
for(Iterator it = c.iterator();it.hasNext();){
System.out.println(it.next());
}
自定义对象的遍历,注意点,迭代器的使用
正确写法:
Collection c=new ArrayList();
Student s1=new Student("花无缺",12);
Student s2=new Student("小鱼儿",14);
Student s3=new Student("小仙女",13);
c.add(s1);
c.add(s2);
c.add(s3);
Iterator it=c.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
易错点:
while(it.hasNext()){
System.out.println(((Student)it.next()).getName()+"--"+((Student)it.next()).getAge());
}
产生的错误:java.util.NoSuchElementException 原因是每一个it.next()都是下一个集合元素,
假如集合元素是奇数个,就会报出这个异常,因此一次循环,不能多次使用it.next()方法,每一次使用都访问下一个对象。
5)集合的使用步骤
A:创建集合对象
B:创建集合元素对象
C:添加元素到集合中
D:遍历集合
a:通过集合对象获取迭代器对象
b:通过迭代器对象的hasNext()方法判断元素是否存在
c:通过迭代器对象的next()方法获取元素并移动到下一个对象