package com.bjpowernode.collection;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
/**
* Collection集合的基本操作
*/
public class Test01 {
public static void main(String[] args) {
//1) 创建Collection集合
//Collection在Java中是一个接口, 需要赋值实现类对象, 可以给Collection接口引用赋值ArrayList对象,或者 HashSet对象,或者 LinkedList对象....
Collection collection = new ArrayList(); //new运算符在堆中创建ArrayList对象, 该ArrayList对象才是存储数据的容器, 定义了Collection接口引用指向堆中的ArrayList对象, 通过collection接口调用它的抽象方法时,实际执行的是ArrayList对象的方法, 这是多态
// collection = new HashSet();
//2) 向集合中添加数据调用add()方法, 集合中只能存储引用类型对象
collection.add("hello");
collection.add("world");
//当向集合中添加基本类型数据时, 系统 会自动装箱
collection.add(456); //系统 会先把 456 自动装箱 为Integer对象, 再把Integer对象添加到集合中
collection.add(3.14); //会先根据3.14创建Double对象,再把Double对象添加到集合中
collection.add( new Date() );
//3) 直接打印collection, 当前collection实际引用的是ArrayList对象, 打印时会调用ArrayList对象的toString()方法
System.out.println( collection );
//[hello, world, 456, 3.14, Sat Oct 17 14:39:40 CST 2020]
//4) foreach遍历集合中所有的数据
for (Object o : collection) {
System.out.println( o );
}
//5) 删除集合中的元素
collection.remove("hello");
System.out.println( collection); //[world, 456, 3.14, Sat Oct 17 14:45:27 CST 2020]
collection.remove("aaa"); //集合中没有"aaa"元素,删除失败,返回false
System.out.println(collection);
//6 判断
System.out.println( collection.contains("456")); //false
System.out.println( collection.contains(456)); //true
System.out.println( collection.isEmpty() ); //false
System.out.println( collection.size() ); //4
}
}
package com.bjpowernode.collection;
import javax.sound.midi.Soundbank;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/**
* 集合泛型与迭代
*/
public class Test02 {
public static void main(String[] args) {
/* 1)
在实际开发中,通常情况下,在集合中只存储同一个类型的数据, 在创建Collection集合时,可以通过泛型指定集合中存储元素的数据类型
泛型就是把数据类型作为参数传递
Collection接口的定义如下:
public interface Collection<E> extends Iterable<E> {}
在Collection接口名后面有<E>, 这就是泛型,在创建Collection集合时,可以给泛型参数E传递一个数据类型, 这个数据类型就是在colleciton集合中存储元素的数据类型
*/
//定义Collection集合存储String字符串, 给collection接口的泛型参数E传递String类型, 在new ArrayList对象时, ArrayList后面的尖括弧中不需要指定String类型, 系统 可以自动推断出来集合中存储的是String. 如果使用的JDK是1.6版本或者更早, 在创建ArrayList对象时需要指定泛型
Collection<String> collection = new ArrayList<>();
// Collection<String> collection = new HashSet<>();
//2) 向集合中添加数据,只能添加泛型指定的String字符串
collection.add("jj");
collection.add("mm");
collection.add("dd");
collection.add("jj");
collection.add("dd");
collection.add("mm");
//如果向集合中添加的数据不是泛型指定的String类型则语法错误, 这就是泛型 的好处,可以在编译阶段进行数据类型检查
// collection.add(456);
System.out.println(collection); //[jj, mm, dd, jj, dd, mm]
/*3)
所有的Collection集合都有iterator()方法,该方法返回Iterator迭代器,可以迭代遍历集合中的每个元素
1) 刚刚调用iterator()方法返回一个新的Iterator迭代器, Iterator迭代器有一个游标,指向第一个元素的前面
2) iterator迭代器的hasNext()方法判断游标后面是否还有元素,如果有元素返回true,否则返回false
3) Iterator迭代器的next()方法可以返回游标后面的元素, 并且把游标向后移, 如果游标已经指向最后一个元素的后面时, 再调用next()方法会产生java.util.NoSuchElementException没有元素异常
可以结合 hasNext()方法 与 next() 方法实现集合中元素的遍历
*/
Iterator<String> stringIterator = collection.iterator(); //Ctrl + Alt + V
while ( stringIterator.hasNext() ){
//当hasNext()返回true表示游标后面还有元素时, 调用next()把游标后面的元素返回
System.out.println( stringIterator.next());
}
//循环结束后, stringIterator迭代器的游标就已经指向最后一个元素的后面了, stringIterator迭代器就不能再用了, 即Iterator迭代器是一次性的, 如果还想要迭代, 重新调用iterator()方法返回一个新的迭代器
//4) 从集合中删除元素调用remove()方法, 只能删除第一个匹配的元素
collection.remove("jj");
System.out.println(collection); //[mm, dd, jj, dd, mm]
//需求:删除所有的mm, 可以使用循环删除
while ( collection.contains("mm")){
collection.remove("mm");
}
System.out.println( collection);
//存在的问题: contains()判断时需要遍历一次集合, remove()删除时还需要遍历一次集合, 下次循环也是这样, 即需要遍历好多次集合
//在删除集合中所有相同元素时,或者 删除集合中多个符合条件元素时, 可以使用迭代删除, 在实际开发中使用迭代时,可以直接输入 itco 生成for循环的迭代代码块,. 在for循环初始化表达式中调用iterator()返回一个迭代器 , 循环条件 是迭代器hasNext()为true表示游标后面还有元素, 在for循环体中调用next()返回游标后面的元素
for (Iterator<String> iterator = collection.iterator(); iterator.hasNext(); ) {
String next = iterator.next();
if ("dd".equals(next)){
iterator.remove(); //调用迭代器的remove()方法删除元素
//注意: 在迭代过程中, 不能调用collection集合的add()/remove()方法, 可能会产生异常java.util.ConcurrentModificationException
// collection.remove("dd");
}
}
System.out.println( collection ); //[jj]
//注意: foreach循环只能 读集合中的元素,在foreach循环期间, 如果调用collection集合的add()/remove()添加删除元素时,可能 会产生异常java.util.ConcurrentModificationException
}
}
package com.bjpowernode.collection;
import java.util.ArrayList;
import java.util.Collection;
/**
* Collection集合之间的操作
*/
public class Test03 {
public static void main(String[] args) {
//创建存储String字符串的集合
Collection<String> collection = new ArrayList<>();
//添加元素
collection.add("aa");
collection.add("bb");
collection.add("cc");
System.out.println(collection); //[aa, bb, cc]
//1) 可以在一个已存在的Collection集合上 创建一个新的Collection集合
Collection<String> collection2 = new ArrayList<>(collection);
System.out.println( collection2 ); //[aa, bb, cc]
//2) 可以把一个集合中所有的元素添加到另外一个集合中
Collection<String> collection3 = new ArrayList<>();
System.out.println(collection3); //[]
collection3.addAll(collection); //把参数collection集合中所有元素都添加到collection3中
System.out.println( collection3 ); //[aa, bb, cc]
//3) 可以从集合中删除在参数集合中出现的所有元素
collection2.add("xx");
collection2.add("aa");
collection2.add("yy");
System.out.println( collection2 ); //[aa, bb, cc, xx, aa, yy]
collection2.removeAll(collection); //遍历collection2集合中所有的元素,如果这个元素在参数collection集合中就删除
System.out.println(collection2); //[xx, yy]
//4) 只保留 在参数集合中出现的元素
collection3.addAll(collection2);
System.out.println(collection3); //[aa, bb, cc, xx, yy]
collection3.retainAll(collection); //遍历collection3集合中的元素,如果该元素在参数collection集合中就保留 , 不在collection集合中就删除
System.out.println( collection3); //[aa, bb, cc]
}
}