/*
* 数据结构,容器:
* 用来装对象....,等各种管理对象的容器。
*
* 容器有相同的操作标准:
* (1)增
* (2)删
* (3)改
* (4)查
* ...
*
* Java给这些集合抽取两大接口:
* 1、Collection:
* 规范单值集合的接口,obj --》单身party
* 2、Map
* 规范对值集合的接口,(key,value) -->情侣party
*
* 一、Collection
* 1、Collection:接口
* (1)它是根接口
* (2)它没有直接的实现类,有更具体的子接口:List和Set...
* (3)有一些的元素是可以重复的,有些集合的元素是不能重复,有些集合的元素是有序的,有些集合的元素是无序的
*
* 2、API
* (1)添加
* add(Object obj):添加一个元素
* addAll(Collection c):添加多个元素
* (2)获取有效元素的个数
* int size()
* (3)是否包含
* contains(Object o) :判断o是否在当前的集合中
* containsAll(Collection c) :判断c是否是当前集合的子集
* (4)boolean isEmpty() :判断当前集合是否为空
* 等价于 集合对象.size()==0
* (5)remove(Object o):删除一个
* removeAll(Collection c):删除多个 this = this - this ∩ c
* clear():清空所有
*
* (6)retainAll(Collection<?> c) :保留交集 this = this ∩ c
* (7)Object[] toArray() :把集合中的元素用一个数组返回
*/
public class TestCollection {
@SuppressWarnings("all")
@Test
public void test9(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
Object[] all = c.toArray();
System.out.println(Arrays.toString(all));
}
@SuppressWarnings("all")
@Test
public void test8(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
Collection c2 = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c2.add("张三");
c2.add("杨洪强");
c.retainAll(c2);
System.out.println(c);
System.out.println(c2);
}
@SuppressWarnings("all")
@Test
public void test7(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
Collection c2 = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c2.add("张三");
c2.add("杨洪强");
c.removeAll(c2);
System.out.println(c);//说明ArrayList重写了toString
}
@SuppressWarnings("all")
@Test
public void test6(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
Collection c2 = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c2.add("张三");
c2.add("李四");
c.removeAll(c2);
System.out.println(c);//说明ArrayList重写了toString
}
@SuppressWarnings("all")
@Test
public void test5(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
c.remove("张三");//删除一个
System.out.println(c);//说明ArrayList重写了toString
}
@SuppressWarnings("all")
@Test
public void test4(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
Collection c2 = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c2.add("张三");
c2.add("李四");
Collection c3 = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c3.add("张三");
c3.add("杨洪强");
System.out.println(c.containsAll(c2));//c2是c的子集
System.out.println(c.containsAll(c3));//c3不是c的子集
}
@SuppressWarnings("all")
@Test
public void test3(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
System.out.println(c.contains("张三"));
System.out.println(c.contains("杨洪强"));
}
@SuppressWarnings("all")
@Test
public void test2(){
/*
* 我这里左边写Collection,目的是只关注Collection
* 因为多态引用时,c编译期间只能访问Collection的方法
*/
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add(1);
c.add(2);
c.add(3);
Collection c2 = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c2.add("张三");
c2.add("李四");
c2.add("王五");
c.addAll(c2);//把c2中的所有元素都添加到c集合中
// c.add(c2);
System.out.println("获取有效元素的个数:" + c.size());
System.out.println(c);
}
@SuppressWarnings("all")
@Test
public void test1(){
/*
* 我这里左边写Collection,目的是只关注Collection
* 因为多态引用时,c编译期间只能访问Collection的方法
*/
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
System.out.println("获取有效元素的个数:" + c.size());
}
}
Collection系列集合的遍历三种方式
/*
* Collection系列的集合的遍历:挨个访问集合的元素
* (1)Object[] toArray():先返回数组,然后遍历数组
* (2)迭代器设计模式
* 每一个Collection系列的集合,内部都自带一个迭代器,类似于,每一趟公交车上都有自己的售票员
*
* java.util.Iterator:接口
* 它是所有售票员的标准接口。
* (1)判断是否还有下一个元素:hasNext()
* (2)访问它的下一个元素:next()
* (3)请下一个元素下车:remove()
*
* java.util.Iterator:迭代器接口,这个接口的实现类在每一种集合类中,例如:ArrayList内部有一个内部类实现了Iterator接口
* 这里声明为内部类有两个原因:
* (1)每一种集合的内部实现(物理结构不同),意味着对迭代器(售票员)的实现是不同的,每一种集合都要单独定制迭代器
* (2)内部类可以直接访问外部类的私有的属性,成员,迭代器就可以直接访问集合的私有的元素。
*
* (3)foreach:增强for循环
* foreach循环可以用于遍历数组、Collection系列的集合等容器。
* 语法结构:
* for(元素的类型 元素临时名称 : 数组和集合名){
*
* }
*
* 不同于普通for循环。
* for(int i=0; i<5; i++){
* }
*
* 什么样集合或容器类型可以使用foreach循环?
* 凡是实现了java.lang.Iterable接口(可迭代)的集合或容器都支持foreach循环
*
* foreach底层还是调用Iterator迭代器来遍历集合。
*/
public class TestIterator {
@SuppressWarnings("all")
@Test
public void test5(){
//我自己写的动态数组
MyArrayList list = new MyArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
for (Object obj : list) {
System.out.println(obj);
}
}
@SuppressWarnings("all")
@Test
public void test4(){
String[] arr = {"hello","world","java"};
for (String string : arr) {
System.out.println(string);
}
}
@SuppressWarnings("all")
@Test
public void test3(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
//Object:元素的数据类型
//obj:临时的元素名称
//c:要遍历的集合的名称
for (Object obj : c) {
System.out.println(obj);
}
}
@SuppressWarnings("all")
@Test
public void test2(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
//返回这个集合自带的迭代器对象,相当于你找到了售票员
//让售票员去挨个的访问元素
Iterator iterator = c.iterator();
while(iterator.hasNext()){
String obj = (String) iterator.next();
//要姓“王”下车
if(obj.startsWith("王")){
iterator.remove();
}
}
System.out.println(c);
}
@SuppressWarnings("all")
@Test
public void test1(){
Collection c = new ArrayList();//ArrayList是Collection下面的一个实现类而已
c.add("张三");
c.add("李四");
c.add("王五");
//返回这个集合自带的迭代器对象,相当于你找到了售票员
//让售票员去挨个的访问元素
Iterator iterator = c.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
}
}