javase-day04

CollectionDemo01

package com.se.aCollection;

import java.util.ArrayList;
import java.util.Collection;

/**
 * Collection接口的常用方法练习:
 * <p>
 * Collection接口是子接口List/Set/Queue的父接口,里面提供了子类常用的方法
 */

public class CollectionDemo01 {
    public static void main(String[] args) {
        //使用多态的向上造型创建一个子类型对象
        Collection<String> c1 = new ArrayList<>();

        //1. E add(E e)  向集合中添加元素\
        c1.add("A");
        c1.add("B");
        c1.add("C");

        //2. Boolean isEmpty()  判断集合是否为空
        boolean empty = c1.isEmpty();
        System.out.println(empty);

        //3. int size()  返回集合中元素的个数
        System.out.println(c1.size());

        //4.String toString()  返回集合的字符串形式
        System.out.println(c1.toString());

        Collection<String> c2 = new ArrayList<>();
        c2.add("B");
        c2.add("C");
        c2.add("D");

        //5. addAll(Collection c)  向集合中添加元素
        c1.addAll(c2);
        System.out.println(c1.toString());

        //6. boolean contains(Object o)  判断集合中是否包含某个元素
        //查看是否包含元素B
        boolean contains = c1.contains("B");
        System.out.println(contains);

        //7. boolean containsAll(Collection c)  判断集合中是否包含另一个集合
        //查看c1是否包含集合c2
        boolean containsAll = c1.containsAll(c2);
        System.out.println(containsAll);

        //8. boolean equals(Object o)  判断两个集合是否相等
        //测试:创建一个新的集合c3 添加元素A B C B D D
        //判断两个集合是否相同
        Collection<String> c3 = new ArrayList<>();
        c3.add("A");
        c3.add("B");
        c3.add("C");
        c3.add("B");
        c3.add("D");
        c3.add("D");
        System.out.println("是否相同" + c1.equals(c3));

        //9. boolean remove(Object o)  从集合中删除元素
        boolean remove = c1.remove("B");
        System.out.println(remove);

        //10. boolean removeAll(Collection<?> c)  从集合中删除另一个集合
        //新建一个集合c4 添加元素 B C
        //测试c1移除子集c4
        Collection<String> c4 = new ArrayList<>();
        c4.add("B");
        c4.add("C");
        boolean removeAll = c1.removeAll(c2);
        System.out.println(removeAll);

        //11. boolean retainAll(Collection<?> c)  从集合中删除另一个集合中不存在的元素
        //测试: 向c1添加E F G 然后保留子集c5  c5中有A E
        c1.add("E");
        c1.add("F");
        c1.add("G");
        System.out.println(c1.toString());
        Collection<String> c5 = new ArrayList<>();
        c5.add("A");
        c5.add("E");
        boolean retainAll = c1.retainAll(c5);
        System.out.println(retainAll);
        System.out.println(c1.toString());

        //12. void clear();  测试: 清空c1
        c1.clear();
        System.out.println(c1.toString());
        System.out.println(c1.size());
    }
}

CollectionDemo02

package com.se.aCollection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 *  集合的迭代:
 *    1. 集合的迭代,就是指集合的遍历操作
 *    2. 几乎所有的集合子类型都实现了迭代接口Iterable
 *    3. 迭代接口提供了多个方法,用于迭代
 *       - boolean hasNext(): 用于判断集合中是否有下一个元素
 *                 可以形象的认为有指针,指针的最初位置在集合的第一个元素前面
 *       - E next(): 用于获取指针指向的元素,并将指针移动到下一个元素
 *       - void remove(): 用于删除指针指向的元素,并将指针移动到下一个元素
 *
 *     tips:在使用迭代器的时候,不可使用集合的remove方法,否则会抛出异常
 */

public class CollectionDemo02 {
    public static void main(String[] args) {
        Collection<Integer> c1 = new ArrayList<>();
        c1.add(1);
        c1.add(2);
        c1.add(3);
        c1.add(4);
        c1.add(5);
        //使用增强for循环遍历,底层原理就是迭代器
        for (Integer i : c1) {
            System.out.print(i+"");
        }

        //使用迭代器iterator()方法进行遍历
        //第一步: 获取要遍历的集合对象的迭代器对象
        Iterator<Integer> it = c1.iterator();
        //第二步:问是否有下一个元素
        while (it.hasNext()) {
            //第三步:获取元素
            Integer a = it.next();
            System.out.print(a+"");
        }




    }
}

CollectionDemo03

package com.se.aCollection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * IDE(idea,eclipse)这样的开发工具应该都有debug功能,该功能是用来调试代码,
 *   捋请运行逻辑,找到发生异常的地方。
 *
 *   如果想要使用debug功能,需要在可能出现异常或者你想要看的地方发一个断点。
 *   断电的作用: 就是在debug运行到这一地方时,进行程序的阻塞
 *   然后可以使用相应的快捷键或者按钮,
 *
 *   迭代器的源码解析:
 *      三个成员变量:
 *      cursor: 记录下一次要返回的元素的下标
 *      lastRet: 记录上一次返回的元素的下标
 *      expectedModCount: 预计集合的修改次数  默认为集合长度 与modCount的值一致
 *                         tips: 集合在调用add(E e)方法添加元素时,modCount++
 *
 *      hasNext(): return   cursor!= size    当光标的值为集合长度时,没有下一个元素
 *      next():
 *         1. 检查 expectedModCount与modCount的值是否一致,不一致则抛出异常
 *         2. 光标额值先赋值给lastRet,指针后移。光标的值+1,为下一次的hasNext()方法做准备工作
 *             新的lastRet的值就是指针指向的元素,也就是新取出的元素
 *      remove():
 *         1. 检查 expectedModCount与modCount的值是否一致,不一致则抛出异常
 *         2. 调用ArrayList的E remove(int index)方法做真正的删除元素
 *             而E remove(int index)方法会调用System.arraycopy()方法,
 *             从指定的index+1,向前移动一位,以此形式做删除操作
 *
 *             index的值是lastRet的值
 *
 *             因为后续元素的下标前移了一位,所以光标(cursor)的值需要前移一次
 *
 *             最重要的是: remove(int index)里面进行了modCount++,
 *             但是迭代器的remove里,进行了重新赋值expectedModCount = modCount;
 *
 *
 *
 */

public class CollectionDemo03 {
    public static void main(String[] args) {
        Collection<String> c1 = new ArrayList<>();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("c");
        c1.add("d");
        c1.add("d");

        //使用迭代器时,如果发现c元素,就将其删除
        Iterator<String> it = c1.iterator();
        while (it.hasNext()) {
            String element = it.next();
            if (element.equals("c")) {
                //使用集合自己的删除方法,会报错ConcurrentModificationException  表示不应该修改元素
//                c1.remove(element); 可以使用迭代器的删除方法
                it.remove();
            }
        }
        System.out.println(c1);
    }
}

ListDemo01

package com.se.bList;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * List接口的特点:
 *   1. 元素有序,可以重复
 *   2. 两个实现类:ArrayList和LinkedList
 *        -ArrayList:动态数组+各种方法
 *        -LinkedList:双向链表+各种方法
 *   3. 两个实现类的效率: (元素量很多的情况)
 *      -对于随机访问来说:ArrayList > LinkedList
 *      -对于频繁地插入和删除来说:LinkedList > ArrayList
 *   4. 基于List接口,两个实现类的方法基本一致
 */

public class ListDemo01 {
    public static void main(String[] args) {
        //创建一个ArrayList集合对象
        List<String> names = new ArrayList<>();
        //创建一个LinkedList集合对象
        List<String> adds = new LinkedList<>();

        /*
          添加元素
          boolean add(E e)   添加元素,默认添加到集合末尾
          void add(int index, E element)   插入元素,下标范围[0,size()]
          boolean addAll(Collection c)
          boolean addAll(Collection<? extends E> c)
         */
        names.add("micheal");
        names.add(1, "jack");
        System.out.println(names);

        //地址集合添加两个元素
        adds.add("beijing");
        adds.add("shanghai");

        //将地址集合添加到names集合中
        names.addAll(adds);
        System.out.println(names);

        //将地址集合添加到names集合中两个元素之间
//        names.addAll(1, adds);
//        System.out.println(names);

        // E get(int index)   获取指定位置的元素
        System.out.println(names.get(0));

        //int indexOf(Object o)   查找指定元素的下标
        int index = names.indexOf("jack");
        System.out.println(index);

        //int lastIndexOf(Object o)   获取指定元素的最后一个下标
        int lastIndex = names.lastIndexOf("jack");
        System.out.println(lastIndex);

        //E remove(int index)   删除指定位置的元素
        names.remove(1);
        System.out.println(names);

        //E set(int index, E element)   修改指定位置的元素
        names.set(1, "tom");
        System.out.println(names);

        //List subList(int fromIndex, int toIndex)   截取集合
        List<Integer> nums = new ArrayList<>();
        for (int i = 1; i < 11; i++) {
            nums.add(i);
        }
        System.out.println(nums);
        List<Integer> subNums = nums.subList(3, 7);
        System.out.println(subNums);

        //对子集里的每一个元素扩大十倍。
        for (int i = 0; i < subNums.size(); i++) {
            subNums.set(i, subNums.get(i) * 10);
        }
        System.out.println(subNums);
        System.out.println(nums);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值