1.集合的引入
对象数组:能够储存对象的数组; 创建数组的格式: 数据类型[] 数组名称 = new 数据类型[长度]; 数组: 既可以存储基本类型,也可以存储引用类型; 使用数组也可以完成针对引用类型数据的存储以及遍历,但是弊端是长度固定;数组操作引用类型数据,不适合操作长度一直变化的需求,所以使用"集合";
//使用数组存储5个学生,学生有姓名和年龄,(对象数组),将数组学生信息遍历出来
2.集合和数组的区别
1)长度的区别: 数组:长度是固定的 集合:长度数可变的 2)存储数据的区别 数组:既可以存储基本数据类型,也可以存储引用数据类型; 集合:只能存储引用数据类型,通过"泛型"; 3)存储元素的区别 数组:只能存储同一种数据类型的元素 集合:如果没有泛型的约定,它可以存储任意的引用型元素 泛型:<E> --->Element元素 <T> --->Type 都是引用类型 Collection<E> --->模仿数组,在创建集合的明确数据类型 例:Collection<String>--->明确存储String类型的元素 但是,后期"反射"可以直接给里面加入任意类型,不加泛型,可能导致程序不安全;
3.集合的体系结构及功能
父接口Collection<E> :单列集合,里面只能存储一种引用类型 子接口: List set ArrayList<E> HashSet<E>--->底层添加元素的实现--->HashMap LinkedList<E> TreeSet<E>--->底层的添加元素的实现--->TreeMap Vector<E> Collection:是所有集合的根接口,集合表示一组被称为其元素的对象。一些集合允许重复元素(List集合),而其他集合不允许重复(Set:唯一的); JDK不提供此接口的任何直接实现:它提供了更具体的子接口的实现,如Set和List--->实现类(接口多态!) Collection功能: 添加:boolean add(E--Object(任意类型元素) e)---只要添加元素,元素数就+1,所以永远返回的true 判断: boolean contains(Object o):是否包含指定的元素 boolean equals(Object o):比较 boolean isEmpty():判断集合是否为空 删除: void clear():删除所有元素 boolean remove(Object o):删除集合中指定的元素 获取功能: int size():获取集合元素数 Iterator<E> iterator():迭代器(重点)--增强fou循环语句代替迭代器,写法简单 Object[] toArray():传统 方式集合转换成对象数组--->遍历
4.集合的高级功能
带All的功能: boolean addAll(Collection c)添加一个集合中的所有元素 boolean containsAll(Collection c):包括一个集合中元素;注意:包含一个集合中所有元素才是包含 boolean removeAll(Collection c):删除集合中的包含的元素;删除的元素一个只要包含,都存在,那么就删除了 boolean retainAll(Collection c):获取两个集合中交集元素; A集合对B集合求交集, 如果没有交集元素,那么A集合内容就是[](-->存储交集的元素 没有交集) 如果有交集,交集的元素是存在A集合中,返回值是看A集合中的元素内容是否发生变化 如果有变化--->true 如果没有变化--->false
5.集合的获取功能
1.Object[] toArray():传统 方式集合转换成对象数组--->遍历
5.1代码展示
public class CollectionDemo3 { public static void main(String[] args) { //针对集合的遍历方式1:Collection里面的Object[] toArray(): //创建一个Collection集合 Collection c = new ArrayList() ; //没有加入泛型的话-->里面可以存储任意的Object类型元素 //创建5个学生对象 Student s1 = new Student("刘备",45) ; Student s2 = new Student("曹操",50) ; Student s3 = new Student("关羽",35) ; Student s4 = new Student("张飞",30) ; Student s5 = new Student("周瑜",25) ; //将5个学生对象添加到Collection中 c.add(s1) ; c.add(s2) ; c.add(s3) ; c.add(s4) ; c.add(s5) ; //将集合转换成对象数组 //Collection里面的Object[] toArray() Object[] objs = c.toArray(); //遍历 for(int x = 0 ; x <objs.length ; x++){ Student s = (Student)objs[x] ;//向下转型 System.out.println(s.getName()+"---"+s.getAge()); } } }
5.2加入泛型
泛型: 就是集合对象的在创建的时候,就已经明确了存储的类型的限定! 格式: <E> EElement---->存储的引用数据类型的元素 加入泛型的好处: 1)提高了程序安全性,不会出现类型转换问题! 2)避免了强转类型转换的格式 3)将运行时期异常提前到了编时译期(编译通过不了,不能运行!)--- (使用迭代器的方式进行遍历)
public class CollectionTest { public static void main(String[] args) { //创建一个Collection集合 //加入泛型 Collection<Student> c = new ArrayList<>() ;//后面<默认不写,默认和前面类型一致> //创建5个学生对象 Student s1 = new Student("刘备",45) ; Student s2 = new Student("曹操",50) ; Student s3 = new Student("关羽",35) ; Student s4 = new Student("张飞",30) ; Student s5 = new Student("周瑜",25) ; //将5个学生对象添加到Collection中 c.add(s1) ; c.add(s2) ; c.add(s3) ; c.add(s4) ; c.add(s5) ; //将集合转换成对象数组 Object[] objects = c.toArray() ; for(int i = 0 ; i < objects.length ; i ++){ Student s = (Student) objects[i]; //强转 System.out.println(s.getName()+"---"+s.getAge()); } } }
6.集合遍历---利用迭代器
//迭代器的本质是迭代器的子实现类,其中的子实现类是ArraLIst集合实现的 public class CollectionDemo { public static void main(String[] args) { //创建集合对象 Collection<String> c = new ArrayList<>() ; //添加字符串元素 c.add("hello") ; c.add("world") ; c.add("JavaEE") ; //获取Collection集合的迭代器 //Iterator<E> iterator() :返回值是接口--->需要返回需要返回的就是子实现类对象 //Iterator迭代器的泛型和创建集合的明确的类型是一种 //将集合的元素存储在迭代器中了 Iterator<String> it = c.iterator(); while(it.hasNext()){//是否有可以遍历的元素 //成立,不断获取 //Integer i = it.next() ; String s = it.next(); System.out.println(s+"----"+s.length()); } } }