4.17 集合

集合Conllection 迭代器Iterable

Collection常用方法

        // 创建一个集合对象
        Collection c1 = new ArrayList();
        // 判断是否为空
        System.out.println(c1.isEmpty());
        // 已添加元素的个数
        System.out.println(c1.size());
        // int 类型 先自动装箱为integer类型 然后发生多态
        c1.add(1);
        c1.add("a");
        System.out.println(c1.size());
        // 根据元素内容 删除元素
        c1.remove(1);
        System.out.println(c1);
        // 没有提供查询功能和修改功能
        // 遍历
        // 把集合转换为数组
        Object[] arr = c1.toArray();
        // 清空集合
        c1.clear();
        // 判断是否包含某个元素
        System.out.println(c1.contains("a"));

Collection实现子类ArrayList(底层实现数组,开始容量为10,不够时1.5倍扩容),有序(插入时的顺序)可重复,因为是由数组实现,修改和查询效率高

public ArrayList(Collection<? extends E> c) {
        //数组
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }



private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
    }

    private Object[] grow() {
        return grow(size + 1);
    }

ArrayList可以使用迭代器或下标遍历

//迭代器遍历        
//像创建迭代器对象
Iterator it = c1.iterator();
//利用Iterator中提供的方法hasNext()判断集合中是否还有数据
//注意:创建迭代器对象后使用增加,删除时不能使用集合提供的方法,必须使用迭代器提供的增加、删除方法
while (it.hasNext()) {
//利用next()方法查询数据
       System.out.println(it.next());
}

LinkedList底层实现时由双向链表,链表中保存节点,prev指向前节点的地址,item保存本身数据,next指向后节点的地址,增加和删除效率高

LinkedList,ArrayList中提供的方法都基本相同

public static void main(String[] args) {
// 创建ArrayList
        // List list = new ArrayList();
//创建LinkedList
        List list = new LinkedList();
        // 添加
        // 尾部添加
        list.add(1);
        list.add("b");
        // 插入到指定下标中
        list.add(0, "a");
        // 删除
        // 根据内容删除
        list.remove("a");
        // 如果传入的是int类型,则为根据下标删除
        list.remove(1);
        // 如果要根据内容删除,但是内容又是整数
        // 就需要转换一下,装箱
        list.remove(Integer.valueOf(1));

        list.add("a");
        list.add("b");
        list.add("c");
        // 查询
        System.out.println(list.get(1));
        // 修改
        // 索引 , 要修改的内容
        list.set(1, "bb");
        // 遍历
        System.out.println(list);
        // 迭代器遍历
        for (Object object : list) {
            System.out.println(object);
        }
        // for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }


    }

LinkedList实现

transient int size = 0;
transient Node<E> first;
transient Node<E> last;

Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }

//首节点添加(尾节点添加实现原理相视)
    private void linkFirst(E e) {
        final Node<E> f = first;
        final Node<E> newNode = new Node<>(null, e, f);
        first = newNode;
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;
        size++;
        modCount++;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值