一、Collection集合
1.1集合与数组的区别:
1.数组长度是固定的,集合的长度是可变的。
2.数组中存储的是同一种类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
1.2Collection集合的常用功能
Collection是所有单列集合的父接口,双列集合在第十五章讲解MAP集合时会讲到。
- public boolean add(E e):把给定的对象添加到当前集合中 。
- public boolean contains(E e):判断当前集合中是否包含给定的对象。
- public boolean remove(E e):把给定的对象在当前集合中删除。
- public int size():返回集合中元素的个数。
- public Object[] toArray():把集合中的元素,存储到数组中。
- public void clear():清空集合中所有的元素。
- public boolean isEmpty():判断当前集合是否为空
二、Iterator迭代器
2.1使用迭代器对集合进行取元素
Iterator也是接口,主要用于迭代访问(遍历)Collection中的元素,所以Iterator对象也被称为迭代器
public boolean hasNext():如果仍有元素可以迭代
public E next():返回迭代的下一个元素
public void remove():删除元素
步骤:
1.创建迭代器:集合名.iterator
2.判断是否有下一个元素:为了第四步的重复步骤,选择while语句,条件即为迭代对象.hashNext()
3.获取元素:迭代对象.next().var
4.重复执行2和3步骤,知道2中判断没有下一个元素
Iterator it = coll.iterator();
Iterator<String> it = coll.iterator();//第一步
while(it.hasNext()){ //第二步
String s = it.next();//第三步
System.out.println(s);//输出打印(遍历)
}
2.2增强for循环
增强for循环也叫foreach循环,专门用来遍历数组和集合的
for(元素数据类型 变量 : Collection集合或数组){}
例:for (int : arr){}
快捷键:集合/数组名.for
注意事项:
与foreach比,Iterator迭代器只能遍历集合。两者都可快速遍历,但是缺点为无法获知索引位置。且两者遍历过程中不可对集合中的元素进行增删操作。
三、泛型
泛型可将数据类型应用于不同的类、方法、接口当中,将数据类型作为参数进行传递。
3.1泛型用于类
格式: 修饰符 class 类名 <代表泛型的变量>{ }
例: class ArrayList{ }
泛型类可以在创建对象的时候确定具体数据类型(new的对象类型可直接写出具体类型,即默认将泛型类的 E 理解为次类型)
MyGenericClass my = new MyGenericClass(); //E—String类型
3.2泛型用于方法
格式: 修饰符<代表泛型的变量> 返回值类型 方法名(参数){ }
例: public static void show(E e){ }
调用方法时,确定泛型的类型,调用时直接写入对应类型的值,即可表示对应类型
m.show(“aaa”); // E —String
3.3泛型用于接口
格式: 修饰符 interface 接口名<代表泛型的变量> { }
例: public interface MyGenericInterface{ }
定义实现类时确定泛型的类型
public class MyImp implements MyGenericInterface{ } //E—String
始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public class MyImp2 implements MyGenericInterface { } //不确定时仍未E,但格式有变化
当走到创建对象时,即为泛型用于类时的过程
3.4泛型通配符:泛型上下限(受限泛型、泛型高级使用)
当使用泛型时,在传递数据中,若泛型类型不确定,可以通过通配符:<?>表示。?就是泛型通配符,用来指定任意的数据类型。
但当需要特定区间范围的类型时可用受限泛型
上限泛型:
格式: 类型名称 <? extends 类 > 对象名称 //只能接收该类型及其子类
例: public static void getElement1(Collection<? extends Number> coll){ }
已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类
此时的泛型?,必须是Number类型或者Number类型的子类
下限泛型:
格式: 类型名称 <? super 类 > 对象名称 //只能接收该类型及其父类型
例: public static void getElement2(Collection<? super Number> coll){ }
已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类
泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类