Java基础(六)单列集合—Collection

单列集合—Collection

在这里插入图片描述

1)List : 存取有序, 有索引, 可以存储重复的

①ArrayList : 底层数组结构 -> 查询快, 修改快;增删慢

  • 优点:查询效率高,因为数组中的元素在内存中是连续的,可以快速的根据下标获取
    集合中的元素
  • 缺点:增删效率低,因为在对数组中元素进行增删操作的时候,涉及移位

②LinkedList : 底层是双向链表结构 -> 增删快;查询慢, 修改慢

  • 优点:增删效率高,因为对链表上的元素进行增删操作的时候,不需要移位,只需
    要改变链表中节点的指向即可
  • 缺点:查询效率低,查询集合中的元素的时候,需要进行全链表的扫描

③Vector:底层数组结构 -> 只不过是线程安全的

2)Set : 存取无序, 无索引, 不可以存储重复的

①HashSet:底层是HashMap

②SortedSet:让集合中的元素具备了排序的能力

  • TreeSet:底层是TreeMap

在这里插入图片描述

3)集合与数组对比

集合特点:

  • 只能存储引用数据类型(基础数据类型——包装类)
  • 长度可变
  • 提供很多操作集合的方法

注意:

  • add()添加基本数据类型时,可以自动装箱:why? how?

    • JVM会自动调用对应包装类的valueOf()方法:返回一个包装类
  • 可以存储null值:how(联想到StringBuild添加null值)?

    • null也是一个Object类

1.Collection[接口]具体方法

1)Collection的“toString()方法”

首先:因为Collection是最顶层的父接口, 内部具备的功能, 所有子类都有一份.

细节1: 如果一个类没有找到我们使用的方法, 可以去父类中查询

问题:Collection 并没有toString()方法,如何实现打印输出的呢?

代码:
    public class Demo1_Collection {
   
        public static void main(String[] args) {
   
            // 1. 创建集合对象
            // 在jdk1.7版本之后, 右侧的尖括号中可以不写类型, 菱形泛型
            // <> : 泛型 -> 用于限制集合中存储的数据类型
            Collection<String> c = new ArrayList<>();
            // 2. 向集合中添加元素
            c.add("abc");
            c.add("bbb");
            // 3. 展示集合中的元素
            System.out.println(c.toString()); //谁调用的toString()
        }
    }

那么问题:Collection接口的toString方法从哪来的呢???

原因:接口虽然没有继承Object类,但是底层会存在Object类所有方法的签名(声明),

这样设计的原因在于:避免调用方法时,出现编译错误

2)Collection的成员方法

1)增

add(Object obj);   添加数据
addAll(Collection coll);  将参数中的所有数据添加到指定集合中

2)删

remove(Object obj);  删除数据
removeAll(Collection coll);  将参数集合中的数据从指定集合中移除

3)改:没有提供修改的方法

4)查

contains(12)   是否包含
containsAll(Collection coll)  返回指定集合中是否包含参数集合的全部内容
 
size()         获取数据的个数
isEmpty()      判断是否为空
clear()        清空

5)集合转数组

  • Collection --> Array

    toArray();

  • Array —> Collection

    Arrays.asList(arrays); 基本数据类型数组中数据不能转为集合

2.迭代器:Iterator 接口

Iterator iterator() ; 返回在此 collection 的元素上进行迭代的迭代器。

1.集合遍历:采用Iterator迭代器

  • Iterator iter = coll.iterator(); ——将一个指针指向集合的最上方

  • iter.next(); ——将指针指向下一个数据并返回该数据

    • next() : [每一次调用], 内部的指针都会向后移动一位.**
    • 在循环体中,推荐只调用一次next()方法;
  • iter.hasNext();//判断下一个是否有值

  • iter.remove();//移除迭代器此刻指向的对象

2.问题:Iterator 是个接口,它的实现类的实例化对象从哪来的?

//ArrayList中的源码:
public Iterator<E> iterator() {
   
    return new Itr();
}

private class Itr implements Iterator<E> {
   
	int cursor;       // index of next element to return 游标
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount; //复制当前集合的版本号,发生修改异常的原因就是版本号的判断

    Itr() {
   }

    public boolean hasNext() {
   
        return cursor != size;
    }

    @SuppressWarnings("unchecked")
    public E next() {
   
        checkForComodification();
        int i = cursor;
        if (i >= size)
            throw new NoSuchElementException();
        Object[] elementData = ArrayList.this.elementData;
        if (i >= elementData.length)
            throw new ConcurrentModificationException();
        cursor = i + 1;
        return (E
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值