推广java我最强_看透你【精选干货】Java集合类总结-Java我最强

【精选干货】Java集合类总结-Java我最强

作者 |小球学java

编辑 | Sandra

原文 |http://www.jianshu.com/p/4345069ada16

整天搞技术撸代码太累了

我们来玩点轻松的

【疯狂的工位】活动火热进行中

详情戳【活动】老大说要给粉丝送礼物,于是我...

1

简 介

Java集合类包含在java.util包下

集合类存放的是对象的引用,而非对象本身。

集合类型主要分为Set(集),List(列表),Map(映射)。

1.1

Java集合类图

从上述类图,自己整理出主要内容是如下:

2

集合详解

2.1

HashSet

HashSet是Set接口的一个子类

主要的特点是:

1、里面不能存放重复元素西贝尔跑车 ,元素的插入顺序与输出顺序不一致;

2、采用散列的存储方法,所以没有顺序。

代码实例:HashSetTest

输出结果:

小结:

HashSet存放的值无序切不能重复,可以存放null,但只能存放一个null值 。

HashSet 继承AbstractSet,有两个重要的方法,其中HashCode()和equals()方法,当对象被存储到HashSet当中时,会调用HashCode()方法,获取对象的存储位置。

HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等。

2.2

LinkedHashSet

1、LinkedHashSet是HashSet的一个子类;

2、只是HashSet底层用的HashMap,而LinkedHashSet底层用的LinkedHashMap雷劈数。

LinkedHashSet代码实例:

输出结果:

小结:

此时麻生希步兵,LinkedHashSet中的元素是有序的。

2.3

SortedSet(接口)

1、SortedSet是一个接口高进忠,里面(只有TreeSet这一个实现可用)的元素一定是有序的。

2、保证迭代器按照元素递增顺序遍历的集合,可以按照元素的自然顺序(参见 Comparable)进行排序, 或者按照创建有序集合时提供的 Comparator进行排序。

其源码如下:

2.4

TreeSet

TreeSet类实现Set 接口,该接口由TreeMap 实例支持,此类保证排序后的 set 按照升序排列元素。

根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable或按照在创建 set 时所提供的比较器进行排序。

Set 接口根据 equals 操作进行定义,但 TreeSet 实例将使用其 compareTo(或 compare)方法执行所有的键比较洪震南。

代码实例TreeSetTest:

实例用TreeSet保存对象引用郭桂彬 ,并且实现Comparator中compare方法进行比较和排序。

输出结果:

表明TreeSet是可以按照自定义方法中的比较进行排序的森马鞋,且可以有空值。

2.5

Vector

1、Vector 类也是基于数组实现的队列,代码与ArrayList非常相似。

2、线程安全,执行效率低。

3、动态数组的增长系数。

4、由于效率低,并且线程安全也是相对的,因此不推荐使用vector。

2.6

Stack

Stack 是继承了Vector,是一个先进后出的队列。

Stack里面主要实现的有一下几个方法:

代码实例StackTest:

输出结果:

Stack 是一个有序的栈,遵循先进后出原则。

2.7

ArrayList

ArrayList是List的子类,它和HashSet相反,允许存放重复元素古墓荒斋,因此有序。

集合中元素被访问的顺序取决于集合的类型。

如果对ArrayList进行访问,迭代器将从索引0开始,每迭代一次,索引值加1。

然而,如果访问HashSet中的元素,每个元素将会按照某种随机的次序出现。

虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元素被访问的次序。

代码实例:ArrayListTest

输出结果:

ArrayList是一个有序且允许重复和空值的列表

2.8

LinkedList

LinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列。

代码实例:LinkedListTest

输出结果:

LinkedList是有序的双向链表,可以在任意时刻进行元素的插入与删除,读取效率低于ArrayList,插入效率高。

pop和push操作都是在队头开始。

2.9

HashMap

HashMap的数据结构:

数组的特点是:寻址容易,岑碧青插入和删除困难;

而链表的特点是:寻址困难,插入和删除容易。

哈希表结合了两者的优点。

哈希表有多种不同的实现方法醋溜藕片,可以理解将此理解为“链表的数组”。

从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中:

12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。然后每个线性的数组下存储一个链表,链接起来。

首先HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value孙伯伦, next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean.我们上面说到HashMap的基础就是一个线性数组中医天下 ,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。

HashMap的存取实现:

疑问:如果两个key通过hash%Entry[].length得到的index相同,会不会有覆盖的危险?

这里HashMap里面用到链式数据结构的一个概念。上面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。打个比方,第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?

HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起妻定神闲 。所以疑问不用担心。也就是说数组中存储的是最后插入的元素。

HashMapTest代码实例,自我实现HashMap:

Entry.java

MyHashMap.java

MyHashMapTest.java

输出结果:

2.10

WeekHashMapTest

输出结果:

2.11

HashTable与HashMap的区别

HashTable和HashMap存在很多的相同点,但是他们还是有几个比较重要的不同点。

我们从他们的定义就可以看出他们的不同,看透你 HashTable基于Dictionary类李微然,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类韩毒dj,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。如下:当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。

Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable重生之严叙,没有涉及就采用HashMap,但是在Collections类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的synchronizedMap方法是可以我们你同步访问潜在的HashMap。

遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式。

Java我最强,是专注Java技术的垂直社群,加入精品技术群请公众号后台留言“加群”。投稿合作请邮件至:javawozuiqiang@qq.com,注明“Java我最强投稿”。

Java我最强

关心Java人成长的技术内容社区

快速关注

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值