P238 collection集合概述
集合与数组有什么区别?
数组:
- 长度不可改变
- 存放基本数据类型的值
- 都是同一种类型的
集合:
- 长度可以改变
- 存储的是对象
- 对象的类型可以不一样
int[]a=new int[2];
Student[]arr=new Student[3];
ArrayList<Student><String><Integer>
P239 集合框架
Vector集合/ArrayList集合/LinkedList集合/
如何使用集合存储数据?
如何遍历集合?
集合的特性有哪些?
继承:子类共性抽取,形成父类(接口)
学习顶层,使用底层的类
P239
LIST:有索引
set:无索引
collection:
- 层次结构中的根接口
- 表示一组对象
- 这些对象也成为collection的元素
- 一些collection可以有重复元素,一些不可以
java.util.Collection接口:
- 所有单列集合的最顶层接口,里面定义了所有单列集合共性的方法
- 任意的单列集合都可以使用collection接口中的方法
共性的方法:
public boolean add(E e);//把给定的对象添加到当前集合中
public void clear();//清空集合中的所有元素
public boolean remove(E e);//把给定的元素在当前集合中删除
public boolean isEmpty();//判断当前集合是否为空
public Object[] toArray();//把集合中的元素,存储到数组中
P246 泛型
前请提要
- 集合中是可以存放任意对象
- 把对象存储集合后,那么这时他们都会被提升成Object类型
- 当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换
什么是泛型?
一种【未知的数据类型】
当我们不知道使用什么数据类型的时候,使用泛型
也可以看成一个变量==》接收数据类型的【变量】
- E e:Element 元素
- T t:Type 类型
使用场景?
ArrayList集合
- 在定义时,不知道集合中会存储什么类型的数据==》类型使用泛型
public class ArrayList<E>{//E是未知的数据类型
public boolean add(E e){}//元素的数据类型可以泛型!
public E get(int index){}//返回值类型也可以做泛型!
}
👇
当要使用(【创建一个集合对象】)时,就会确定泛型的数据类型
ArrayList<String>list=new ArrayList<String>();//确定了是String类型!
👇String作为参数传过来
public class ArrayList<String>{//E是未知的数据类型
public boolean add(String e){}
public String get(int index){}
}
P247 使用泛型和不使用泛型的区别?
创建集合对象时,如果不使用泛型:
- 默认的类型就是Object类型
- 可以存储任意类型的数据
- but,不安全,会引发异常
会抛出ClassCastException类型转换异常,不能把Integer—》String类型
使用泛型
- 好处:
- 避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
- 把运行期异常(代码运行后抛出的异常)提升到了编译器(写代码的时候就报错)
- 坏处:
- 泛型是什么类型,就只能存储什么类型的数据
P248 定义和使用含有泛型的【类】
定义一下这个含有泛型的类
public class GenericClass<E>{
private E name;//name是泛型
public E getName(){//函数返回值是泛型(因为要返回的是name)
return name;
}
public void setName(E name){//是泛型
this.name=name;//传参的name赋给成员的name
}
泛型可以运用于不同的类,方法,接口当中!!
使用泛型的案例:
GenericClass类使用了泛型E,
创建的对象gc可以是integer/String类型任选
P249 定义和使用含有泛型的方法
//定义一个含有泛型的方法
public <M>void method(M m){//注意传参处,是泛型!!!
sout(m);
}
//调用时
ClassName gm=new ClassName();//创建对象gm
gm.method(10);//传递的是int类型
gm.method("abd");//传递是string类型
含有泛型的方法,在【调用方法】的时候确定【泛型的数据类型】
【传递什么类型的参数】,泛型就是什么类型
含有泛型的静态方法呢?
//定义一个含有泛型的静态方法
public static<S>void method(S s){
...sout(s)
}
//调用(静态直接用类名调用
ClassName.method(1);//int型,输出1
ClassName.method("add");//string型,输出add
P250 定义和使用含有泛型的接口
定义含有泛型的接口
public interface ClassName<I>{//含有泛型I类型
public abstract void method(I i);
}
使用方法一:定义接口的实现类,实现接口,指定接口的泛型
在实现类中传递E类型
public class ClassName implements InterfaceName<String>{//实现类此处就传入了String
@override
public void method(String s){//将接口中的抽象方法重载,给定泛型类型String
sout(s);
}
}
使用方法二:接口使用什么泛型,实现类也用,类跟着接口走
相当于===》定义了一个含有泛型的类,[创建对象]的时候确定泛型的类型
public class ClassName<I> implements InterfaceName<I>{//注意类名后面多了《i》
@override
public void method(I i){//
sout(i);
}
}
//创建对象
ClassName gi1=new ClassName();
gi1.method(1);//创建对象时确定泛型为int
P251 泛型的通配符
- ?:代表任意的数据类型
- 不能创建对象使用
- 只能作为方法的参数使用
例如:定义一个方法,能遍历所有类型的ArrayList集合
- 不知道集合使用什么数据类型—》可以用泛型的通配符?接收数据类型
public static void printArray(ArrayList<Integer>list){//integer会报错,object也会??