文章目录
- 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")); // trueSystem.out.println(collection.isEmpty()); // falseSystem.out.println(collection.size()); // 4Object[] 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")); // falsecollection.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;}@Overridepublic 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;}@Overridepublic 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>{@Overridepublic void add(String s) {}
}
- 始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public class Generic<E> implements MyInterface<E>{@Overridepublic 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热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。