Java-集合

Java 集合

1:集合的产生???
程序运行中我们会创建非常多的对象,为了对这些对象存放和管理,就提出了容器的概念.
数组就是一个容器,但是数组长度是固定的,这时候就出现了一个集合的概念.

1:什么是集合
Java集合:是一个用来存放对象的容器

注意:
1:集合只能存储对象,基本数据类型,会自动转换成对象类然后存入
2:集合存储的是对象的引用而非本身,对象还是存在堆内存中
3:集合可以存放不同类型 不限制数量(泛型统一类型,自动扩容)

问题:

集合和数组的区别
1:长度不同 结合不固定长度 数组固定长度
2:数据不同 数组存储基本数据类型和引用数据类型 集合只能存储引用数据类型(基本数据类型会转换为对象)
3:存储元素不同 数组只能存储同一种类型元素 集合存储多种数据类型(一般也是存储一种数据类型,泛型规范数据类型)

类型图:
https://img2018.cnblogs.com/blog/1175569/201908/1175569-20190813185822827-390071136.png

集合:
Collection 单列集合 实现 Iterable 接口 封装了 Iterator 迭代器

Map 双列集合 key values 形式存储数据

结构:

Collection ---> AbstractCollection extends Collection

            -->AbstractQueue implements AbstractCollection
            -->AbstractList  implements AbstractCollection
            -->AbstractSet   implements AbstractCollection

Collection ---> List
---> AbstractList extends AbstractCollection implements List

                                ---> ArrayList extends AbstractList implements  List<E>
                                
                                ---> Vector extends AbstractList<E> implements  List<E>
                                            ---> Stack                  
       ---> Set
                --->AbstractSet extends AbstractCollection  implements Set
                                --->HashSet extends AbstractSet<E> implements Set<E>

                                无序唯一 允许Null
                                            ---> LinkedHashSet 链表+hash 有序唯一 允许Null
                                            --->TreeSet
                ---> SortedSet<E> extends Set<E>
                
                            --->TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>
                            
                               自然排序 定义排序 不能未空
                            
       ---> Queue extends AbstractQueue  implements Set
       
                --- AbstractQueue extends   AbstractCollection implements Queue<E>
                
               LinkedList extends AbstractQueue implements List<E>, Deque<E

Collection 实现 ---> AbstractCollection 实现Collection接口

                                --->AbstractList 继承 AbstractCollection 实现List接口
                                                ---> AbstractSequentialList
                                                                            --->LinkedList
                                                --->Vetor
                                                        --->Stack
                                                --->ArrayList AbstractList (实现List 接口)      

Map --->AbstractMap implements Map
--->HashMap 允许 NUll key 0
--->LinkedHashMap
--->ConcurrentHashMap
--->WeakHashMap

--->SortedMap extends Map
            --->TreeMap
            
 --->HashTable  extends Dictionary  implements Map  HashTable  key values 都不能为空 
            ---> Properties

Vector、HashTable extends Dictionary 、 ConcurrentHashMap extends AbstratMap Properties extends Hashtable 线程同步,线程安全 其他不安全

问题:
Hash冲突??
hash 是将数据生成一个int类型的数字,数据是无线的hashCode 是有线的 所以当不同数据得到相同的hashCode的情况就叫Hash冲突
解决方案: 再hash

/**
* 集合去重
*/
public static void processList() {

    ArrayList<String> arrayList = new ArrayList<>();
    long sTime;
    for (int i = 0; i < 10000; i++) {
        arrayList.add("位置:" + i);
        if (i % 2 == 0) {
            arrayList.add("位置:" + i);
        }
    }
    
    sTime = System.currentTimeMillis();
    //因为 LinkedHashSet 链表+hash 实现  数据唯一 有序  
    LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>(arrayList);
    List newList = Arrays.asList(linkedHashSet.toArray());
    ArrayList<String> arrayList3 = new ArrayList<String>(newList);
    System.out.println("时间:" + (System.currentTimeMillis() - sTime) + "");
    System.out.println("数据:" + arrayList3);

}

Collection 单列集合

Collection接口 提供了迭代器的方法 提供了add contains remove clear() size() 等方法

1:List 继承于Collection接口 有序可重复集合(允许Null) 提供了get 方法
    List接口继承于Collection接口拥有迭代器访问的属性,同时提供了有序存储和获取的方法 可以根据索引获取对象
    
    1:ArrayList实现有序访问可重复
            问题:ArrayList实现有序访问原因?
    add()的时候 数组+System.arraycopy()  通过索引存储
    2: Vector 和ArrayList 相似 同步线程安全(add方法 synchronized 修饰,所以是同步的)
    LinkedList LinkedList是采用双向循环链表实现,LinkedList是List接口的另一个实现 有序  不唯一
    既可以当一个接口也可以链表操作
    集合链表实现 
    
 数组:查询快,增删慢
 链表:查询慢增删快
 
 功能:
 ArrayList 底层数组 有序不唯一   线程不安全
 Vector    和ArrayList一样  线程安全
 LinkedList: 实现了Queue接口和List 接口 底层双链表 有序 不唯一  查询慢 增删快
    
    
2:Set 继承于Collection接口无序集合 Set代表无序不可重复集合,只能根据元素本身来访问

    HashSet 怎么实现唯一 ? hash保证唯一
    内部维护了一个HashMap 利用Key 唯一的特点存储数据保证唯一(会出现hash冲突)线程不同步
HashSet  LinkedHashSet  TreeSet 

HashSet 底层HashMap 数据唯一 
LinkedHashSet 继承 HashSet实现了数据唯一 调用addAll()数据通过角标添加到容器保证了顺序   
TreeSet 红黑树 支持排序

3:Queue继承于Collection接口 
    3.1是Java中定义的一种队列数据结构,元素是有序的(按插入顺序排序),先进先出(FIFO)原则
    3.2通常,队列不允许随机访问队列中的元素
LinkedList
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 【020 标记接口】 标记接口没有任何成员和方法,表明的是能够具备某种功能,通常是在编译器进行类型校验。 ① Cl...
    小笨特阅读 727评论 0 1
  • CollectionListSet泛型MapCollections Collecton1.1 集合知识回顾集合类的...
    LV大树阅读 51评论 0 0
  • 容器 很多时候,我们写程序需要进行批量的操作,比如说,新增一批学生列表.那么就需要有容器来装下这10个对象。Jav...
    AbstractCulture阅读 277评论 0 1
  • Collection: 在Java类库中,集合类的基本接口是Collection接口,这个接口有两个基本方法: 迭...
    PC_Repair阅读 297评论 0 0
  • JAVA集合 Java集合是使程序能够存储和操纵元素不固定的一组数据。 JAVA中的集合是一个类似一个‘’容器‘’...
    零散的蒲公英阅读 226评论 1 0