Collection类:
集合
:集合是
java
中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
- 数组的长度固定,而集合的长度是可变的
- 数组中存储的元素的数据类型是相同的,可以存储任意类型的数据,集合存储的时引用数据类型
查看Collection的源码可以知道,Collection是单列集合类的根接口,其有两个重要常见的子接口分别是
java.util.List
和
java.util.Set
其中
List
的特点是元素有序、元素可重复。
Set
的特点是元素不可重复。
Collection常用方法:(具体参照java api文档)
public boolean add(E e)
: 把给定的对象添加到当前集合中 。
public void clear()
:
清空集合中所有的元素。
public boolean remove(E e)
:
把给定的对象在当前集合中删除。
public boolean contains(Object obj)
:
判断当前集合中是否包含给定的对象。
public boolean isEmpty()
:
判断当前集合是否为空。
public Object[] toArray()
:
把集合中的元素,存储到数组中
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo01 {
public static void main(String[] args) {
//多态 父类引用指向子类对象
Collection<String> collection = new ArrayList<>();
//往集合里添加对象
collection.add("张三");
collection.add("李四");
collection.add("王五");
System.out.println(collection);//集合已经重写了toSting方法
//remove方法,删除了对象李四则返回true否则返回false
boolean remove = collection.remove("李四");
System.out.println(remove);
//contains判断集合中是否包含某个对象,包含则返回true 否则就返回false
boolean b = collection.contains("张三");
System.out.println(b);
//isEmpty集合判空 空则返回true 否则返回false
boolean empty = collection.isEmpty();
System.out.println(empty);
collection.add("老刘");
collection.add("老王");
//集合遍历
for (String s : collection) {
System.out.println(s);
}
System.out.println("----------------------------");
//使用迭代器遍历集合元素 返回在此 collection 的元素上进行迭代的迭代器,关于元素返回的顺序没有任何保证
Iterator<String> it = collection.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("----------------------------");
//toArray返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同
String[] str = collection.toArray(new String[0]);
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}
}
泛型:
不使用泛型:集合是可以存储任意类型的对象,当没有明确的类型要求的时候,对象在存储后将默认成Object类型,当我们取对象使用的时候,就需要进行强制转换。当对象的数据类型不一时,强转的时候会出现java.lang.ClassCastException,类型转换异常。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo02 {
public static void main(String[] args) {
//不使用泛型 不限制存储对象的数据类型
Collection coll = new ArrayList();
coll.add(2);
coll.add("小红");
coll.add("小白");
//迭代器迭代
Iterator it = coll.iterator();
while(it.hasNext()){
//将Object对象强转成String
String s =(String) it.next();
System.out.println(s);
}
}
}
使用泛型:
好处:将运行时期的ClassCastException,转移到了编译时期变成了编译失败。 避免了类型强转的麻烦。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo3 {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("张三");
coll.add("李四");
//将运行时期的ClassCastException,转移到了编译时期变成了编译失败
//coll.add(0);//直接报错
Iterator<String> it =coll.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
}
}
含有泛型的方法 :
定义时可以不确指定泛型的类型,创建对象的时候才指定。
class AA {
//使用泛型,类型可以不明确
//好处:用来灵活地将数据类型应用到不同的类、方法、接口当中,将数据类型作为参数进行传递
public <E> void show(E e) {
System.out.println(e.getClass());
}
public <E> E show2(E e) {
return e;
}
}
public class CollectionDemo04 {
public static void main(String[] args) {
// 创建对象
AA aa= new AA();
//调用show方法,创建的String类型对象,所以在创建对象才确定泛型,数据类型为String
aa.show("hello");
//数据类型为Integer
aa.show(10);
}
}
泛型通配符
在不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo05 {
public static void main(String[] args) {
Collection<String> coll =new ArrayList<>();
coll.add("张三");
coll.add("李四");
method(coll);
Collection<Integer> coll1=new ArrayList<>();
coll1.add(20);
coll1.add(30);
method(coll1);
}
public static Collection<?> method(Collection<?> collection){
System.out.println(collection);
return collection;
}
}