集合:
集合和数组的区别:
- 数组的长度是固定的,而集合的长度是可变的
- 数组中的元素的类型是一致的,而集合中的元素可以不一致
- 数组中可以存储基本数据类型的数据,而集合只能存储引用数据类型的数据
集合体系图:
- 单列集合:
- Collection:定义了所有单列集合共有的方法
- List:存取元素有序,可重复
- ArrayList
- LinkedList
- Vector 过时不用
- Set:存取元素无序,不可重复
- HashSet:
- LinkedHashSet:
- TreeSet:
- List:存取元素有序,可重复
- Collection:定义了所有单列集合共有的方法
- 双列集合:
- Map:
- HashMap:
- LinkedHashMap:
- TreeMap:
- Map:
Collection集合(接口)
- public boolean add(E e) : 把给定的对象添加到当前集合中 。
// 创建集合对象
// 使用多态形式
Collection<String> coll = new ArrayList<String>();//父接口指向实现类的对象 多态
// 使用方法
// 添加功能 boolean add(String s)
coll.add("小李广");
coll.add("扫地僧");
coll.add("石破天");
System.out.println(coll);
- public void clear() :清空集合中所有的元素。
// void clear() 清空集合
coll.clear();
System.out.println("集合中内容为:"+coll)
- public boolean remove(E e) : 把给定的对象在当前集合中删除。
//boolean remove(E e) 删除在集合中的o元素
System.out.println("删除石破天:"+coll.remove("石破天"));
System.out.println("操作之后集合中元素:"+coll);
- public boolean contains(E e) : 判断当前集合中是否包含给定的对象。
// boolean contains(E e) 判断o是否在集合中存在
System.out.println("判断 扫地僧 是否在集合中"+coll.contains("扫地僧"));
- public boolean isEmpty() : 判断当前集合是否为空。
// boolean isEmpty() 判断是否为空
System.out.println(coll.isEmpty());
- public int size() : 返回集合中元素的个数。
// size() 集合中有几个元素
System.out.println("集合中有"+coll.size()+"个元素")
- public Object[] toArray() : 把集合中的元素,存储到数组中
// Object[] toArray()转换成一个Object数组
Object[] objects = coll.toArray();
// 遍历数组
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
Collection 集合的遍历:
所有的Collection集合都有一个迭代器用来遍历集合中的元素
-
什么是迭代
在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出来。一直把集合中的所有元素全部取出,这种取出方式专业术语称为迭代
-
如何获取集合的迭代器
Iterator iterator() 返回此集合中的元素的迭代器
// 使用多态方式 创建对象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("串串星人");
coll.add("吐槽星人");
coll.add("汪星人");
//获取coll集合的迭代器
Iterator<String> it = coll.iterator();
-
如何使用迭代器遍历集合中的元素 iterator中的方法:
public E next() :返回迭代的下一个元素。
public boolean hasNext() :如果仍有元素可以迭代,则返回 true
//使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
增强for循环:
格式:
for(元素的数据类型 变量 : Collection集合or数组){
//写操作代码
}
int[] arr = {3,5,6,87};
//使用增强for遍历数组
for(int a : arr){//a代表数组中的每个元素
System.out.println(a);
}
Collection<String> coll = new ArrayList<String>();
coll.add("小河神");
coll.add("老河神");
coll.add("神婆");
for(String s :coll){
System.out.println(s);
}
泛型:
概述:可以在类或方法中预支地使用未知的类型(就是一个未知的数据类型)
特点:泛型只能是引用数据类型
泛型的好处:
- 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
- 避免了类型强转的麻烦
注意:
- 集合如果没有指定元素的类型,那么元素的类型默认是Object类型
自定义泛型和使用泛型:
- 定义泛型类和使用泛型类:
-
定义泛型类的语法格式:
修饰符 class 类名<代表泛型的变量> { }
public class 类名{
}
创建该泛型类对象的时候确定泛型的类型
-
public class MyGenericClass<MVP> { //没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型
private MVP mvp;
public void setMVP(MVP mvp) {
this.mvp = mvp;
}
public MVP getMVP() {
return mvp;
}
}
定义泛型方法和使用泛型方法
-
定义泛型方法的格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
调用泛型方法的时候确定泛型的类型
public class MyGenericMethod {
public <MVP> void show(MVP mvp) {
System.out.println(mvp.getClass());
}
public <MVP> MVP show2(MVP mvp) {
return mvp;
}
}
定义泛型接口和使用泛型接口
-
定义泛型接口的格式:
修饰符 interface接口名<代表泛型的变量> { }
public interface 接口名{ }
1. 定义实现类的时候确定泛型的类型
2. 始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
泛型通配符
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?来表示未知通配符
此时只能接受数据,不能往该集合中存储数据
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
注意:
泛型没有继承