文章目录
- Collection集合
- Iterator迭代器
- 泛型(难点)
Collection集合
集合是java中提供的一种容器,可以用来存储多个数据。
- 集合框架
- 单列集合
java.util.Collection
- 双列集合
java.util.Map
集合类继承体系图:
List集合的特点:有序可重复
Set集合的特点:无序不重复
- Collection功能(单列集合的父接口)
public boolean add(E e)
: 把给定的对象添加到当前集合中 。public void clear()
:清空集合中所有的元素。public boolean remove(E e)
: 把给定的对象在当前集合中删除。public boolean contains(E e)
: 判断当前集合中是否包含给定的对象。public boolean isEmpty()
: 判断当前集合是否为空。public int size()
: 返回集合中元素的个数。public Object[] toArray()
: 把集合中的元素,存储到数组中。
代码示例:
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("hello");
collection.add("world");
collection.add("java");
collection.add("i");
System.out.println(collection.contains("world")); // true
System.out.println(collection.isEmpty()); // false
System.out.println(collection.size()); // 4
Object[] array = collection.toArray();
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
System.out.println();
collection.remove("world");
System.out.println(collection.contains("world")); // false
collection.clear();
System.out.println(collection.isEmpty()); // true
}
通过add() 方法向集合中添加了四个元素,因此集合的大小为4,调用contains() 方法判断集合中是否存在“world”字符串(在添加的时候添加了“world”字符串),调用 isEmpty() 方法判断集合是否为空(很显然集合中存在四个元素不为空),通过 toArray() 方法将集合元素存储到数组中进行遍历,通过 remove() 方法移除集合中的指定元素“world”,在判断是否存在“world”字符串(很显然为false),最后调用 clear() 方法清除集合中的元素,并且判断集合是否为空(集合中不存在任何元素了,集合为空)。
Iterator迭代器
- Iterator接口
Iterator主要用于迭代访问(即遍历)
迭代: 在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。
public E next()
:返回迭代的下一个元素。public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("hello");
collection.add("world");
collection.add("java");
collection.add("i");
Iterator iterator = collection.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
实现原理: 在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
- 增强for
增强for语法规则:
for(元素的数据类型 变量 : Collection集合or数组){
}
在遍历的过程中,不能对集合中的元素进行增删操作
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("hello");
collection.add("world");
collection.add("java");
collection.add("i");
for (String o : collection) {
System.out.println(o);
}
}
泛型(难点)
集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。
]
- 泛型:可以在类或方法中预支地使用未知的类型。
- 泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。
- 定义和使用含有泛型的类
定义泛型:
public class Person <E> {}
使用格式: 创建对象的时候确定泛型
public class Person <E> {
E name;
E age;
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
public E getAge() {
return age;
}
public void setAge(E age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
'}';
}
public static void main(String[] args) {
Person<String> person = new Person();
person.name = "张三";
person.age = "18";
System.out.println(person);
}
}
这里我们在创建对象的时候就给定泛型String,其中我们的属性name,age也被定义泛型了,这里我们这样理解,当我们给定泛型的时候,该类就变成了如下代码中所定义的。
public class Person {
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
'}';
}
public static void main(String[] args) {
Person person = new Person();
person.name = "张三";
person.age = "18";
System.out.println(person);
}
}
- 含有泛型的方法
定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
使用格式: 调用方法时,确定泛型的类型
public class Generic {
public <VIP> void test(VIP vip){
System.out.println(vip.getClass());
}
public static void main(String[] args) {
// 创建对象
Generic mm = new Generic();
// 演示看方法提示
mm.test("aaa");
mm.test(123);
mm.test(12.45);
}
}
- 含有泛型的接口
定义格式:
修饰符 interface接口名<代表泛型的变量> { }
定义一个接口
public interface MyInterface<E>{
public abstract void add(E e);
}
- 定义类时确定泛型的类型
public class Generic implements MyInterface<String>{
@Override
public void add(String s) {
}
}
- 始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public class Generic<E> implements MyInterface<E>{
@Override
public void add(E e) {
System.out.println(e);
}
public static void main(String[] args) {
Generic<String> stringGeneric = new Generic<>();
stringGeneric.add("123");
}
}
- 泛型通配符
通配符基本使用:
public static void main(String[] args) {
Collection<Integer> list1 = new ArrayList<Integer>();
getElement(list1);
Collection<String> list2 = new ArrayList<String>();
getElement(list2);
}
public static void getElement(Collection<?> coll){}
//?代表可以接收任意类型
通配符高级使用----受限泛型
- 泛型的上限
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
- 泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
代码示例:
public static void main(String[] args) {
Collection<Integer> list1 = new ArrayList<Integer>();
Collection<String> list2 = new ArrayList<String>();
Collection<Number> list3 = new ArrayList<Number>();
Collection<Object> list4 = new ArrayList<Object>();
getElement1(list1);
getElement1(list2);//报错
getElement1(list3);
getElement1(list4);//报错
getElement2(list1);//报错
getElement2(list2);//报错
getElement2(list3);
getElement2(list4);
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。