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());
? ? ? }
?
? }
}
?
|