集合 List、Set、Map 的区别和实现原理_容器map和set,list和set 对比和底层实现-程序员宅基地

技术标签: 集合  java  学习笔记  arraylist  hashmap  class  JAVA-SE  

        Java中的集合包括三大类:
        它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。
        Set的实现类主要有HashSet和TreeSet。
        List的实现类主要有ArrayList。
        Map的实现类主要有HashMap和TreeMap。


        一、L i s t

        共性:有序  可以重复

        List集合特征:

        (1)允许重复元素添加

        (2)有序:放入的顺序和取出的顺序是一样的

        1、ArrayList 

        (1)没有线程安全,性能高

        (2)容量默认初始容量10,(可以赋初始值) 增长时,容量增加1/2

        容量扩展是按照 + 0.5倍扩展,就是原来集合长度一半

        比如《10+5》《15+7》《22+11》

        2、Vector   

        (1)具有线程安全,性能低  

        (2)容量默认初始容量为10,(可以赋初始值,增长容量) 增长时,容量加倍

        容量扩展是按照 + 1倍扩展,就是原来集合的长度 + 1倍

        比如:<10(原来集合长度)+10(扩展长度)>  <20+20>  <40+40>





        3、LinkedList  链条式集合 (双向链表算法)会有前置节点和后置节点

        找不同点

        ArrayList

        (1)算法:简单的数组算法

        (2)查找:每个元素有固定的索引位置,查找直接根据位置定位获取,性能高

        (3)插入删除:每次操作插入或者删除,都会影响后面元素的索引位置,后面元素都要懂,性能低



        LinkedList

        (1)算法:双向链表式算法

        (2)查找:每次都要从开始往后依次查找,性能低

        (3)插入删除:每次操作插入删除,只需要修改元素的后置节点引用,不需要后面元素移动位置,性能高

        二、Set集合

        1、HashSet

        集合有序无序:放入元素的顺序是否和取出的顺序一致

        TreeSet可以将元素按照规则排序,但是和放入的顺序不同就是无序

        无序(和加入元素的顺序不一样)的,不可以重复的 算法:哈希算法

        Set是接口不能new对象------>实现类HashSet;



        ①、区别:

        取元素的时候不能get

        循环迭代的时候不能使用简单的for循环,

        要用迭代器或者增强型for循环(跟之前一样)



        ②、不可重复

        (1)如何判断对象相同?

        主要是根据对象的hashCode值判断 而equals方法不是主要的

        原则上应该遵循:类重写equals方法  同时重写hashCode方法





        2、TreeSet  语法也是相同的

        SortedSet(Set的子接口)----->TreeSet 实现类

        TreeSet <> = new TreeSet<>();

        集合有序无序:放入元素的顺序是否和取出的顺序一致

        TreeSet可以将元素按照规则排序,但是和放入的顺序不同就是无序

        TreeSet比较对象大小时,

        要使用类的compareTo方法,

        如果(前边>后边)返回正数

        如果(前边<后边)返回负数

        相等返回0,同时认为是相同的对象,不添加重复对象

        引用类型要先转换为Compilable才能进行比较

        TreeSet 判断对象相同时:

        是根据对象的大小判断,如果两个对象大小相等,就认为是相同的对象

        比较大小的compareTo方法 返回0 就是两个相等的对象

        重写compareTo方法时,注意返回0的情况



        Public  cladd  Student  implements  Compilable(接口){

        }(实现接口Compilable)

        可以自己重写写compareTo方法

        三、集合 Map(接口)


        --------->HashMap(实现类)--->非线程安全

        ---------> Hashtable(实现类)-->线程安全

        Hashtable:语法跟HashMap是一样的

        区别:

        (1):null

        HashMap 是允许null 作为 key 和 value 的

        Hashtable 不允许 null 作为 key 或

        value 的

        (2):都实现了 Map 接口

        HashMap 父类是java . util . AbstractMap

        Hashtable 父类是java . util . Dictionary--->di ke shen ne rui --字典的意思

        (3):线程安全

        HashMap: 非线程安全   性能高

        Hashtable: 线程安全   性能低

        附加使用方法:


        1、创建ArrayList

        ArrayList list = new ArrayList();




        2、添加对象

        List . add(引用数据类型);


        List . add(new integer(1));-->基本数据类型

        将int --->Integer



        3、集合长度

        List . size();



        4、获取某个

        List . get (索引位置);



        5、循环迭代

        1)For 循环:注意长度是size


        2)for each 循环

        for(类型 变量名 : 集合或者数组){

        变量名 就是每次循环取出的元素

        }

        优点:代码减少简单

        缺点:没有索引位置,用索引位置的话需要自己定义一个计数器


        2)迭代器,循环迭代集合

        Iterator迭代器 接口-->yi te rui ter

        迭代器对象:都是通过要迭代的集合对象 . iterator() 返回迭代器对象

        Iterator it = list . iterator();

        Hasnext()

        Next();



        While(it . hasNext()){ 判断有没有下一个 有true 没有 false

        Object 0 = it.next(); 向下移动,指向下一个并返回

        System.out.println(o);

        }

        迭代器只能用一次,想在循环必须在长生一个新的迭代器



        6、删除

        (1)List . remove(索引位置 或者 对象);

        这里输入的对象要跟集合里面的对象一模一样才可以被删



        (2)当有多个元素相同需要删除的时候必须使用循环删除(使用迭代器删除):

        再循环中使用  迭代器删除对象 it . remove(不需要传参数);默认删除当前或最后取出 的元素


        7、判断集合是否为空

        (1)  If(list . size == 0)

        (2)  If ( list . isEmpty )

        (3) 不能写 list == null   



        8、清空集合

        List . clear();

        9、插入

        List . add(int i , Objcet o)

        LinkedList

        除了具有ArrayList的功能还具有

        1、直接在第一个位置添加

        List . addFirst(“    ”);

        2、直接删除第一个位置

        List . removeFirst();不需要传参

        3、直接在最后一个位置添加

        List . addLast(“   ”);

        4、直接删除最后一个

        List . removeLast();不需要传参


        HashMap:



        创建对象

        HashMap map = new HashMap();



        添加元素:

        key-value  键值对 唯一的 key 对应 value

        Map . put( key, value );

        添加时 value 值是可以相同的

        Key 值如果相同 后来的会覆盖原来的 value



        取元素 :

        通过唯一的key 获取 value

        Map . get( key );



        判断一个键值对是否存在?关键是看 key

        Boolean flag = map . containsKey(key值);

        If(falg){

        存在(包含)

        }else{

        不存在(不包含)

        }



        删除:

        Map . remove(key);



        判断集合是否为空:

        Map . isEmpty();



        清空集合:

        Map.clear(); -->ke lai er



        循环迭代:Map不支持迭代器迭代,不支持foreach

        (1)获取所有的key :keySet() 返回所有的key,是一个set集合

        Set keys = map . keySet();

        For(Object key : keys){

        System.out.print(key+:);(可以不打印)

        System.out.println(map . get(key));

        }



        (2)获取所有的value:values  

        使用map的 values()方法 返回所有的value值的 Collection集合 不能通过value获取key

        Collection coll = map.values():

        for(Object o : coll){

        System.out.println(o);

        }



        (3)Entry---> en chui

        通过map的 entrySet()方法 获取Entry(键值对)的Set集合  

        Entry结构是key-value

        有泛型

        Set <Entry<Integer,Song>> entrys = map.entrySet();

        For(Entry<Integer,Song>  e : entrys){

        Systrm.out.println( e.getkey() + e.getvalue);



        }



        没有泛型(报黄线的那个)

        For(Ovject o : entrys){

        Map . Entry  e  = (Map. Entry) o;

        红色省略

        Entry e = (Entry) o;

        Systrm.out.println( e.getkey() + e.getvalue);

        }


        愿你一生努力
        一生被爱
        最想要的都拥有
        得不到的都释怀
        我的故事很长
        你愿听~
        我愿讲~
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lipeng88888888/article/details/78456047

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法