学习过了ArrayList,知道集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用。
为了满足不同的业务场景需求Java还提供了很多不同特点的集合给我们选择。
集合体系结构
Collection是一个接口,并且是支持泛型的接口,这个接口只规定了单列集合的特点,比如基本的增删改查,同时Collection<E>下面又有很多子接口List<E>接口和Set<E>接口
Collection的常用方法
collection提供的所有的常见方法是所有单列集合都可以直接去使用的。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class CollectionTest2API {
public static void main(String[] args) {
/*首先肯定要用collection定义一个集合,集合类型是String类型的数据,
collection是接口不能之间new对象,那就挑一个他的实现类ArrayList的集合对象
给到Collection集合的变量c来记住*/
Collection<String> c = new ArrayList<>();//多态写法
//1.public boolean add(E,e):添加元素,添加成功返回true
c.add("java1");c.add("java1");c.add("java2");c.add("java2");c.add("java3");
System.out.println(c);
//2.public void clear(E e):清空集台中所有的元素。
//c.clear();
//System.out.println(c);
//3.public boolean isEmpty():判断当前集合是否为空。
System.out.println(c.isEmpty());
//4.public int size():返回集合中元素的个数。(获取集合的大小)
System.out.println(c.size());
//5.public boolean contains(0bject obj): 判断当前集合中是否包含给定的对象
System.out.println(c.contains("java1"));
System.out.println(c.contains("Java1"));
//6.public boolean remove(E e):把给定的对象在当前集合中删除:如果有相同的元素他会删除前面一个元素
System.out.println(c.remove("java1"));
System.out.println(c);
//7.public object[] toArray():把集合中的元素,存储到数组中。
Object[] arr = c.toArray();
System.out.println(Arrays.toString(arr));//可以用Arrays调用toString方法把数组打印出来
//非要把集合转为字符串数组怎么办:
/**
*用c调用toArray方法在括号里面new一个String类型的数组
* 在中括号里面可以填上元素的大小
* 这样就相当于指定了一个String类型的数组,也就是一个容器给到底层
* 底层就会把集合中的元素遍历出来给到数组
* 再去接她返回的结果就是一个String类型的数组返回给我们
* 这样就会得到指定类型的数组
*/
String[] arr2 = c.toArray(new String [c.size()]);
System.out.println(Arrays.toString(arr2));
System.out.println("--------------------------------------------------------");
//把一个集合的全部数据倒入到另一个集合中去
Collection<String> c1 = new ArrayList<>();
c1.add("java1");
c1.add("java2");
Collection<String> c2 = new ArrayList<>();
c2.add("java3");
c2.add("java4");
c1.addAll(c2);//就是把c2集合中的全部数据(拷贝了一份倒进去)倒入到c1中去,(相当于批量添加数据了)注意:数据类型要相适应
System.out.println(c1);
System.out.println(c2);//c2的数据还是有的
}
}
collection的遍历方式
1.迭代器(Iterator)
首先,一定要通过集合对象调用Iterator()方法,就会得到一个集合的迭代器对象,迭代器对象默认指向当前集合的第一个元素的;接着就可以用迭代器的常用方法来遍历集合。一个是hasNext()方法,一个是next()。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo1 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("赵敏");
c.add("小邵");
c.add("速速");
c.add("灭绝");
System.out.println(c);
//c = [赵敏, 小邵, 速速, 灭绝]
// it
//使用迭代去遍历集合
//1.从集合对象中获取迭代器对象。
Iterator<String> it = c.iterator();
/*System.out.println(it.next());
System.out.println(it.next());//从取完第一个之后,再从第二个
System.out.println(it.next());//第三个
System.out.println(it.next());//第四个*/
//System.out.println(it.next());//第五个没有就会出现异常,所以不要越界
//2.应该使用循环结合迭代器遍历集合
while(it.hasNext()){//如果有数据就会返回true 进到循环里面来
String ele= it.next();//此时就使用next方法来取出数据,取出来之后会移到下一个位置
System.out.println(ele);
//System.out.println(it.next());
}
}
}
2.增强for
如果使用for循环,那么这个集合就必须要支持索引的,但collection并没有规定结合的索引问题,只有List集合才支持索引。所以collection是不支持直接用for循环来遍历的。
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo2 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("赵敏");
c.add("小邵");
c.add("速速");
c.add("灭绝");
System.out.println(c);
//c = [赵敏, 小邵, 速速, 灭绝]
// ele
//使用增强for循环遍历集合或者数组
for (String ele : c) {
System.out.println(ele);
}
//c.for再回车
/*for (String els : c) {
}*/
String[] names = {"的卡拉", "大法师", "北京人", "咖啡馆"};
for (String name : names){
System.out.println(name);
}
}
}
3.Lambda表达式
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
public class CollectionDemo3 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("赵敏");
c.add("小邵");
c.add("殷速速");
c.add("周芷若");
System.out.println(c);
//c = [赵敏, 小邵, 殷速速, 周芷若]
// s
//default void forEach(Consumer<? super T> action): 结合Lambda表达式遍历集合:
//Consumer是一个接口不能直接创建对象 所以可以直接new一个匿名内部类对象出来
c.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("--------------------------");
c.forEach((String s) -> {
System.out.println(s);
});
System.out.println("--------------------------");
c.forEach(s -> System.out.println(s));
System.out.println("--------------------------");
c.forEach(System.out::println);
}
}
案例:遍历集合中的自定义对象。
import java.util.ArrayList;
import java.util.Collection;
/**
*目标:完成电影信息的展示
* new Movie("《肖生克的救赎》",9.7,"罗宾斯")
* new Movie("《霸王别姬》",9.6,"张国荣、张丰毅")
* new Movie("《阿甘正传》",9.5,"汤姆.汉克斯")
*/
public class CollectionTest04 {
public static void main(String[] args) {
//1.创建一个集合容器负责存储多部电影对象
Collection<Movie> movies = new ArrayList<>();//多态的方法定义一个collection类型的对象出来指向右边的集合容器对象
//用这个集合容器负责存储多部电影对象用movies调add方法添加电影对象
movies.add(new Movie("《肖生克的救赎》",9.7,"罗宾斯"));
movies.add(new Movie("《霸王别姬》",9.6,"张国荣、张丰毅"));
movies.add(new Movie("《阿甘正传》",9.5,"汤姆.汉克斯"));
System.out.println(movies);
//使用增强for循环遍历
for (Movie movie : movies) {
System.out.println("电影名:"+movie.getName());
System.out.println("评分:"+movie.getScore());
System.out.println("主演:"+movie.getActor());
System.out.println("------------------------------------------------");
}
}
}
public class Movie {
private String name;
private Double score;
private String actor;
public Movie() {
}
public Movie(String name, Double score, String actor) {
this.name = name;
this.score = score;
this.actor = actor;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
@Override
public String toString() {
return "Movie{" +
"name='" + name + '\'' +
", score=" + score +
", actor='" + actor + '\'' +
'}';
}
}
集合中存储的是元素对象的地址!