浅谈Java集合

一、集合简介

集合类是用来存放某类对象的。集合类有一个共同特点,就是它们只容纳对象(实际上是对象名,即指向地址的指针)。这一点和数组不同,数组可以容纳对象和简单数据。如果在集合类中既想使用简单数据类型,又想利用集合类的灵活性,就可以把简单数据类型数据变成该数据类型类的对象,然后放入集合中处理,但这样执行效率会降低。
集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,也就是说,集合类中容纳的都是指向Object类对象的指针。这样的设计是为了使集合类具有通用性,因为Object类是所有类的祖先,所以可以在这些集合中存放任何类而不受限制。当然这也带来了不便,这令使用集合成员之前必须对它重新造型。
集合类是Java数据结构的实现。在编写程序时,经常需要和各种数据打交道,为了处理这些数据而选用数据结构对于程序的运行效率是非常重要的。

二、集合的提出背景

在没有集合类之前,实际上在Java语言里已经有一种方法可以存储对象,那就是数组。数组不仅可以存放基本数据类型也可以容纳属于同一种类型的对象。数组的操作是高效率的,但也有缺点。比如数组的长度是不可以变的,数组只能存放同一种类型的对象(或者说对象的引用)。
另外,在程序设计过程中,程序员肯定会经常构建一些特殊的数据结构以正确的描述或者表达现实情况。比如描述火车进站出站,他们会用到“栈”这个数据结构,常用的数据结构还有:队列、链接表、树和散列表等等。这些数据结构几乎在每一段程序设计过程中都会使用到,但是如果每次编程都要重新构建这些数据结构显然违背了软件组件化的思想。因此Java的设计者考虑把这些通用的数据结构做成API供程序员调用。
基于以上几点必须解决的问题。Java提供了对象的数种保存方式,除了内置的数组以外,其余的称为集合类。为了使程序方便地存储和操纵数目不固定的一组数据,JDK中提供了Java集合类,所有Java集合类都位于Java.util包中,与Java数组不同,Java集合不能存放基本数据类型数据,而只能存放对象的引用。

三、集合的分类

Java中的集合类基本可以分为两大类:一类是实现Collection接口;另一类是实现Map接口。

在这里插入图片描述
在这里插入图片描述

四、List集合的理解

(1)简介

在Collection中,List集合是有序的、存放元素可以重复,可对其中每个元素的插入位置进行精确地控制,可以通过索引来访问元素,遍历元素。

(2)分类

Arraylist

Arraylist是基于动态数组来实现的,这就使得Arraylist集合的随机访问效率优于LinkdList,但是插入与移除效率相对而言就比较低。

Vector

Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的,Vector 是线程安全的,在大多数方法上存在synchronized关键字,由于每个方法上面都存在synchronized这就导致Vector集合的效率低下,逐渐淡出视野。

LinkedList

LinkedList集合是基于双向链表结构来实现的,这就使得LinkedList的出入和移除效率高,但是随机访问的效率低,

五、Set集合的理解

(1)简介

无序:存取数据的顺序是不一定的, 当数据存入后, 集合的顺序就固定下来了

不重复:可以去除重复

无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

(2)分类

1、HashSet

HashSet是基于 HashMap 实现的,底层采用 HashMap 来保存元素,而HashMap 又是采用哈希表来存放数据的,因此Hashset在一定程度与HashMap有相似的地方。

(2)特点

a、无序
b、可存放null值
c、元素不可重复【元素的唯一性靠重写hashcode和equals方法来保证的】
d、线程不安全

(3)实现原理

当向hashset中存入数据时,此时的存储的数据就会通过hash算法进行计算,产生一个int类型的hashcode散列值,产生的hashcode与已经存在集合内元素的hashcode进行比较,如果不相等就存入,如果hashcode相等,但是元素 内容不一定相等,这时就会调用equals方法对其内容比较,如果内容也相等,就不存入,如果内容不相等,那就是不同 的对象,存入,但是此时,就要解决hashcode冲突的问题,hashset就是这样保证元素的唯一性。

(4)解决hash冲突的办法【个人了解】

链地址法

对于相同的hash值使用链表进行连接【hsahmap默认的解决机制!】

再hash法

对于相同的,再使用第二hash算法进行计算

建立公共溢出区

将hashtable分为基本表和公共表,与基本表中的hash值相等hash值都存放在公共表中

(5)Hash的扩容机制

默认容量为16
加载因子为0.75【可以理解为存放数据到达一个阈值】
默认扩容两倍,

2、TreeSet

(1)简介

TreeSet是一个有序的集合,基于TreeMap实现,支持两种排序方式:自然排序和定制排序。
TreeSet是非同步的,线程不安全的。

(2)特点
a、TreeSet支持两种排序方式,自然排序 和定制排序。
b、TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
c、TreeSet是中不能有相同元素,不可以有Null元素,根据元素的自然顺序进行排序。
d、TreeSet底层的数据结构是红黑树(一种自平衡二叉查找树)

3、LinkedHashSet

底层采用链表+hash表的结构组成,链表保证元素的存储顺序与元素顺序一致,哈希表保证元素的唯一性,效率高,但是线程不安全。

六、Map的理解

(1)简介

Map集合没有继承Collection接口,Map中不能包含相同的key值,每个key只能影射一个相同的value.key值还决定了存储对象在映射中的存储位置.但不是key对象本身决定的,而是通过散列技术进行处理,可产生一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置.Map集合包括Map接口以及Map接口所实现的类.

(2)特点

a、存储数据是以键值对的形式
b、 map集合中是不允许存在重复的,重复的会被覆盖
c、map存储是无序的

(3)分类

1、HashMap

(1)简介

HashMap底是哈希表,查询速度非常快(jdk1.8之前是数组+单向链表,1.8之后是数组+单向链表/红黑树 ,链表长度超过8时,换成红黑树)
HashMap存储自定义类型键值,Map集合保证key是唯一的:作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一。

(2)实现

使用hashmap的时候,会重写hashcode和equals()方法,当存入数据的时候,首先通过hashcode执行hash算法来计算,存入元素的hash值,在通过equals方法来比较,若是没有比较的结果为false时,直接存入,反之就是发生hash

2、TreeMap

(1)简介

TreeMap是一个基于key有序的key value散列表。
map根据其键的自然顺序排序,或者根据map创建时提供的Comparator排序
不是线程安全的
key 不可以存入null
底层是基于红黑树实现的

3、Hashtable

(1)Hashtable的简介

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数

(2)Hash算法简介

Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。Hash算法还具有一个特点,就是很难找到逆向规律。
Hash算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。 [1]
Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。

(3)使用Hashtable会出现的Hash冲突的问题

不同的对象通过hash函数得到同一个hash码值,这是hash冲突

a、开放寻址法

1.开放寻址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法(MOD取模):
1). di=1,2,3,…,m-1,称线性探测再散列;
2). di=12,-12,22,-22,32,…,±k2,(k<=m/2)称二次探测再散列;
3). di=伪随机数序列,称伪随机探测再散列。

b、链地址法

将全部具有同样哈希地址的而不同keyword的数据元素连接到同一个单链表中。假设选定的哈希表长度为m,则可将哈希表定义为一个有m个头指针组成的指针数组T[0…m-1]。凡是哈希地址为i的数据元素,均以节点的形式插入到T[i]为头指针的单链表中。而且新的元素插入到链表的前端。

c、公共溢出区

将hashtable分为基本表和公共表,与基本表中的hash值相等hash值都存放在公共表中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值