ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java集合知识

2021-07-16 23:01:51  阅读:161  来源: 互联网

标签:扩容 Java 容量 知识 接口 线程 哈希 集合 底层


本文介绍Java集合接口,接口实现类的内容,接口实现类(底层数组)扩容机制,使用场景;

1.接口图解

 

 

集合里面储存的都是对象,不存储基本数值类型,我们所看到的基本数据类型,都是装箱的结果(自动装箱); 

Collection接口:List接口和Set接口的父接口;储存无序不唯一的对象;

List接口:List简称列表,储存有序不唯一的对象,有序是指对象插入顺序与遍历时看到的顺序相同的;不唯一是因为列表里面的元素可以重复;

Set接口:Set简称集,储存无序唯一的对象,无序是指对象插入的顺序与遍历看到的顺序不同,唯一是因为set要求元素有且仅有一个,不允许重复;

 

List接口实现内容:

ArrayList:存储无序不唯一对象,允许有null,底层是数组,查询速度快,插入删除慢,线程不同步,线程不安全,

LinkedList:储存无序不唯一对象,允许有null,底层是双向链表,插入删除快,查询慢,线程不同步,线程不安全,

vector:现在很少使用,基本上都是用ArrayLIst,线程同步,线程安全;

 

Set接口实现类:

HashSet:允许有null,元素唯一,插入顺序与遍历顺序不同,根据哈希码决定储存数据的顺序,底层是HashMap,线程不同步,线程不安全,有扩容机制;

系统默认的比较两个对象是否是同一个对象,判断的过程:第一步比较hashCode,如果hashCode不相同,则不进行后面的比较,第二步:第一步是true,将比较内存地址是否相同;默认的hanshCode值是内存地址根据一定的计算得到的结果;肯定有人会说既然哈希码与内存地址有关系,那直接比较哈希码就能说明是不是同一个对象,数学很有魅力的地方之一就在这里,也许内存地址不同也能算出相同的哈希码,这样的可能是存在的;一般我们会根据业务逻辑重写equals方法和hashCode方法;从上面系统默认的计算哈希码的结果可以看出来,两者都用到了内存地址;equals方法和hashCode方法存在这样的关系,即两者使用的变量需要保持一致;

TreeSet:不允许有null,不允许重复,实现了SortedSet接口,底层是TreeMap,二叉树结构,中序遍历(左根右)(树的遍历方法之一),存储顺序  1.自然排序(装箱以后的基本数据类型)2.比较器排序(Comparator或者Comparable);

LinkedHashSet:插入顺序即储存顺序,不允许重复,允许有null,底层是数组和链表,线程不安全;

 

Map接口实现类:Entry<key,value>

HashMap:底层是数组+链表混合体(哈希数据结构),允许一个键为null,线程不安全,如果有哈希冲突,则使用散列链表形式将所有的元素串起来;

TreeMap:底层是红黑树,实现SortedMap接口;

HashTable:底层是数组+链表混合体(哈希数据结构),继承Dictionary类,键值均不允许有null,线程安全;

 

扩容,即当前集合能容纳的数量达到一个饱和状态(饱和状态与加载因子有关)之后,集合需要申请新的空间;

需要扩容的集合一般都是基于底层是数组实现的,链表不涉及扩容问题;

LinkedList,TreeSet,TreeMap这类底层数据结构离散(链表,红黑树)的集合容器,不存在扩容一说,没有初始化大小,没有扩容机制,新增元素时,会直接为新元素动态分配内存;

ArrayList

底层数组,默认容量:0(在jdk1.8以前是10),加载因子:1,扩容增量:增量是原来容量的0.5倍,即扩容以后的容量是原容量的1.5倍;

Vector

底层数组,默认容量:10,加载因子:1,扩容增量:增量是原容量的1倍,即扩容以后的容量是原容量的2倍;

HashSet

底层是HashMap,默认容量:16,加载因子:0.75,扩容增量:容量达到总容量*0.75,将引起扩容,扩容以后的容量是原容量的2倍;

HashMap

底层是哈希表结构,默认容量:16,加载因子:0.75,扩容增量:容量达到总容量*0.75,将引起扩容,扩容以后的容量是原容量的2倍;

HashTable

底层是哈希表结构,默认容量:11,加载因子:0.75,扩容增量:容量达到总容量*0.75,将引起扩容,扩容以后的容量是原容量的2倍+1;

 

集合使用场景图

 

 

刚接触,整理定有不足之处,望海涵,不足或者错误之处还望指正!!!

 

标签:扩容,Java,容量,知识,接口,线程,哈希,集合,底层
来源: https://www.cnblogs.com/ycc-ycc/p/15022200.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有