目录
前言
我们知道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 我们讲着重讲解这三个实现类的使用方法,以及特点。