容器
    /*
    数组 : 存储多个数据
        引用数据类型,对象数据
        长度一旦确定不可改变,定长的
        存储的多个数据要求数据类型相同
        索引,有序的
    集合|容器 : 存储多个数据
        可以根据数据的增删动态改变长度
        可以存储不同类型的数据
        要求集合只能存储引用数据类型的数据 */
        

public static void main(String[] args) {
        //1.创建一个ArrayList对象
        ArrayList list = new ArrayList();
        //2.操作使用集合
        list.add("zhangsan");
        list.add(123);
        list.add(false);
        list.add(null);
        list.add(new String("abc"));

        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
        System.out.println(list.get(3));
        System.out.println(list.get(4));
        System.out.println(list.size());

        System.out.println(list);
    }

    /*
    自定义容器类型(模仿ArrayList)
        要求 : 只能存储字符串数据
 */
      

public class Class002_MyContainer {
    public static void main(String[] args) {
        MyContainer my = new MyContainer();

        System.out.println(my.size());
        my.add("aaa");
        System.out.println(my.size());
        my.add("bbb");
        System.out.println(my.size());
        my.add("ccc");
        System.out.println(my.size());

        System.out.println(my.get(0));
        System.out.println(my.get(1));
        System.out.println(my.get(2));

        System.out.println(my);

    }
}
        //容器类型
class MyContainer{
    //底层存储数据的结构
    private String[] elementData = null;
    //记录集合中数据的个数
    private int size;

    public MyContainer() {

    }

/**
      * 追加方法
      * @param value 要添加的数据
      */
public void add(String value) {
        //如果是第一次添加
        if(elementData==null && size==0){
            //1)创建新数组长度1
            elementData = new String[1];
            //2)然后把数据添加到数组中
            elementData[0] = value;
            //3)size++
            size++;
            return;
        }
        //如果不是第一次添加
        //记录原数组的地址
        String[] temp = elementData;
        //1)创建新数组,长度为原数组长度+1
        elementData = new String[size+1];
        //2)拷贝数据
        for(int i=0;i<size;i++){
            elementData[i] = temp[i];
        }
        //3)这一次添加的数据放在数组的最后
        elementData[size] = value;
        //4)size++
        size++;
    }
    
    /**
     * 返回集合中数据的个数
     * @return size属性值
     */
    public int size(){
        return this.size;
    }
    /**
     * 根据索引获取集合中的数据
     * @param index 索引
     * @return 参数索引位置的数据
     */
    public String get(int index) {
        if(index<0 || index>=size){
            throw new IndexOutOfBoundsException(index+"索引越界啦~~~~~");
        }
        return elementData[index];
    }

    @Override
    public String toString() {
        return Arrays.toString(elementData);
    }
}

/*
     Collection :
         集合层次结构中的根接口。 集合表示一组对象,称为其元素 。
         List子接口下的实现类有序可重复,Set子接口下的实现类无序不可重.    遍历方式 :
         1.foreach
         2.iterator迭代器
  */
Collection col1 = new ArrayList();
                Collection col2 = new ArrayList();
        
                //boolean add(E e) 确保此集合包含指定的元素(可选操作)。
                col1.add(true);
                col1.add("aaa");
                col1.add('a');
                col1.add(1.2);
                System.out.println(col1);
                col2.add(111);
                col2.add(222);
                col2.add(333);
                System.out.println(col2);
                //boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合中(可选操作)。
                col1.addAll(col2);
                System.out.println(col1);
                System.out.println(col2);
        
                //void clear() 从此集合中删除所有元素(可选操作)。
                //boolean isEmpty() 如果此集合不包含任何元素,则返回 true 。
        
                //boolean contains(Object o) 如果此collection包含指定的元素,则返回 true 。
                System.out.println(col1.contains("aaa"));
        
                //boolean containsAll(Collection<?> c) 如果此集合包含指定集合中的所有元素,则返回 true 。
                System.out.println(col1.containsAll(col2));
        
                //boolean remove(Object o) 从此集合中移除指定元素的单个实例(如果存在)(可选操作)。
                System.out.println(col1.remove(111));
                System.out.println(col1);
        
                //boolean retainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
                //System.out.println(col1.retainAll(col2));
                System.out.println(col1);
        
                //int size() 返回此集合中的元素数。
        
                //Object[] toArray() 返回包含此集合中所有元素的数组。
                Object[] arr= col2.toArray();
                System.out.println(arr);
        
                //foreach
                for(Object obj:col1){
                    System.out.println(obj);
                }
        
                //iterator迭代器
                //1)获取迭代器对象
                Iterator it = col1.iterator();
                //2)判断是否存在下一个元素
                while(it.hasNext()){
                    //3)获取下一个元素
                    System.out.println(it.next());
                }

/*
     List :
         有序的可重复    新增方法 :
         新增了一些根据索引进行操作的方法    遍历方式 :
         普通for
         增强for
         iterator迭代器
  */
List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
                list.add("aaa");
        
                System.out.println(list);
                //void add(int index, E element) 将指定元素插入此列表中的指定位置(可选操作)。
                list.add(3,"ddd");
                System.out.println(list);
                //boolean addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到指定位置的此列表中(可选操作)。
                //E get(int index) 返回此列表中指定位置的元素。
                System.out.println(list.get(1));
        
                //int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。
                System.out.println(list.indexOf("aaa"));
                //int lastIndexOf(Object o) 返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。
                System.out.println(list.lastIndexOf("aaa"));
        
                //static <E> List<E> of(E... elements) 返回包含任意数量元素的不可修改列表。
                List list2 = List.of(1,2,3,4,5);
                System.out.println(list2);
                //list2.add(6); //java.lang.UnsupportedOperationException
                System.out.println(list2);
        
                //E remove(int index) 删除此列表中指定位置的元素(可选操作)。
                System.out.println(list.remove("ddd"));
                System.out.println(list.remove(2));
                System.out.println(list);
                //boolean remove(Object o) 从该列表中删除指定元素的第一个匹配项(如果存在)(可选操作)。
        
                //E set(int index, E element) 用指定的元素替换此列表中指定位置的元素(可选操作)。
                System.out.println(list.set(1,"bbbb"));
                System.out.println(list);
        
                //List<E> subList(int fromIndex, int toIndex) 返回指定的 fromIndex (包含)和 toIndex (不包括)之间的此列表部分的视图。
                System.out.println(list.subList(0,2));
        
                //for
                for(int i=0;i<list.size();i++){
                    System.out.println(list.get(i));
                }