集合

--------| 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<K, V> 双列集合,这是一个接口

HashMap
TreeMap

K:Key 键 !!! 唯一值!!! 不允许重复!!!
V:Value 值 一个键(Key)对应一个值(Value) 可以重复的
    
在Map<K, V> 双列集合中,保存的只能是一个键(Key)值(Value)对!!!
    
    
Map中要学习的方法:
    增
        put(K key, V value); 添加一个键(Key)值(Value)对
        putAll(Map<? extends K, ? extends V> 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, V> {
        K key;
        V value;
     } 
     这里可以认为在Map集合中,保存的每一个键值对都是一个Entry对象,把这些Entry对象获取出来,
     做成一个集合,进行遍历
     entrySet();
     Map.Entry
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • Collection接口 Collection接口是所有集合的祖先类。他有两个构造方法,一个无参构造,一个是带Co...
    夜幕繁华阅读 585评论 0 0
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 870评论 0 1
  • 3.3 集合 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另...
    闫子扬阅读 722评论 0 1
  • 以下是《疯狂Java讲义》中的一些知识,如有错误,烦请指正。 集合概述 Java集合可以分为Set、List、Ma...
    hainingwyx阅读 534评论 0 1
  • flask-uploads 是封装的 flask里的文件上传功能,此处以实现用户头像上传为例 官方文档介绍:点我 ...
    宝宝家的隔壁老王阅读 22,845评论 2 14