集合
-
集合是Java中提供的一种存储多个数据的容器
-
集合与数组的区别
- 数组的长度固定,集合的长度可变
- 数组中存储的是同一类型的元素,可以是基本数据类型,也可以是引用数据类型;而集合存储的都是对象,且对象的类型可以不一致
-
集合按照其存储结构分类为:
java.util.Collection
:单列集合java.util.Map
:双列集合
1.Collection集合
Collection集合
-
单列集合的根接口
-
子接口
-
java.util.List
:1.有序集合,2.允许存储重复元素,3.有索引,可使用普通的for循环遍历包括:Vector集合、ArrayList集合、LinkedList集合
-
java.util.Set
:1.不允许存储重复元素,2.无索引,不能使用普通的for循环遍历包括:
有序集合:TreeSet集合、HashSet集合
无序集合:LinkedHashSet集合
-
-
单列集合通用方法
public boolean add(E e)
: 把给定的对象添加到当前集合中 。public void clear()
:清空集合中所有的元素。public boolean remove(E e)
: 把给定的对象在当前集合中删除。集合存在该元素则删除,返回true;集合不存在该元素则删除失败,返回falsepublic boolean contains(E e)
: 判断当前集合中是否包含给定的对象。包含返回true,不包含返回falsepublic boolean isEmpty()
: 判断当前集合是否为空。为空返回true,不为空返回falsepublic int size()
: 返回集合中元素的个数。public Object[] toArray()
: 把集合中的元素,存储到数组中。
2.Iterator迭代器
迭代:Collection集合元素的通用获取方式,在取元素前先判断集合中是否含有元素,有则取出元素,一直循环直到取出集合中所有的元素,这种取出方式称为迭代。
Iterator迭代器是一个接口,需要使用Iterator接口的实现类对象,Collection接口定义了一个iterator()方法返回一个在当前Collection集合的元素上进行迭代的迭代器
Iterator<String> it = collection.iterator();
// 泛型<String>指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
-
常用方法:
public E next()
:返回迭代的下一个元素。public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。
-
实现原理
Iterator<String> it = collection.iterator();
:获取迭代器的实现类对象,将索引指针指向集合的-1索引it.hasNext();
:判断集合中还有无下一个元素it.next();
:1.取出指针的下一个元素;2.将指针向后移一位
增强for循环
-
增强for循环,又称for each循环;专门用于遍历数组与集合,内部原理同样是个Iterator迭代器,故在遍历的过程中不能对集合中的元素进行增删操作。
-
for (集合/数组的数据类型 自定义遍历元素变量名 : 集合名/数组名){ //对遍历的元素变量的操作 }
3.泛型
是一种未知的数据类型,当使用数据类型不能确定时,可以使用泛型;当创建对象时,数据类型作为参数传递,将会确定泛型的数据类型
- 集合不使用泛型时,默认的类型为Object类型,可以存储任意类型的数据,但不安全,类型转换时可能会引发异常
- 集合使用泛型,避免了需要类型转换的问题;将运行期异常提升到了编译期异常,
定义含有泛型的方法:
public <M> void method1(M m){
//具体操作
}
对象名.method1(1)//通过对象调用普通方法传递任意数据类型值
public static <M> void method2(M m){
//具体操作
}
类名.method2("字符串")//通过类名调用静态方法传递任意数据类型值
-
泛型定义在方法的修饰符与返回值之间
-
在调用方法的时候确定泛型的数据类型
含有泛型的接口:
定义格式:
修饰符 interface接口名<代表泛型的变量> { }
例:
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
使用格式:
- 1.定义类时确定泛型的类型
- 2.一直不确定泛型的数据类型,直到创建实现类时才确定数据类型
泛型的通配符
?:代表任意的数据类型,不能创建对象使用,只能作为方法的参数使用
- 泛型的上限限定:? extend E 代表使用的泛型只能是E类型的子类/本身
- 泛型的下限限定:? super E 代表使用的泛型只能是E类型的父类/本身