Java学习----习题总结

今日学习内容总结如下:

概述Collection、List和Set接口

Collection接口是List接口与Set接口的父类接口,而各个集合的又是List接口与Set接口的实现类。
Collection接口   无序  允许重复
public interface Collection<E> extends Iterable<E>
常见方法:
    int size();获取集合中的元素个数
    boolean contains(Object o) 判断集合中是否有指定的对象,有true没有false。
    元素相等是依赖于equals方法实现的
     Object[] toArray();将集合转换为Object类型的数组
      <T> T[] toArray(T[] a);    
          String[] arrs=cols.toArray(new String[] {});
      boolean add(E e);向集合中新增元素,成功true否则false
      boolean remove(Object o);删除指定的元素o,相等判断使用equals
      void clear(); 清空集合中的所有元素    

List接口  有序【有下标序号】   允许重复
public interface List<E> extends Collection<E>
特殊的方法就是引入序号
     E get(int index);按照索引序号获取指定位置上的元素,需要不能越界
     E set(int index, E element);修改指定位置上的元素,覆盖
     void add(int index, E element);向指定位置上添加元素,原始数据后移
    E remove(int index);删除指定位置上的元素,并返回被删除的元素,原始位置上的元素前移
        有可能产生二义性的用法
            List<Integer> list=...;
            list.remove(3);  调用的是remove(int)方法,不是指定元素删除,而是指定位置删除
            list.remove(Integer.valueOf(3)); 删除指定元素,不是序号
    int indexOf(Object o);从前向后查找第一次出现o的下标位置,如果查不到则返-1
    int lastIndexOf(Object o);从后向前查找
List接口与Collection接口相比,比其增加了一个get()、set()方法,可以通过指定的索引值取得
修改、内容。要想取得接口的实例化对象则其必须有子类,在List接口下有三个常用子类:
ArrayList、LinkedList、Vector

Set接口  无序【没有下标序号】 不允许重复
HashSet的特点:无序且不可重复       
1.存储时顺序和取出的顺序不同
2.不可重复
3.放到hashSet集合的元素实际上是放到HashMap集合的key部分了。
TreeSet集合存储元素的特点
无序不可重复的,但是存储的元素可以自动按照大小顺序排序,称为可排序集合

概述ArrayList、LinkedList和Vector的区别

相同点:都实现了list接口
ArrayList和Vector底层都使用Object[] elementDate存储

不同点:ArrayList底层的实现是数组,而LinkedList是双向链表。
ArrayList进行随机访问所消耗的时间是固定的,因此随机访问时效率比较高。
LinkedList是不支持快速的随机访问的,但是在插入删除时效率比较高。
Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会
扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)
Vector可以设置增长因子,而ArrayList不可以。
ArrayList有三个构造方法,
public ArrayList(int initialCapacity) { 参数是初始化容积值
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;  空数组
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
        }
    }
    
    public ArrayList() {  使用的是延迟初始化数组的策略,这里给elementData数组赋值为空数组,当第一次添加元素时才进行数组的初始化操作
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;  
    }
    public ArrayList(Collection<? extends E> c) { 用于集合类型数据的转换
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
Vector有四个构造方法。
 public Vector(int initialCapacity, int capacityIncrement) { 可以设置初始化容积和扩容步长值
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }
    public Vector(int initialCapacity) { 只有一个初始化容积值,则默认的扩容步长值为0
        this(initialCapacity, 0);
    }
    public Vector() {
        this(10);  Vetor默认立即初始化操作,ArrayList默认采用的是延迟初始化数组的方式。这里可以看到默认的初始化容积值为10
    }
    public Vector(Collection<? extends E> c) { 可以将Collection转换为Vector类型
        elementData = c.toArray();
        elementCount = elementData.length;
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);  参数1是原来的数组,参数2是新长度,参数三为目标类型
    }

如何选用:ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
                  LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
                  Vector:数组实现,重量级 (线程安全、使用少)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值