JAVA关于Collectin集合和List集合的常用方法详解

集合

面向对象语言对事的体现都是以对象的形式,为了方便对对象的操作,JAVA提供了集合类。
数组与集合的区别:
	*长度区别
		数组的长度是固定的而集合的长度是可以改变的
	*存储元素类型的区别
		数组既可以存储基本类型数据还可以存储引用类型数据,而集合只能存储引用类型的数据
	*内容区别:
		数组只能存储相同数据类型的元素,而集合可以存储不同数据类型的元素
	集合有三种重要的类型:
		List:一个有序的集合,可以存放重复的数据
		Set:一个无序的集合,不允许存放重复的数据
		Map:一个无序集合,集合中包括一个键对象,一个值对象,键对象不允许重复,值对象可以重复

Collection集合

因为Collection集合是接口,不允许实例化,所以得用多态的形式实例化。
Collection集合下又有两个子接口:
	List(存储元素特点):有序可重复
	Set:无序不可重复
Collection集合的功能:
	添加功能:
		boolean add(Object obj):添加一个元素
		boolean addAll(Collection c):添加一个集合的元素  (给一个集合添加进另一个集合中的所有元素)
	删除功能
		void clear():移除所有元素
		boolean remove(Object o):移除一个元素
		boolean removeAll(Collection c):移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素,如果没有交集元素 则删除失败 返回false
	判断功能
		boolean contains(Object o):判断集合中是否包含指定的元素	
		boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true)
		boolean isEmpty():判断集合是否为空
	获取功能
		Iterator<E> iterator()
	长度功能
		int size():元素的个数
	交集功能
		boolean retainAll(Collection c):获取两个集合的交集元素(交集:两个集合都有的元素)
	集合转换为数组
		Object[] toArray()
public static void main(String[] args) {
    Collection c=new ArrayList();
    c.add("abc");//添加元素abc
    Collection c1=new ArrayList();
    c1.addAll(c);//将集合c元素全部添加到c1中
    c1.clear();//将c1集合清空
    c.remove("abc");//移除c中的"abc"元素
    c.add("abc");
    System.out.println(c.contains("abc"));//判断c集合是否包含"abc"
    System.out.println(c.isEmpty());//判断c集合是否为空
    Collection c2=new ArrayList();
    c2.add("abc");
    c2.add("abcd");
    c2.add("abcde");
    c2.retainAll(c);//使c2集合保留c集合中的元素
    Iterator it=c2.iterator();//调用c2集合的迭代器
    //使用集合判断,要是下一指针指向有元素,就输出。
    while (it.hasNext()){
        System.out.println(it.next());
    }
    System.out.println(c2.removeAll(c));//因为c2和c集合的元素一样,所以c2移除c集合元素成为了空集合
    Object[] o=c.toArray();//将集合转换为数组,并使用size()与循环输出
    for (int i = 0; i <c.size() ; i++) {
        System.out.println(o[i]);
    }
}
迭代器的原理
为什么迭代器要定义为接口?
	如果迭代器是一个类,在我们想要调用该类的方法时,我们需要创建该类的对象,但是JAVA中有许多集合类的数据结构不同,存储方式和遍历方式不同,所以不能定义迭代器类
List集合
List集合接口下有三个实现类
	ArrayList:底层采用的是数组存储元素的,所以ArrayList集合适合查询,不适合随机增删元素
	LinkedList:底层采用的是双向链表数据结构存储数据,适合随机增删元素,不适合查询
	Vector:底层和ArrayList集合相同,但是在多线程的情况下,但是Vector是线程安全的,效率低
List集合功能
	void add(int index,E element):	在指定索引处添加元素
	E remove(int index):移除指定索引处的元素  返回的是移除的元素
	E get(int index):获取指定索引处的元素
	E set(int index,E element):更改指定索引处的元素 返回的而是被替换的元素
//List集合是有序的,元素可重复
public static void main(String[] args) {
    List list=new ArrayList();
    //向list集合中添加元素
    list.add("abc");
    list.add("zhouyuyang");
    list.add(1,"liao");
    list.add(0,"zhaorunfa");
    list.remove(2);//移除索引为2的元素
    System.out.println(list.set(1, "liao"));//更改指定索引处的元素,并且返回被更改元素
    System.out.println(list.get(0));//得到指定位置元素
    System.out.println(list.size());
    Iterator it=list.iterator();
    while (it.hasNext()){
        System.out.println(it.next());
    }
}
List集合特有的遍历功能
	List集合可以用for循环与size()和get()方法进行遍历
 public static void main(String[] args) {
        List list=new ArrayList();
        list.add("zhaorunfa");
        list.add("llll");
        list.add(2312);
        for (int i = 0; i <list.size() ; i++) {
            System.out.println(list.get(i));
        }
 }
ListIterator迭代器特有的功能
	ListIterator继承Iterator,可以使用Iterator的方法
	ListIterator的特有功能
		boolean hasPrevious():			是否存在前一个元素					
		E previous():					返回列表中的前一个元素
	有了这个方法,就可以进行反向遍历
并发修改异常
	若我们使用Iterator迭代器进行迭代的过程中,对集合进行增删操作的话,就会出现并发修改异常。
	原因是迭代过程依赖集合,我们往集合添加好元素之后,获取迭代器的时候迭代器已经知道集合的元素个数了,那我们在遍历的过程中通过集合的增删方法操作元素,就会改变集合的元素个数,就会出错。
	使用ListIterator迭代器的自有的添加方法就可以解决该问题。
 public static void main(String[] args) {
        List list=new ArrayList();
        list.add("zhaorunfa");
        list.add("aa");
        list.add("bb");
        list.add(1213);
        list.add("aa");

        /*
        //出现ConcurrentModificationException
        Iterator it=list.iterator();
        while (it.hasNext()){
            String str=(String) it.next();
            if(str.equals("aa")){
                list.add("bbb");
            }
        }

         */
        ListIterator it=list.listIterator();
        while (it.hasNext()){
            Object str=it.next();
            if(str.equals("aa")){
                it.add("bbb");

            }
        }
        System.out.println(list);
         while (it.hasPrevious()){
            System.out.println(it.previous());
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值