Java 基础篇学习 集合框架概述与Collection接口

6 篇文章 0 订阅

集合框架的概述

    1、集合、数组都是对多个数据进行存储操作的结构,简称Java容器。说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化层面的存储。
    2.1数组在存储多个数据方面的特点:1>一旦初始化以后,其长度就确定了。2> 数组一旦定义好,其元素的类型也就确定了,只能操作指定类型的数据
    2.2数组在存储多个数据方面的缺点。1>一旦初始化以后,其长度就不能改变了。2> 数组中提供的方法非常有限,对于添加、删除、插入数据等操作,不方便,效率较低。3>获取数组实际使用的元素的个数,不方便。4>数组存储数据的特点:有序、可重复。对于无序、不可重复数组无法满足
    Java集合可分为Collection和Map体系
    Collection接口:单列数据(集合),定义了存取一组对象的方法的集合
        List:元素有序、可重复的集合(“动态数组”),主要实现类有ArrayList、LinkedList和Vector
        Set:元素无序、不可重复的集合,主要实现类有HashSet、LinkedHashSet和TreeSet
    Map接口:双列数据(集合),保存具有映射关系key-value对的集合,主要实现类有,HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

Collection 接口中方法的使用

    Collection接口提供的基本api的使用

@Test
    public void test(){
        Collection<String> collection = new ArrayList<String>(){{
            // 1、add 添加元素
            add("AA");
            add("BB");
            add("CC");
            add("DD");
            add("EE");
            add("FF");
        }};
        System.out.println(collection);

        // 2、获取添加元素的个数 .size()
        int size = collection.size();
        System.out.println(size);

        //addAll
        Collection<String> collection1 = new ArrayList<String>(){{
            // add 添加
            add("GG");
            add("AA");
        }};

        // 3、addAll 将collection1所有的元素添加到当前集合中
        collection.addAll(collection1);
        System.out.println(collection);
        System.out.println(collection.size());

        // 4、判断 collection 是否为空
        boolean empty = collection.isEmpty();
        System.out.println(empty);

        // 5、清空集合元素
        collection.clear();
        System.out.println(collection);
        System.out.println(collection.size());
        System.out.println(collection.isEmpty());
    }
    @Test
    public void test1() {
        Collection coll = new ArrayList() {{
            add("test");
            add(new Student(10086, "张三"));
            add(123);
        }};
        // 6、contains() 判断当前集合中是否包含 Object
        // boolean contains(Object o)
        // contains 方法调用的是子类的equals()方法
        // 要求 对象添加进入 Collection  最好重写equals()方法
        boolean contains = coll.contains(123);
        System.out.println(contains);
        boolean contains1 = coll.contains(new Student(10086, "张三"));
        System.out.println(contains1);

        // 7、 boolean containsAll(Collection<?> coll1); 判断coll1集合中的元素是否都在 coll中
        Collection coll1 = new ArrayList() {{
            add("test");
            add(new Student(10086, "张三"));
        }};
        System.out.println(coll.containsAll(coll1));
        //  8、boolean remove(Object o);
        boolean remove = coll.remove(new Student(10086, "张三"));
        System.out.println(remove);
        System.out.println(coll);
        // 9、boolean removeAll(Collection<?> c); 当前集合中移除 c中的所有元素
        // 相当于去差集
        Collection<Integer> coll2 = Arrays.asList(123, 456);
        boolean b = coll.removeAll(coll2);
        System.out.println(b);
        System.out.println(coll);
        // 10 boolean retainAll(Collection<?> c);
        // 获取 coll1 和 coll的交集,并将一样的数据赋值给当前集合 coll1
        boolean retainAll = coll1.retainAll(coll);
        System.out.println(coll1);
        //  boolean equals(Object o);
        // 11、coll1.equals()  Collection 与obj 是否一致 方法由子类提供
        // 12、coll1.hashCode() // 获取 Collection 的hashCode
        // 13、Object[] toArray(); coll转成数组
        Object[] objects = coll.toArray();
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);
        }
        // 扩展 arr 转list
        List list = Arrays.asList(new int[]{123, 345});
        System.out.println(list);
        System.out.println(list.size());

        List list1 = Arrays.asList(new Integer[]{123, 345});
        System.out.println(list1);
        System.out.println(list1.size());


    }

@Slf4j
//@Data 使用@Data 会重写本类中的equals()方法
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
class Student {

    private Integer no;

    private String name;

        @Override
    // 重写equals方法
    public boolean equals(Object o) {
        log.info("Student equals() method");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(no, student.no) &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(no, name);
    }
}

    Iterator遍历:集合元素的遍历操作,使用迭代器Iterator接口。Iterator对象称为迭代器(设计模式的一种),主要用于遍历Collection集合中的元素。迭代器模式的定义为:提供一种方法访问一个容器(container)对象中的各个元素,而又不需要暴露该对象的内部细节。迭代器模式可以说是为容器而生。
    Collection接口继承了Iterable接口。该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都拥有一个iterator()方法,用以返回一个实现了iterator接口的对象。
    iterator用于遍历集合,iterator本身并不提供承装对象的能力。如果需要创建iterator对象,必须有一个被迭代的集合。集合对象每次调用iterator()方法,都会得到一个全新的迭代器对象,默认游标都在集合的第一个对象之前。
    Iterator 提供了两个非default 的方法

/**
     * Returns {@code true} if the iteration has more elements.
     * (In other words, returns {@code true} if {@link #next} would
     * return an element rather than throwing an exception.)
     *
     * @return {@code true} if the iteration has more elements
     */
    boolean hasNext();

    /**
     * Returns the next element in the iteration.
     *
     * @return the next element in the iteration
     * @throws NoSuchElementException if the iteration has no more elements
     */
    E next();
@Test
    public void test() {

        Collection<String> coll = new ArrayList<String>() {{
            add("test");
            add("123");
            add("234");
            add("345");
        }};
        // 迭代器
        Iterator<String> iterator = coll.iterator();
        // 不推荐方式一
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        // 异常信息 java.util.NoSuchElementException
//        System.out.println(iterator.next());
        // 不推荐方式二
//        for (int i = 0; i < coll.size(); i++) {
//            System.out.println(iterator.next());
//        }
        //推荐方式 判断是否有下一个元素
        while (iterator.hasNext()) {
            // .next() 指针下移,并将下移以后集合位置上的元素返回
            System.out.println(iterator.next());
        }

        // 错误方式一
//        while (iterator.next() != null){
//            System.out.println(iterator.next());
//        }

        // 错误方式二 coll.iterator() 每次调用.iterator()方法,都会有一个新的iterator对象返回
//        while (coll.iterator().hasNext()){
//            System.out.println(coll.iterator().next());
//        }

        // iterator remove() 方法的使用
        System.out.println("-------------------------------");
        Iterator<String> iterator1 = coll.iterator();
        while (iterator1.hasNext()) {
            String next = iterator1.next();
            if ("test".equals(next)) {
                // 内部定义了remove方法,可以在遍历的时候,移除集合中的元素,此方法不同于集合中直接调用remove()方法
                iterator1.remove();
            }
        }

        // 上一步的方法等同于  Collection中的 removeIf
//        coll.removeIf("test"::equals);
        // Collection 中的 removeIf 的源码就好理解了
//        default boolean removeIf(Predicate<? super E> filter) {
//            Objects.requireNonNull(filter);
//            boolean removed = false;
//            final Iterator<E> each = iterator();
//            while (each.hasNext()) {
//                if (filter.test(each.next())) {
//                    each.remove();
//                    removed = true;
//                }
//            }
//            return removed;
//        }
        

        System.out.println("-------------------------------");
        Iterator<String> iterator2 = coll.iterator();
        while (iterator2.hasNext()) {
            System.out.println(iterator2.next());
        }

    }

    foreach 循环遍历集合元素
    foreach是Java5.0提供的方法,循环迭代访问Collection和数组,遍历操作无需获取Collection或者数组的长度,无需使用索引访问元素,遍历集合底层调用的Iterator完成操作,foreach可以用来遍历数组

 @Test
    public void test2() {
        Collection<String> coll = new ArrayList<String>() {{
            add("test");
            add("123");
            add("234");
            add("345");
        }};

        // java1.5 for (集合元素的类型 局部变量 : 集合对象) {}
        // public Iterator<E> iterator() { return new Itr(); }
        // public boolean hasNext() {return cursor != size;}
        // 底层调用的还是 Iterator
        for (String str : coll) {
            System.out.println(str);
        }

        //java 1.8 Iterable 提供 forEach
        // default void forEach(Consumer<? super T> action) {
        //        Objects.requireNonNull(action);
        //        for (T t : this) {
        //            action.accept(t);
        //        }
        //    }
        coll.forEach(item -> {
            System.out.println(item);
            System.out.println(item.length());
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值