首页 青云排行榜 知识中心 控制台
Java语言 >  集合 > 

Java集合简介

Java是一门面向对象的语言,就免不了处理对象,为了方便操作多个对象,那么我们就得把这多个对象存储起来,想要存储多个对象(变量),很容易就能想到一个容器(集合)来装载,简单来说集合就是“由若干个确定的元素所构成的整体”。就是Java给我们提供了工具方便我们去操作多个Java对象。

1.集合只能存放对象。比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。

2.集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。

3.集合可以存放不同类型,不限数量的数据类型。

集合的主要三种类型

List:一种有序列表的集合,例如,按索引排列的Student的List;

Set:一种保证没有重复元素的集合,例如,所有无重复名称的Student的Set;

Map:一种通过键值(key-value)查找的映射表集合,例如,根据Student的name查找对应Student的Map。


集合与数组的区别

长度区别:集合长度可变,数组长度不可变

内容区别:集合可存储不同类型元素,数组存储只可单一类型元素

元素区别:集合只能存储引用类型元素,数组可存储引用类型,也可存储基本类型


集合类型详解

1. Collection接口(单列集合)

Collection接口是单列集合的最顶层接口,定义了一些通用的方法。

add(E e)添加元素;  clear()清空元素;  remove(E e)移除元素;  size()元素数量;

toArray()集合转数组;  contains(E e)判断元素是否存在;  isEmpty()判断集合是否为空;


1.1 List 接口

特点:有索引,精准操作元素;

元素有序,存储及取出时顺序一致;

元素可重复,通过.equals()比较是否重复。

它利用索引(index),定义了一些特殊方法:

get(int index,E e) 获取指定位置的元素;

remove(int index)移除指定位置的元素;

add(int index,E e) 将元素添加到指定位置;

set(int index,E e) 用元素替换指定位置的元素;

1.1.1 ArrayList实现类

数据结构:数组;

特点:查询快,增删慢,主要用于查询遍历数据,为最常用集合之一;

底层分析:数组结构是有序的元素序列,在内存中开辟一段连续的空间,在空间中存放元素,每个空间都有编号,通过编号可以快速找到相应元素,因此查询快;数组初始化时长度是固定的,要想增删元素,必须创建一个新数组,把源数组的元素复制进来,随后源数组销毁,耗时长,因此增删慢。


1.1.2 LinkedList实现类

数据结构:双向链表;

特点:查询慢,增删快;

底层分析:链表分为单向和双向,就是一条链子和两条链子的区别;多出的那条链子记录了元素的顺序,因此单向链表结构无序,双向链表结构有序;链表结构没有索引,因此查询慢;链表的增删只需在原有的基础上连上链子或切断链子,因此增删快。

特有方法:

getFirst()返回开头元素;  

getLast()返回结尾元素;

pop()从所在堆栈中获取一个元素;

push(E e)将元素推入所在堆栈;

addFirst(E e)添加元素到开头,头插;

addLast(E e) 添加元素到结尾,尾插;


1.1.3 Vector实现类(基本不用)

数据结构:数组;

特点:查询快,增删慢

底层分析:和ArrayList一样,都是数组实现,因此具有相似的特性,它们之间的区别在于Vector是线程安全的,效率低,ArrayList是线程不安全的,但效率高。

Vector在JDK1.0就出现了,在JDK1.2集合出现的时候,Vector就归为List的实现类之一,这时候ArrayList才出现。

Vector是一个古老的集合,《Java编程思想》中提到了它有一些遗留的缺点,因此不建议使用。


1.2 Set接口

特点:元素不可重复;

元素无序,存储及取出时顺序不一致;

没有索引,因此不能使用普通For循环遍历;

Set与Collection 接口中的方法基本一致,没有进行功能上的扩充;


1.2.1 HashSet实现类

数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素无序,元素不可重复,没有索引;

底层分析:哈希表底层用数组+单向链表实现,即使用链表处理冲突,同一Hash值的元素都存储在一个链表里,但是当位于一个链表中的元素较多,即Hash值相等的元素较多,通过key值依次查找的效率降低。JDK1.8之后,哈希表底层采用数据+单向链表+红黑树实现,当链表长度超过阈值(8)时,链表将转换为红黑树,极大缩短查询时间。

哈希值是一个十进制的整数,是对象的地址值,是一个逻辑地址,不是实际存储的物理地址,由系统随机给出。Object类的int hashCode()方法,可以获取对象的哈希值。


1.2.2 LinkedHashSet实现类

数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素有序,元素不可重复,没有索引;

底层分析:作为HashSet的子类,只是比它多了一条链表,这条链表用来记录元素顺序,因此LinkedHashSet其中的元素有序。


1.2.3 TreeSet实现类

数据结构:红黑树    

特点:查询快,元素有序,元素不可重复,没有索引;

底层分析:TreeSet实现了继承于Set接口的SortedSet接口 ,它支持两种排序方法,自然排序和定制排序,自然排序的意思就是放入元素“a”,“b”,a会自然地排在b前面,其中还有几个特有方法。

first() 返回第一个元素;

last() 返回最后一个元素;

comparator() 返回排序比较器;


2 Map接口(双列集合)

特点:元素包含两个值(key,value)即键值对, key不允许重复,value可以重复, key与value是一一对应的。元素无序;

Map接口是双列集合的最顶层接口,定义了一些通用的方法。

put(key , value) 添加元素;

remove(key) 删除key对应元素;

containsKey(key) 判断是否存在key对应元素;

get(key) 获取key对应元素;

KeySet() 获取所有的key,存到Set集合中;

entrySet() 获取所有的元素,存到Set集合中;

Map集合必须保证保证key唯一,作为key,必须重写hashCode方法和equals方法,以保证key唯一。


2.1 HashMap实现类

数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素无序,key不允许重复但可以为null,value可以重复。

底层分析:和HashSet底层相类似,不赘述。


2.2 LinkedHashMap实现类

数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素有序,key不允许重复但可以为null,value可以重复。

底层分析:和LinkedHashSet底层相类似,不赘述。


2.3 HashTable实现类(基本不用)

数据结构:哈希表

特点:查询快,元素无序,key不允许重复并且不可以为null,value可以重复。

底层分析:HashTable和Vector一样是古老的集合,有遗留缺陷,在JDK1.2之后 被更先进的集合取代了;HashTable是线程安全的,速度慢,HashMap是线程不安全的,速度快;

Hashtable的子类Properties现在依然活跃,Properties集合是一个唯一和IO流结合的集合。


2.4 TreeMap实现类

数据结构:红黑树

特点:查询快,元素有序,key不允许重复并且不可以为null,value可以重复。

底层分析:和TreeSet底层相类似


相关题目 技术能力测评
关于我们
公司简介
联系我们
联系我们
售前咨询: leizhongnan@eval100.com
售后服务: 0755-26415932
商务合作: support@eval100.com
友情链接
金蝶软件
快递100
关注我们
Copyright © 2023-2023 深圳慧题科技有限公司 粤ICP备2023109746号-1 粤公网安备44030002001082