本文主要内容
1、集合
2、Iterator迭代器
3、增强for循环
4、泛型
01 集合
A:集合概述
集合,是java中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
数组的长度是固定的。集合的长度是可变的。
集合中存储的元素必须是引用类型数据
B:集合继承关系
1、ArrayList
ArrayList类继承抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口。Collection接口为最顶层集合接口。
源代码:
interface List extends Collection {
}
public class ArrayList extends AbstractList implements List{
}
2、集合继承体系
Collecton接口常用的子接口有:List接口、Set接口
List接口常用的子类有:ArrayList类、LinkedList类
Set接口常用的子类有:HashSet类、LinkedHashSet类
C:集合Collection
Collection接口中的方法,是集合中所有实现类必须拥有的方法
Java中三种长度表现形式
数组.length 属性 返回值 int
字符串.length() 方法,返回值int
集合.size()方法, 返回值int
集合Collection的方法
1) Object[] toArray() 集合中的元素,转成一个数组中的元素, 集合转成数组
返回是一个存储对象的数组, 数组存储的数据类型是Object
eg:
private static void function() {
Collection coll = new ArrayList();
coll.add("abc");
coll.add("itcast");
coll.add("itheima");
coll.add("money");
coll.add("123");
Object[] objs = coll.toArray();
for(int i = 0 ; i < objs.length ; i++){
System.out.println(objs[i]);
}
}
- boolean contains(Object o) 判断对象是否存在于集合中,对象存在返回true
方法参数是Object类型
eg:
private static void function() {
Collection coll = new ArrayList();
coll.add("abc");
coll.add("itcast");
coll.add("itheima");
coll.add("money");
coll.add("123");
boolean b = coll.contains("itcast");
System.out.println(b);
}
-
void clear() 清空集合中的所有元素,集合容器本身依然存在
eg: public static void function(){ //接口多态的方式调用 Collection
coll = new ArrayList (); coll.add("abc"); coll.add("bcd"); System.out.println(coll); coll.clear(); System.out.println(coll); } } -
boolean remove(Object o)移除集合中指定的元素
eg: private static void function(){ Collection
coll = new ArrayList (); coll.add("abc"); coll.add("money"); coll.add("itcast"); coll.add("itheima"); coll.add("money"); coll.add("123"); System.out.println(coll); boolean b = coll.remove("money"); System.out.println(b); System.out.println(coll); }
02 迭代器Iterator
集合的类型有很多种,取出集合中的元素,可用一种通用的获取方式来完成。
获取方式(即 迭代Iterator):在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续判断,如果还有就再取出来。直到把集合中的所有元素全部取出。
A:抽象方法
boolean hasNext() 判断集合中还有没有可以被取出的元素,如果有返回true
next() 取出集合中的下一个元素
使用Iterator接口,先要获取该接口的实现类对象
使用ArrayList集合的对象 :Iterator it =array.iterator(),运行结果就是Iterator接口的实现类的对象
B:执行过程
while(it.hasNext()) {
System.out.println(it.next());
}
//cursor记录的索引值不等于集合的长度返回true,否则返回false
public boolean hasNext() {
return cursor != size; //cursor初值为0
}
//next()方法作用:
//①返回cursor指向的当前元素
//②cursor++
public Object next() {
int i = cursor;
cursor = i + 1;
return elementData[lastRet = i];
}
另外,for循环迭代写法:
for (Iterator it2 = coll.iterator(); it2.hasNext(); ) {
System.out.println(it2.next());
}
C:集合迭代中的转型
集合中存储是对象的地址。
jdk1.5版本以后集合可以存储基本类型.
集合存储基本类型时,会自动装箱(向上转型:将基本类型提升到基本类型的包装类对象)。取出时,会自动拆箱(向下转型:将基本类型包装类对象转化为基本类型)
Collection coll = new ArrayList();
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");
Iterator it = coll.iterator();
while (it.hasNext()) {
//由于元素被存放进集合后全部被提升为Object类型
//当需要使用子类对象特有方法时,需要向下转型
String str = (String) it.next();
System.out.println(str.length());
}
Iterator接口可以使用<>来控制迭代元素的类型
Collection coll = new ArrayList();
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");
Iterator it = coll.iterator();
while (it.hasNext()) {
String str = it.next();
//当使用Iterator控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
System.out.println(str.length());
}
03 增强for循环
JDK1.5以后出现新的接口 java.lang.Iterable,其作用是实现增强for循环。Collection接口继承Iterable
增强for循环格式:
for( 数据类型 变量名 : 数组或者集合 ){
sop(变量);
}
增强for循环的使用,可以减少代码量同时方便了对容器的遍历。但是这种遍历方式没有索引,所以不能操作某个指定的元素
04集合的泛型
A:泛型概述
JDK1.5以后为了保证程序的安全性,出现泛型。
泛型,指明了集合中存储数据的类型 <数据类型>
集合可以存放任意对象,对象存储到集合后,会被提升成Object类型。取出每一个对象,并且进行相应的操作,必须采用类型转换。
泛型只在编译时存在,编译后就被擦除,所以在编译之前可以限制集合的类型
例如:ArrayList
编译后:ArrayList al=new ArrayList();
B:泛型类
定义格式:修饰符 class 类名<代表泛型的变量> { }
eg:
ArrayList list = new ArrayList();//变量E的值就是String类型
class ArrayList{
public boolean add(String e){ }
public String get(int index){ }
}
C:泛型的方法
定义格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
API中的ArrayList集合中的方法 public
例如:
ArrayList list = new ArrayList();
String[] arr = new String[100];
String[] result = list.toArray(arr);
此时,变量T的值就是String类型。变量T,可以与定义集合的泛型不同
public String[] toArray(String[] a){ }
D:泛型的接口
public interface List {
abstract boolean add(E e);
}
实现类,先实现接口,不理会泛型
public class ArrayList implements List{
}
调用者 : new ArrayList() 后期创建集合对象的时候,指定数据类型
实现类,实现接口的同时,也指定了数据类型
public class XXX implements List{
}
new XXX()
E:泛型的通配符
泛型的通配符:匹配所有的数据类型 ?
public static void iterator(Collection> coll){
Iterator> it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
F:泛型的限定
场景:将的酒店员工,厨师,服务员,经理,分别存储到3个集合中
定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest {
public static void main(String[] args) {
//创建3个集合对象
ArrayList cs = new ArrayList();
ArrayList fwy = new ArrayList();
ArrayList jl = new ArrayList();
//每个集合存储自己的元素
cs.add(new ChuShi("张三", "后厨001"));
cs.add(new ChuShi("李四", "后厨002"));
fwy.add(new FuWuYuan("翠花", "服务部001"));
fwy.add(new FuWuYuan("酸菜", "服务部002"));
jl.add(new JingLi("小名", "董事会001", 123456789.32));
jl.add(new JingLi("小强", "董事会002", 123456789.33));
iterator(jl);
iterator(fwy);
iterator(cs);
}
/*
* 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 work
* ? 通配符,迭代器it.next()方法取出来的是Object类型,怎么调用work方法
* 强制转换: it.next()=Object o ==> Employee
* 方法参数: 控制,可以传递Employee对象,也可以传递Employee的子类的对象
* 泛型的限定 本案例,父类固定Employee,但是子类可以无限?
* ? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象
* ? super Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
*/
public static void iterator(ArrayList extends Employee> array){
Iterator extends Employee> it = array.iterator();
while(it.hasNext()){
//获取出的next() 数据类型,是什么Employee
Employee e = it.next();
e.work();
}
}