集合

--------| Collection 接口,集合的总接口

List 有序 可重复
Set 无序 不可重复

----| List接口中【特有的方法】:
添加:
add(index, Object o); //在指定位置上放入元素
addAll(int index, Collection c); //在指定位置上添加一个集合

获取:
    Object get(int index); //获取指定下标的元素
    int indexOf(Object o); //获取某个元素的下标位置
    int lastIndexOf(Object o); //找出指定元素最后一次出现在集合中的位置
    List subList(int fromIndex, int toIndex); //获取子List集合

修改:
    set(int index, Object o); //设置指定下标上的元素

迭代:
    ListIterator();

ListIterator()
List特有的迭代器

hasNext();
next();
remove();

add(Object o); //在当前迭代器指向的位置上,添加元素,其他元素向后移动
set(Object o); //替换next获取到的元素
nextIndex(); //下一个元素的下标

/*
List集合的三种遍历方式

  1. for循环
  2. 迭代器
  3. 增强for循环 非常常用
    */

--------------------------------------------------------------- List集合----------------------------------------------------------

--------| List集合

List 接口 有序 可重复
ArrayList 【重点】

ArrayList是底层维护了一个Object类型的数组,这样的话这个ArrayList既可以保存任意类型的数据
特征:
当调用无参构造方法ArrayList,这里创建的底层Object类型的数组元素个数默认为10
DEFAULT_CAPACITY 10

    查询快,增删慢
开发中使用ArrayList比较多的情景:
    图书馆,人员管理

----| ArrayList特有方法:

ensureCapacity(int minCapacity); 不常用
判断当前ArrayList里面保存元素内容Object数组,元素个数是否大于minCapacity

trimToSize(); 不太常用
截断底层维护的Object类型的数组,让数组容量变成当前ArrayList的size值【有效元素个数】
size();

查询快, 增删慢的原理:
查询快:
    ArrayList底层维护是一个Object类型的数组,可以完成使用数组的下标机制来访问数据,这
    种访问形式是非常快的
        
增加慢:
    是因为在添加数据的时候,有可能导致ArrayList底层的Object数组的元素个数不够用,那么会
    调用数组的扩容方法 grow,而扩容方法,是创建了一个新的数组,数组的元素个数大于是老数组的
    1.5倍,这里会利用一些方法,把老数组里面的元素完完整整的拷贝的到新数组,这个拷贝过程很占
    用时间和内存
        
删除慢:
    因为删除某一个元素,会导致数组中该元素之后的数据,做一个整体的左移,这里也是一个数组的拷
    贝过程,整个过程非常浪费时间



面试题:
    1. 如果调用了ArrayList的无参构造方法,那么请问底层维护的Object数组默认的元素个数是多少?
    如果是调用这个方法呢 new ArrayList(8);
    答:默认元素个数为10 ,如果调用了new ArrayList(8) Object数组,元素个数为8
    
    2. ArrayList是一个可以自增长的空间,请问,增长的原理是什么?增长的长度是多少?
        ArrayList底层维护的是一个Object数组,默认元素为10,如果添加元素时,当前需求的元素空
        间超出了Object数组的元素个数,会调用底层的grow,进行数组元素的扩容和拷贝
        扩容量是大约1.5倍
            新元素个数 = 老元素个数 + (老元素个数 >> 1);
            newCapacity = oldCapacity + (olcCapacity >> 1);  

----|LinkedList特有方法:
底层维护的是一个链表

addFirst(Object o);
addLast(Object o);
getFirst();
getLast();

removeFirst();
removeLast();

--------------------------------------------------------------Set------------------------------------------------------------------

--------| Set 接口 无序 不可重复

HashSet 底层维护是一个【哈希表】,存储效率很高!!!
TreeSet

比较器:
Comparable接口 实现compareTo方法
Comparator接口 实现compare方法

发现:
1. 添加元素的时候,每一次都会调用hashCode方法
2. 重写equals方法和HashCode方法,也是首先调用hashCode方法,再来调用equals方法

----| HashSet存储原理:【背下来!!!】
向HashSet集合中添加元素,HashSet首先会调用该元素hashCode方法,获取该对象的Hash值
通过【移位】运算,计算出,该元素应该保存在【哈希表】中哪一个位置

情况1:
    该位置没有任何元素,直接放入

情况2:
    该位置存在其他元素,哈希表就会调用该元素的equals方法,和已经保存在哈希表里面的元素进行
    比较
    如果比较结果为true 表示相同元素,无法添加
    如果比较结果为false,表示为不同元素,可以添加

哈希表的每一个单元格都是一个桶式结构,可以保存多个元素,允许元素共存!!!


TreeSet是一个树形结构的Set结构 
因为TreeSet是一个树形结构,所有的元素都需要进行比较之后才可以放入到Set集合中,而
    字符串和自定义类对象是没有比较的方式和方法的
    
    【要求】在TreeSet里面的所有的元素都要有【比较的方式】或者有【自然顺序】

----------------------------------------------------------Map-----------------------------------------------------------------------

--------| Map 双列集合,这是一个接口

HashMap
TreeMap

K:Key 键 !!! 唯一值!!! 不允许重复!!!
V:Value 值 一个键(Key)对应一个值(Value) 可以重复的
    
在Map 双列集合中,保存的只能是一个键(Key)值(Value)对!!!
    
    
Map中要学习的方法:
    增
        put(K key, V value); 添加一个键(Key)值(Value)对
        putAll(Map map);
        添加一个符合数据类型的Map双列集合
    删
        clear(); 清空所有的键(Key)值(Value)对
        remove(Object key); 根据Key删除对应的键(Key)值(Value)对
    改
        put(K key, V value); 当键(Key)存在时,这个操作是重新修改值(Value)
    查    
        size(); 获取键值对个数
        get(Object key); 通过键(Key)找出对应的值(Value)
        containsKey(Object key); 查看这个Key是否在Map中存在
        containsValue(Object value); 查看这个Value是否在Map存在
            
        keySet(); 返回所有键(Key)Set集合
        values(); 返回所有值(Value)Collection集合

----| HashMap 实现类

 这里把键值对,认为是一个对象,组成一个类,称之为Entry
    
     class Entry {
        K key;
        V value;
     } 
     这里可以认为在Map集合中,保存的每一个键值对都是一个Entry对象,把这些Entry对象获取出来,
     做成一个集合,进行遍历
     entrySet();
     Map.Entry

你可能感兴趣的:(集合)