Java教程

Java集合知识

本文主要是介绍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集合知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!