初入-容器

容器

变量:存储单个数据

数组:存储多个数据

引用数据类型

定长,长度确定不可改变

有序,有索引

存储相同的数据类型

容器|集合

  • 可以存储多个数据

  • 容量可以进行动态的改变

  • 可以存储不同的数据类型

    public class Class001_Container {
        public static void main(String[] args) {
            ArrayList list = new ArrayList<>();
            list.add(123);
            list.add("你好");
            list.add(false);
            list.add(3.12);
    ​
            System.out.println(list);
            System.out.println(list.size());
            list.add(false);
            list.add(3.12);
            System.out.println(list);
            System.out.println(list.size());
            System.out.println(list.get(1));
    ​
            MyContainer my = new MyContainer();
            my.add("abc");
            System.out.println(my.size());
            System.out.println(my);
            my.add("bcd");
            System.out.println(my.size());
            System.out.println(my);
            System.out.println(my.get(0));
            System.out.println(my.get(1));
        }
    }
    ​
    //手写ArrayList,自定义容器类 MyContainer : 只能存储字符串数据
    class MyContainer{
        //存储数据的结构
        private String[] elementData;
        //记录集合中数据的个数
        private int size;
    ​
        public MyContainer() {
        }
    ​
        /**
         * 添加
         * @param value 要添加的数据
         */
        public void add(String value) {
            //判断是否为第一次添加数据
            if(elementData==null || size==0){
                elementData = new String[1];
                elementData[0] = value;
                size++;
                return;
            }
            //不是第一次添加数据,原elementData指向数据对象,原数组中存在数据
            //记录原数组对象地址
            String[] temp = elementData;
            //创建新数组
            elementData = new String[size+1];
            //原数组中数据拷贝到新数组
            //i 作为原数组索引同时也能作为新数组水印
            for(int i=0;i<size;i++){
                elementData[i] = temp[i];
            }
            //新数据添加到新数组最后
            elementData[size] = value;
            //长度+1
            size++;
        }
    ​
        //根据索引获取数据
        public String get(int index){
            if(index<0 || index>=size){
                throw new IndexOutOfBoundsException(index+"索引越界啦!!!");
            }
            return elementData[index];
        }
    ​
        //根据索引修改数据
        //根据索引删除数据
    ​
        //返回数据的个数
        public int size(){
            return this.size;
        }
    ​
        @Override
        public String toString() {
            return Arrays.toString(elementData);
        }
    }

Collection

Collection 集合层次结构中的根接口。 集合表示一组对象,称为其元素 。 遍历: 增强for循环 iterator迭代器

public class Class001_Collection {
    public static void main(String[] args) {
        Collection col = new ArrayList();
        Collection col2 = new ArrayList();
​
        //add()
        col.add("123");
        col.add(false);
        col.add(543);
        col.add("你好");
        System.out.println(col.add(null));;
        col2.add('a');
        col2.add('b');
        col2.add('c');
        System.out.println(col);
        System.out.println(col2);
​
        //boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合中(可选操作)。  
        col.addAll(col2);
        System.out.println(col);
        System.out.println(col2);
​
        //boolean contains(Object o) 如果此collection包含指定的元素,则返回 true 。
        System.out.println(col.contains("你好"));
        //boolean containsAll(Collection<?> c) 如果此集合包含指定集合中的所有元素,则返回 true 。
        //boolean isEmpty() 如果此集合不包含任何元素,则返回 true 。
        System.out.println(col2.isEmpty());
        //col2.clear();
        System.out.println(col2.isEmpty());
​
        //boolean remove(Object o) 从此集合中移除指定元素的单个实例(如果存在)(可选操作)。
        System.out.println(col.remove("123"));
        System.out.println(col);
        //boolean removeAll(Collection<?> c) 删除此集合的所有元素,这些元素也包含在指定的集合中(可选操作)。
​
        //boolean retainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
        col2.add('d');
        System.out.println(col.retainAll(col2));
        System.out.println(col);
        System.out.println(col2);
​
        //Object[] toArray() 返回包含此集合中所有元素的数组。
        System.out.println(Arrays.toString(col2.toArray()));
​
        //遍历方式
        //foreach
        for(Object obj:col2){
            System.out.println(obj);
        }
​
        //Iterator<E> iterator() 返回此集合中元素的迭代器。
        //1)获取某一个集合的迭代器
        Iterator it = col2.iterator();
        //2)是否存在下一个元素
        while(it.hasNext()){
            //3)获取下一个元素
            System.out.println(it.next());
        }
​
    }
}

泛型

泛型 : jdk1.5新增 参数化类型 : 数据的类型作为参数传递 泛型通过一对<>配置 泛型只能设置引用数据类型 泛型可以提高稳定与可读性

public class Class002_Generic {
    public static void main(String[] args) {
        //泛型可以提高稳定与可读性
        ArrayList<String> col = new ArrayList<>();
        col.add("abc");
        col.add("bcd");
        col.add("cde");
​
        //遍历
        for(String str:col){
            System.out.println(str);
        }
​
        Iterator<String> it = col.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

List有序的

list:有序的

set:无序的

List : 有序集合(也称为序列 )。 特点 : 有序,可重复 ,可以根据索引操作.. 新增功能 : 新增了一些根据索引操作的方法 遍历方式 :

1.for

  1. foreach

  2. iterator

  3. listIterator

public class Class001_ArrayList {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(2);
        list.add(4);
        list.add(1);
        list.add(5);
        System.out.println(list);
        //void add(int index, E element) 将指定元素插入此列表中的指定位置(可选操作)。
        list.add(0,1);
        System.out.println(list);
​
        //E get(int index) 返回此列表中指定位置的元素。
        System.out.println(list.get(3));
​
        //int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。
        //int lastIndexOf(Object o) 返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。
        System.out.println(list.indexOf(1));
        System.out.println(list.lastIndexOf(1));
​
        //static <E> List<E> of(E... elements) 返回包含任意数量元素的不可修改列表。
        List<Integer> list2 = List.of(1,2,3,4,5);
        System.out.println(list2);
​
        //E remove(int index) 删除此列表中指定位置的元素(可选操作)。
        //boolean remove(Object o) 从该列表中删除指定元素的第一个匹配项(如果存在)(可选操作)。
        System.out.println(list.remove(1));;
​
        //E set(int index, E element) 用指定的元素替换此列表中指定位置的元素(可选操作)。
        System.out.println(list.set(0,0));
        System.out.println(list);
​
        //List<E> subList(int fromIndex, int toIndex) 返回指定的 fromIndex (包含)和 toIndex (不包括)之间的此列表部分的视图。  结束索引不包含
        System.out.println(list.subList(1,3));
​
        //for 遍历
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
}

作业:

定义list集合,存储你喜欢的漫威英雄人物,如果存在灭霸,就添加一个 惊奇队长 实现方式: contains() 各种遍历方式 普通for 增强for iterator listIterator

public class Class002_Each {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
​
        list.add("钢铁侠");
        list.add("美国队长");
        list.add("灭霸");
        list.add("蜘蛛侠");
​
        System.out.println(list);
​
        //contains
        /*if(list.contains("灭霸")){
            list.add("惊奇队长");
        }*/
​
        //for
        /*for(int i=0;i<list.size();i++){
            if("灭霸".equals(list.get(i))){
                list.add("惊奇队长");
            }
        }*/
​
        //foreach
        //ConcurrentModificationException
        /*for(String s :list){
            if("灭霸".equals(s)){
                list.add("惊奇队长");
            }
        }*/
​
        //iterator
        //ConcurrentModificationException 多个线程多个引用同时操作当前的list集合,一个要遍历,一个要添加,有可能出现数据不安全情况,抛出次异常
        /*Iterator<String> it = list.iterator();
        while(it.hasNext()){
            if("灭霸".equals(it.next())){
                list.add("惊奇队长");
            }
        }*/
​
​
        //ListIterator<E> listIterator() 返回此列表中元素的列表迭代器(按适当顺序)。
        //ListIterator<E> listIterator(int index) 从列表中的指定位置开始,返回列表中元素的列表迭代器(按正确顺序)。
        // ListIterator<E> : 列表的迭代器,允许程序员在任一方向上遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。
        ListIterator<String> it2 =  list.listIterator();
        while(it2.hasNext()){
            if("灭霸".equals(it2.next())){
                it2.add("惊奇队长");
            }
        }
​
        System.out.println(list);
​
    }
}

AarrayList

  1. ArrayList : 有序,可重复,存在索引 底层结构: 数组 特点: 根据索引查询效率高,增删效率低 应用场景:适合用在大量做查询,少量做增删的场景 扩容: 默认的初始容量为10 , 每次扩容原容量的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1); 新增方法: void forEach(Consumer<? super E> action) 遍历方式:

    1. for

    2. foreach

    3. iterator

    4. listIterator

  2. 定义ArrayList存储数据,测试使用 存储自定义引用数据类型的数据 ...

  3. 注意: 存储JavaBean数据,需要重写equals方法'

  4. Vector : 向量 是List接口的实现类 底层结构与ArrayList相同为数组,特点,应用场景相同 不同 : 1)ArrayList线程不安全|不同步 Vector线程安全|同步 2)ArrayList每次扩容原容量的1.5倍,Vector每次扩容原容量的2倍,ArrayList更有利于节省内存 注意: 如果不需要线程安全实现,建议使用ArrayList代替Vector

public class Class003_ArrayList {
    public static void main(String[] args) {
        //ArrayList() 构造一个初始容量为10的空列表。
        ArrayList<Goods> list = new ArrayList<>();
        list.add(new Goods(101,"华为"));
        list.add(new Goods(102,"小米"));
        list.add(new Goods(103,"苹果"));
​
        //void forEach(Consumer<? super E> action) 对 Iterable每个元素执行给定操作,直到处理 Iterable所有元素或操作引发异常。
        list.forEach(System.out::println);
​
        //indexOf  --> 判断两个商品对象是会否相等,默认调用equals方法
        System.out.println(list.indexOf(new Goods(102,"小米")));
​
    }
}
​
class Goods{
    private int id;
    private String name;
​
    public Goods() {
    }
​
    public Goods(int id, String name) {
        this.id = id;
        this.name = name;
    }
​
    public int getId() {
        return id;
    }
​
    public void setId(int id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    @Override
    public String toString() {
        return "Goods{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
​
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Goods goods = (Goods) o;
        return id == goods.id &&
                Objects.equals(name, goods.name);
    }
​
}

LinkedList:

LinkedList : list接口实现类: 有序,可重复

                    底层结构: 双向链表

                    特点 : 查询效率低,增删效率高 应用场景 : 适合用在大量做增删少量做查询的位置

                    新增功能 : 新增了一些操作链表头尾的方法 遍历 : 与list相同

public class Class004_LinkedList {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("nihao");
        list.add("hehe");
        list.add("weixiao");
        list.add("zaijian");

        System.out.println(list);
        System.out.println(list.getFirst());
        System.out.println(list.getLast());

        System.out.println(list.removeFirst());
        System.out.println(list);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值