浅谈java集合

大家在知道集合是用来存放对象的,本文主要讲解集合内部构造和各个集合之间的区别,如果学过数据结构应该很容易理解。  api就不过多介绍,无非就是一些增删改查操作。

java集合分类两大家族,Collection家族和Map家族,类图画的不是很详细,但总体也就是分为这样

 

Collection

collection家族重要成员主要是LIst和Set

List

List集合特点:list集合也是collection,list特点是存放的元素可以重复,有序(放入容器的顺序和取出来的顺序一致)的。接下来说一说他的子类

ArrayList

看到array,我们也大致明白了,ArrayList内部结构是基于数组的,既然是基于数组,那么它存储的数据地址应该是相邻的,当增加的对象快要填满数组时,这时候就会自动扩充至原来的1.5倍,可通过下标获取某个元素。但是如果是插入对象和删除对象时,就会很复杂,因为是顺序存储,所以要先挪动一些元素来完成操作。

LinkedList

LinkedList是基于双向链表的存储方式,相较于ArrayList来说,他除了存放对象之外,还要存放两个指针,前趋和后继,使用LinkedList的优点是进行插入元素和删除元素是比较方便,但如果是进行查找某个元素的话,会是很麻烦的,因为它不知道这个元素不知道存储在什么位置,就要从头指针和尾指针进行遍历,直到找到这个元素,这样的效率是很慢的,而且占用的空间也比较大。可以和ArrayList进行比较使用。

Vector

Vector和ArrayList是比较相似的,他们都是使用数组的方式存储,最大区别就是Vector是线程安全的,ArrayList是线程不安全的,所以ArrayList相比于Vector存储速度是要快的。

Vector

ArrayList

Set

set集合特点:元素是无序的,元素不可重复。

set集合明明是Collection家族的,但是它尿性很大,一切结构都来自于Map集合,所以先来看看Map家族

Map

Map集合和Collection集合最大区别就是,Collection每次只存入单个对象,而Map集合每次存入的是<K,V>键值对,根据键得到值,因此键不允许键重复,但允许值重复。

HashMap

HashMap存入的元素是无序的,基于hash表存储

HashMap平时我也用到的很多,结构也挺复杂,既然是浅谈集合,就不聊的太深了。有兴趣的可以借鉴一下dalao的文章(深入学习集合之HashMap实现原理

HashMap的存储原理:主要是使用hash表来存储,学过数据结构的应该都知道。hash表是数组和链表的结合体,即拥有数组的优点又拥有链表的优点。但是它是怎么存储两个对象的呢?当我们调用put方法添加元素时, 一般key为String对象,value可以用泛型来规定。实际上map的结构是Entry对象的一维数组,Entry存放的是K,V对,当添加一个K,V对时,拿到K的hash值,对这个hash值再次进行hash运算,得到新的hash值,对hash值与一维数组的长度进行按位与预算,得到下标位置,如果该下标有对象,那么这个对象的后继指针就指向新加入的对象。这样再进行get方法的时候,就不用循环遍历整个数组,而是根据hash值进行与运算拿到下标,如果当前下标有多个元素,在进行遍历链表。当添加元素到一定数量时,集合将会自动扩充。

TreeMap

TreeMap内部结构是红黑树,是一种平衡二叉树。可以对新增的数据进行排序,存放的元素对象要实现Comparator接口,TreeMap是线程不安全的

深入理解可以查看dalao 的文章(treemap原理)

Hashtable

Hashtable与HashMap存储类似,是同一存储结构,区别:

HashMap是线程安全,key值允许为null。

Hashtable是线程不安全的,key值不允许为null。Hashtable比HashMap多提供了elments() 和contains() 两个方法。

LinkedHashMap

LinkedHashMap继承与HashMap,但是内部维持了一个双向链表,可以保持顺序

LinkedMap在于存储数据你想保持进入的顺序与被取出的顺序一致的话,优先考虑LinkedHashMap

(深入理解LinkedHashMap)

Set

接下来说说这个尿性的Set集合,看一下他的构造方法

啊!我的眼睛,他竟然是个Map,再看看他的方法

竟然也是调用的map的put方法,好吧。其实Set集合存储原理和Map一致,只不过他是只存储Key,而value由一个常量对像存储。所以他拥有Map的一切特性,只不过他每次只存入一个对象,而不是一个K,V对,所以规到了Collection家族,所以说只要理解了Map,Set就不是问题了,放入的元素是不能重复的

判断是否重复的原则:将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。
如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值