首页 > 其他分享 >集合

集合

时间:2022-09-07 21:12:16浏览次数:55  
标签:HashMap -- 链表 线程 数组 集合

1、数组、链表、集合?

  • 数组:
    是有序的元素序列,用于储存多个相同类型数据的集合。
    可存基本数据类型、引用数据类型
    静态分配内存
    在内存中连续
    元素在栈区
    长度不可变
    空间连续
    优点:查改快
    数组int范围-2^31 ~~ 2^31-1
    问题缺点:增删慢
    使用情景:元素个数固定时

  • 链表:
    是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
    链表出现原因:为了解决hash冲突
    动态分配内存,减少内存空间浪费
    在内存中不连续
    元素在堆区
    优点:增删快
    缺点:查询慢 ---- 跳表技术

  • 集合:
    是一个用来存放对象的容器
    集合出现的原因:一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的。为了保存数量不确定的数据,有了集合。
    集合只能存引用数据类型(对象的引用),存储基本数据类型会自动装箱成包装类对象
    长度可变;空间不连续,增删快
    数组可以存基本数据类型(值),也可以存引用数据类型(地址值)
    定义数组时必须指定元素类型;长度不可变;空间连续,查改快
    使用情景:元素个数不固定时

2、集合?

  • 集合可分为 Collection 和 Map 两种体系
  • Collection接口:单列数据,定义了存取一组对象的方法的集合
  • Map接口:双列数据,保存具有映射关系“key-value键值对”的集合

3、HashMap底层原理?

  • 数组+链表+红黑树
  • hashcode --> MD5
  • 哈希算法:又称散列
    • 任意长度输入-->固定长度输出
  • 通过字符串算出它的ascii码,mod取模,算出下标;
  • mod:解决数组连续的问题,减少浪费空间,带来新的问题:hash冲突/碰撞
  • 解决hash冲突:链表
  • put(key,value){hash(key)}方法
    • 通过key进行hash算法算出hashcode值-->取模mod得到下标位置-->去数组找到下标对应的Entry对象,当前对象是否为空,if空直接存储key和value,if不为空,用链表,最后返回
  • hashcode作用:定位在链表上的位置
  • jdk1.8之后,将头插法改成尾插法,加了红黑树(因为链表查询慢)
    • 红黑树快的原因:小中大、左中右
    • 尾插法:不会影响原有的顺序,解决了节点相连成环的问题
  • 默认容量16,负载因子0.75,当链表长度大于等于8,将以红黑树形式存储,当长度降到6,转成链表
  • 无序,速度快,允许null键和null值,不支持线程同步,线程不安全

4、Collection和Collections的区别?

  • Collection:是集合类的上级接口,继承它的接口主要有Set、List;
  • Collections类:是一个操作集合的算法工具类,只能操作Collection接口下的集合(Map集合不能使用该类)提供了一系列静态方法实现对各种集合的搜索、排序、线程安全等操作
    • sort自然排序
    • swap交换两元素的位置
    • reverse反转集合

5、Vector、ArrayList和LinkedList的区别?

  • Vector:底层是数组,线程安全,初始容量10,查询快,线程安全;

  • ArrayList:底层是数组,线程不安全,初始容量0->10,查询快,线程不安全;

  • LinkedList:底层是链表,线程不安全,初始容量无,增删快,线程不安全。

    • 事先不知道数组大小 --> vector
    • 频繁访问列表中的某一元素 --> ArrayList
    • 循环迭代访问列表 --> LinkedList

6、list、set、map的区别?

  • list:继承collection接口,有序,可以重复,线程不安全,增删慢,查询快;
  • set:继承collection接口,无序,不重复,线程不安全,增删快,查询慢;
  • map:与collection接口并列,键唯一,value可重复,线程不安全,增删改查都快;
    • *set出现的原因:去重 --> 哈希值和equals方法

7、HashSet和TreeSet和LinkedHashSet区别?

  • HashSet:基于HashMap实现,无序的;
  • TreeSet:基于TreeMap实现,底层是红黑树,有序的;
  • LinkedHashSet:内部是双向链表,有序的

8、HashMap和Hashtable的比较?

  • HashMap异步的,线程不安全,可以存null键和null值,效率高,初始大小16,扩容2的幂次方
  • Hashtable是同步的,线程安全,不可以存null键和null值,效率低,初始大小11,扩容2n+1

9、HashMap和ConcurrentHashMap区别?

  • HashMap:全局锁不同步,线程不安全,不适用多线程并发环境,
  • ConcurrentHashMap:分段锁,只能保证单个方法同步,线程安全的集合容器,效率更高

10、HashMap和LinkedHashMap的区别?

  • LinkedHashMap继承于HashMap,底层基于HashMap和双向链表实现,有序,比HashMap多了一个链表的结构
  • HashMap存储和取出都是无序的,LinkedHashMap取出是有序的

11、ArrayList、LinkedList、HashMap初始大小,add后是多少?(jdk1.8)

  • ArrayList:new 0 空数组没添加元素时为0,初始容量10,扩容因子1.5,eg.10-->15-->22,最大值Integer.MAX_VALUE-8;
  • LinkedList:没有初始化大小,也没有扩容的机制;
  • HashMap:初始大小16,扩容(负载)因子0.75,eg.容量16的HashMap,当插入第13个元素时,就会扩容成当前数组的2倍的新数组,hashcode会变。

标签:HashMap,--,链表,线程,数组,集合
From: https://www.cnblogs.com/wyzel/p/16663974.html

相关文章

  • Set集合学习笔记
    set集合特性:元素不可重复元素无序实现类:HashSetTreeSet 集合声明语法:Set接口<泛型>集合名称=newSet接口的实现类<>(); HashSet集合因为......
  • List集合学习笔记
    List集合语法:集合定义List<泛型>集合名称=new实现类<泛型>();泛型:集合中存储数据的数据类型: 如果存储基本数据类型的话,那么这里就得使用基本数据类型......
  • Map集合学习笔记
    规则:Map集合是一个双列集合,元素有键值对构成.(key-value)key值不可以重复的,value是可以重复的(因为Map中的key是存储到了set集合中)一个key只能对应一......
  • Collection集合中的 contains 和 remove 使用深入——要重写equals
    参考引用:http://t.csdn.cn/8z6sC 使用Collection集合中的contains,remove,removeall的时候,元素一定要重写equals方法,不然它里面的判断会容易出现“预期错误”。......
  • AcWing 4604. 集合询问
    https://www.acwing.com/problem/content/4607/哈希表题意:初始时空集{},进行t次操作,操作分为:+x,将一个非负整数x添加至集合中。注意,集合中可以存在多个相同的整......
  • UNI-APP代码规范集合
    一、路径规范:建议统一采用以@开头的路径。比如:1import$stringfrom'@/common/js/string.js'2@import'./common/uni.css';3<imageclass="logo"src="@/static/l......
  • CentOS7 常用命令集合
    CentOS7常用命令集合CentOS7常用命令集合常用命令文件与目录操作命令解析cd/home进入‘/home’目录cd…返回上一级目录cd…/…返回上两级目录cd-......
  • 使用集合判断成员是否存在(性能)
    要判断某个容器是否包含特定成员,用集合比用列表更合适。集合底层使用了哈希表数据结构。要判断集合中是否存在某个对象obj,python只需先用hash(obj)算出它的哈希值,然后直接......
  • python学习(元组、字典、set集合)
    (一)、列表 1、列表的嵌套 需求:输出数字9 解决:利用索引层级输出   2、列表的切片   (二)、元组:tuple1、列表与元组的区别?列表是可变的,元组是不可变的......
  • python(二)元组、字典、集合
    11.列表的嵌套##列表的嵌套、字符类型#list4=[1,'go','你好',1008.21,True['json','java','c++','go',[1,2,3,7]]]#print(list4[])##列表的切片,获取列表中指定范围的......