集合基础1_集合概述以及Collection集合
1.为什么会出现集合?
我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。
而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,有哪些是容器类型的呢?
数组和StringBuffer。但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。
而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。
2.数组和集合的区别?
A:长度区别
数组的长度固定
集合长度可变
B:内容不同
数组存储的是同一种类型的元素
而集合可以存储不同类型的元素
C:元素的数据类型问题
数组可以存储基本数据类型,也可以存储引用数据类型
集合只能存储引用类型
3.java集合以及体系
4.Collection类
(1).Collection类的概述
Collection:是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。
(2).Collection类的常用功能
A:添加功能
boolean add(Object obj):添加一个元素
boolean addAll(Collection c):添加一个集合的元素
B:删除功能
void clear():移除所有元素
boolean remove(Object o):移除一个元素(移除指定元素)
boolean removeAll(Collection c):移除一个集合的元素(只要有一个元素被移除了,那么就返回true)
C:判断功能
boolean contains(Object o):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(必须要包含全部)
boolean isEmpty():判断集合是否为空
D:获取功能
Iterator<E> iterator()(重点):迭代器,集合遍历的特有方式
E next():获取元素,并移动到下一个位置。
boolean hasNext():是否还有下一个元素
E:长度功能
int size():元素的个数
面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
F:交集功能
boolean retainAll(Collection c):两个集合都有的元素,获取俩个集合的交集,谁调用该方法,那么元素就会跑去那一个集合中。
也就是说集合A和集合B做交集,最终结果保存在A中,B集合内容不变,返回值表示的是A集合中
的内容是否发生过改变。
G:把集合转换为数组
Object[] toArray():集合转化为素组,这样可以实现对集合的遍历
(3).基本功能测试
public static void main(String[] args) {
//创建Collection对象,由于Collection是一个接口,所以是不能够实例化的,所以能够使用其子类对象
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
c.add("java");
//清空集合
//c.clear();
//移除指定元素
//c.remove("hello");
//判断是否包含指定元素
c.contains("hello");
//判断集合是否为空
c.isEmpty();
//获取元素个数
c.size();
}
(4).Collection集合并遍历对象(迭代器)
public static void main(String[] args) {
//创建Collection对象,由于Collection是一个接口,所以是不能够实例化的,所以能够使用其子类对象
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
c.add("java");
//lterator是一个接口,实际返回的是它的子类对象
//注意,由于next在调用一次之后,就会移动到下一个对象上面去,所以不要多次的调用next()方法
Iterator lt = c.iterator();
while(lt.hasNext()){
String str = (String) lt.next();
System.out.println(str);
}
System.out.println("--------------------------");
//使用for循环同样可以获得相同的效果,同时lt1在循环完毕就是垃圾,可以提高一点效率
for(Iterator lt1 = c.iterator();lt1.hasNext();){
String str = (String) lt1.next();
System.out.println(str);
}
}
(5).迭代器原理
A:迭代器是依赖于集合而存在的。
B:迭代器为什么不定已成为一个类,而是定义成为一个接口?
假设迭代器定义的是一个类,这样,我们就可以创建该类的对象,并调用该类的方法来实现集合的遍历。但是呢?我们应该思考一个这
样的问题。由于java中提供了很多的集合类。而这一些集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不一样的。
进而他们的遍历方式也应该是不一样的,最终就没有定义迭代器类。
而无论你是哪一种集合,都应该具备获取元素的操作,并且,最好在辅助有判断功能,这样在获取前,先判断。这样就不会容易出错。
也就是说判断和获取功能是每一个集合遍历的时候锁具备的。而每一种集合的方式又不太一样,所以设计者们就把这几个功能提取出来
并不提供实现,这一种方式就是接口。
那么,真正的具体的实现类是在哪里呢?
在真正的具体的子类中,以内部类的方式体现的。
C:迭代器源码
a:collection集合继承了一个父接口
public interface Collection<E> extends Iterable<E> {....}
b:Iterable接口中只有一个方法
public interface Iterable<T> {
Iterator<T> iterator();
}
c:Iterator接口中有三个抽象方法(注意:抽象方法要求继承子类必须继承并重写)
//接口中中的方法存在默认修饰符:public abstract
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
d:Collection要实现上述三个方法(hasNext(),next(),remove()),但是并没有在Collection中给出具体的实现。
那么为什么呢?具体的实现又是在哪里?
因为Collection是一个接口,不给出具体实现。
我们在创建对象的时候是:Collection c = new ArrayList();那么,我们就往ArrayList里面找,它应该是给出了具体实现。
e:看ArrayList中的iterator()方法
public Iterator<E> iterator() {
return new Itr();
}
f:这一个时候,我们发现返回的是一个: new Itr();这是一个接口,居然能够作为返回值,那么也就是说这里面一定给出了具体的实现
g:Itr()方法
private class Itr implements Iterator<E> {...}//一个内部类,实现了haNext(),next(),remove()方法。
(6).一个Collection的代码练习:
//省略学生对象
public static void main(String[] args) {
Collection c = new ArrayList<>();
Student s = new Student();
s.setName("张三");
s.setAge(12);
Student s1 = new Student();
s1.setName("李四");
s1.setAge(13);
//添加元素
c.add(s);
c.add(s1);
Iterator lt = c.iterator();
while (lt.hasNext()) {
Student getStudent = (Student) lt.next();
System.out.println(getStudent.getName()+"------"+getStudent.getAge());
}
原文地址:https://www.cnblogs.com/nwxayyf/p/10198983.html