前言
我们知道Java容器一节有很多类或者接口
本文先浅谈一下Collection集合的使用方法以及细节处理
一、Collection是什么?
Collection是属于容器Iterable的一种,与Map平级,下设分两种类型 ,Set和List接口,集合只要是分两组(单列集合,双列集合),Set和List接口是实现子类的单列集合,Collection作为容器,可以存放任何类的元素(在没有使用泛型的情况下),可以同时加进去int ,Double,String等类型,行为方式比数组更加方便灵活,不需要设定空间大小,这一点很重要,也就是说可以存放任意数量的元素(理论上)
/*
Iterable<-Collection
作为接口指向Collection 有Set和List连接Collection接口
Collection<--Set 和Collection<--List
Set下设TreeSet和HashSet 指向接口Set
Set<--TreeSet 和 Set<--HashSet
List 下设接口Vector 和ArrayLinkedList和ArrayList
List <--Vector
List <--ArrayLinkedList
List <--ArrayList
*/
二、Collection的使用方法以及性质
1.性质
//1.Collection实现子类可以存放多个元素,每个元素可以是Object
//2.有些Collection的实现类,可以存放重复的元素,有些是不可以 的
//3.有些Collection的实现类,有些是有序 的(List),有些不是有序(Set)
//4.Collection接口没有直接实现的子类,是通过它的子接口Set和List来实现
2.Collection的常用使用方法
//Collection的常用方法 //1.add 添加 List list = new ArrayList(); list.add("添加方法: add()");//添加单个元素 list.add(10);//相当于collection.add(new Integer (10)); list.add(true); System.out.println(list);//[添加方法: add(), 10, true] //2.list.remove(0);//删除第一个元素 list.remove(true);//删除指定对象 System.out.println(list);// //3.contains:查找指定元素是否存在 System.out.println(list.contains(10));//true //4.isEmpty 判断是否为空 System.out.println(list.isEmpty());//false //5.clear 清空 清空对象中所有的元素 list.clear(); System.out.println(list);//打印为:[] //6.addAll 添加多个元素 list.addAll(Collection e) 表示添加的是一个集合内容,所以为添加多个元素 ArrayList arrayList=new ArrayList();//list中的元素已经使用clear清空 arrayList.add("红楼梦"); arrayList.add("三国演义"); list.addAll(arrayList); System.out.println(list);//输出为: [红楼梦, 三国演义] //7.containsAll 你查看多个元素是否存在 list.containsAll(Collection e) 判断list中是否存在Collection e的多个元素 System.out.println(list.containsAll(arrayList));//true //8.removeAll 同时删除多个元素 list.removeAll (Collection e),删除list中 list.add("西游记"); list.removeAll(arrayList); System.out.println(list);//[西游记]
3.Collection遍历方法
1) 增强for方法 ,这个方法是在这三种方法中最为简便的一种方法,执行起来只需要三行代码
如:for(Object book:col) 其中book是任意起名的,相当于 Object book=(Object)col;意思为,讲Collection中的元素col向上转型给Object的对象book,然后进行遍历
public static void main(String[] args) { Collection col = new ArrayList(); col.add(new Book("红楼梦", "曹雪芹", 50.0)); col.add(new Book("西游记", "曹吴承恩", 100)); col.add(new Book("三国演义", "罗贯中", 120.0)); col.add("mark"); //使用增强for循环 底层也是用迭代器 可以理解为简化版的迭代器 for(Object book:col){ System.out.println(book); } //增强for也可以直接在数组使用 int[]num={1,2,3,4}; for (int i:num){ //int 为数组类型 ,i自定义的名字,num对应的数组名 System.out.println("i="+i); } //快捷键 I 直接回车 }
2) 迭代器遍历
List list=new ArrayList(); list.add(new Dog("xiaohuang", 12)); list.add(new Dog("xaiolan", 10)); list.add(new Dog("xiaohong", 8)); list.add("xiaoming"); Iterator iterator=list.iterator(); //迭代器遍历方法 while(iterator.hasNext()){ Object obj=iterator.next();//进入iterator的运行类型Dog System.out.println(obj); }
3)普通for遍历
//普通for方法 for (int i = 0; i <list.size() ; i++) { System.out.println(list.get(i)); }
4.Collections工具类常用方法
主要是用于排序和正删改查
1.排序有sort方法 由COllections.sort(容器名)得到的是正常字典顺序的排序,就是数字升序,字母是按照字母表升序,如果第一个字母相同根据sort内部的Comparable接口的CompareTo方法进行排序。
2.可以选择自定义排序方法
如 : 其中new Comparator是接口,在里面重写自己的方法Compare方法传入两个形参 Object类进行比较,在Compare方法中自定义比较形式
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String) o1).length() - ((String) o2).length();
}//根据字符串大小进行排序
});
public class CollectionSetting { public static void main(String[] args) { //Collections 工具类 //1. //创建 ArrayList 集合 用于测试 List list = new ArrayList(); list.add("tome"); list.add("micker"); list.add("why"); list.add("wjq"); list.add("wjq"); System.out.println(list); //reverse(List) :反转List中的元素顺序 Collections.reverse(list); System.out.println("list: " + list); //shuffle(list) :对list集合元素进行随机排序 for (int i = 0; i < 5; i++) { Collections.shuffle(list); System.out.println("第" + i + "次: " + list); } //sort(List):根据元素的自然顺序对指定List集合元素按升序排序 Collections.sort(list); System.out.println("自然排序后..."); System.out.println("list: " + list); //sort(List,Comparator) :根据指定的Comparator进行比较 //传入一个比较器 //List 允许重复 如果长度相同或者字符串相同(根据比较器来) 也可以放进去 ,但是对于Set来说不允许重复 不能放进去 Collections.sort(list, new Comparator() { @Override public int compare(Object o1, Object o2) { return ((String) o1).length() - ((String) o2).length(); }//根据字符串大小进行排序 }); System.out.println("list根据字符串大小进行排序: " + list); //swap(List,int,int) //将指定位置的List集合中的i 和j进行交换 //如果int越界 会抛出异常 /** * 第二组 查找 */ //Object max(Collection) :根据元素的自然顺序,返回给定集合中的最大元素 System.out.println("自然排序的最大元素:" + Collections.max(list)); //max(Collection,Comparator):根据比较器需求得到排序之后的最大值 Object max = Collections.max(list, new Comparator() { @Override public int compare(Object o1, Object o2) { return ((String) o1).length() - ((String) o2).length(); } }); System.out.println("比较长度之后的list:" + max); //Object min 与上面的 max一样 //int frequency(Collection Object) :返回指定集合中的指定元素出现的次数 System.out.println("容器中出现指定元素的次数"+Collections.frequency(list, "wjq")); //void copy(List dest,List src) :将后面的容器copy给前面的容器 //不能直接将后面的容器copy给前面的空容器 会抛出异常 // ArrayList list1=new ArrayList(); // Collections.copy(list1, list);//IndexOutOfBoundsException: Source does not fit in dest // System.out.println(list1); //要先进行对于空容器添加元素 最少与copy对象的元素个数相同 ArrayList list1=new ArrayList(); for (int i = 0; i <list.size() ; i++) { list1.add(" "+i); } Collections.copy(list1, list); System.out.println("copy赋值之后的新容器list1: "+list1); //boolean replaceAll(List list,Object oldVal,Object newVal) :使用新值来替换list容器中的旧值 Collections.replaceAll(list, "why", "王红岩"); System.out.println(list); } //max(Collection,Comparator):根据比较器需求得到排序之后的最大值 } class A{ int age1;//10 public A(int age) { this.age1=age;//10 10 } // void add(){ // System.out.println(age1);//10 // } } class B extends A{ public B(int age) { super(age); } // public B(int age) { // super(age); // age1 // } }
5.Set和List的比较
1.List可以存放null ,而且容许元素重复,对于重复加入的(add)的元素都可以进入数组中,List集合类中的怨怒是是有序的(填入和储存顺序是一致的)
2.Set方法和List大部分方法是一致的,使用起来只有个别不同,但是Set有一下特性
//set的接口实现类的对象(Set接口对象),不能存放重复的元素,可以添加一个null //存放数据是无序的(添加的顺序和取出的顺序不一致) //存放数据顺序有底层算法,数组加链表的形式 //虽然取出的数据顺序不是添加的顺序,但是它固定数据的顺序,不会改变 //
public static void main(String[] args) { //List集合类中的元素是有序的(添加顺序和储存顺序一致),且可重复 List list = new ArrayList(); list.add("jack"); list.add("tom"); list.add("tom");//可以重复 //对于运用到index索引的方法,index一定是在数组或者容器中有对应元素的,即不会索引越界OutIndexException //List有很多实现类,常用的为Vector ArrayList LinkedList System.out.println(list);//[jack, tom, tom] }
6.List的常用方法
Set的常用方法与List的常用方法类似,只有个别不同
public static void main(String[] args) { //List集合类中的元素是有序的(添加顺序和储存顺序一致),且可重复 List list = new ArrayList(); list.add("jack"); list.add("tom"); list.add("tom");//可以重复 //对于运用到index索引的方法,index一定是在数组或者容器中有对应元素的,即不会索引越界OutIndexException //List有很多实现类,常用的为Vector ArrayList LinkedList System.out.println(list);//[jack, tom, tom] //list支持索引,每一个元素都有对应的顺序索引,可以通过索引找到元素进行加减 //索引从0开始 list.remove(1);//删除索引为1的元素 System.out.println(list);//[jack, tom] //1.add方法 //add(int index,Object s):在index的位置上插入s元素 list.add(1, "王红岩"); System.out.println(list);//[jack, 王红岩, tom],插入到相应位置,原来元素整体后移 //2.addAll(int index,Collection c) 在index的位置,插入集合中的元素 List list1 = new ArrayList(); list1.add("小明"); list1.add("小王"); list.addAll(1, list1);//讲list1的元素 小明小王加入到list的索引为1的位置 System.out.println(list);//[jack, 小明, 小王, 王红岩, tom] //3.remove(int index)消除方法 ,消除指定索引index处的元素 list.remove(0); System.out.println(list);//[小明, 小王, 王红岩, tom] //4.set(int index ,Object o) 在index的索引上,讲对应的元素,替换为元素 o list.set(3, "小红"); System.out.println(list);//[小明, 小王, 王红岩, 小红] //5.List subList(int fromIndex,int toIndex)//返回fromIndex 到 toIndex的位置子集合 前闭后开 不包括toIndex System.out.println(list.subList(0, 1));//[小明] //6.indexOf() 查找list容器中是否有指定元素,或者索引位置有无元素 有返回下标 无返回-1 System.out.println(list.indexOf(" "));//-1 //7.lastIndexOf() 查找容器中最后出现指定元素的下标, 有返回下标 无返回-1 System.out.println(list.lastIndexOf("王红岩"));//2 }
总结
通过本文,我们知道了,Collection的强大功能,其下设两大接口Set 和List的常用方法以及细则(例如有序和无序等),且对于Collection接口的遍历三大方法做了解释,以List为例,这三种都可成功遍历,最简单的还是增强For遍历,最后是对于Collections工具类的使用,其内接接口以及方法的使用无不显示了Collection的强大能力。
在下一章,我们讲着重讲解List的常用方法细则,List有很多实现类,常用的为Vector ,ArrayList LinkedList 我们讲着重讲解这三个实现类的使用方法,以及特点。