JAVA集合

287 阅读5分钟

1 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. 数组结构(ArrayList底层结构)   查询快,增删慢
  2. 链表结构(LinkedList底层结构)   查询慢,增删快
  3. 栈和队列   栈:先进后出(子弹夹,杯子)   队列:先进先出(排队,管子)

2 集合的分类

2.1.常用集合的归纳:

List 接口:元素按进入先后有序保存,可重复

  1. LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
  2. ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
  3. Vector 接口实现类 数组, 同步, 线程安全(Stack 是Vector类的实现类)

Set 接口: 仅接收一次,不可重复,并做内部排序

  1. HashSet 使用hash表(数组)存储元素
  • LinkedHashSet 链表维护元素的插入次序
  1. TreeSet 底层实现为二叉树,元素排好序

3.Collection

Collection常见方法

  1. 添加功能 boolean add(E e) 添加一个元素 boolean addAll(Collection c)
    添加一批元素
  2. 删除功能 boolean remove(Object o) 删除一个元素
  3. 判断功能 boolean contains(Object o) 判断集合是否包含指定的元素 boolean isEmpty()
    判断集合是否为空(集合中没有元素)
  4. 获取功能 int size()
    获取集合的长度
  5. 转换功能 Object[] toArray() 把集合转换为数组

list常见方法

1.add(int index, Object ele)

2.boolean addAll(int index, Collection eles)

3.Object get(int index)

4.int indexOf(Object obj)

int lastIndexOf(Object obj)

6.Object remove(int index)

7.Object set(int index, Object ele)

8.List subList(int fromIndex, int toIndex)

3.3 set集合

Set集合的特点是:元素不可重复

  1. HashSet集合
  • 底层数据结构是哈希表(是一个元素为链表的数组)
  • 不能保证元素的顺序。
  • HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步。
  • 集合元素值可以是null。
  • 影响哈希冲突的条件,首先看哈希值是否相等,然后判断equals是否相等(内容是否相等)
  1. TreeSet集合
  • A:底层数据结构是红黑树(是一个自平衡的二叉树)
  • B:保证元素的排序方式(自然排序),实现Comparable接口
  1. LinkedHashSet集合
  • A::底层数据结构由哈希表和链表组成。
  • 原来存储是什么顺序,就是什么顺序

各Set实现类的性能分析

  • HashSet的性能比TreeSet的性能好(特别是添加,查询元素时),因为TreeSet需要额外的红黑树算法维护元素的次序,如果需要一个保持排序的Set时才用TreeSet,否则应该使用HashSet。

  • LinkedHashSet是HashSet的子类,由于需要链表维护元素的顺序,所以插入和删除操作比HashSet要慢,但遍历比HashSet快。

  • EnumSet是所有Set实现类中性能最好的,但它只能 保存同一个枚举类的枚举值作为集合元素。

  • 以上几个Set实现类都是线程不安全的,如果多线程访问,必须手动保证集合的同步性,这在后面的章节中会讲到。

3.4遍历Collection集合的方式

1.普通的for循环【必须要有索引,可以修改元素】

  • 注意set集合是无序的不能使用普通for循环遍历,只能使用增强for或者迭代器遍历

2.迭代器遍历【任何集合都可以遍历,只能获取元素】

  • 只要是Collection集合都适合
  • 它是Java集合的顶层接口(不包括map系列的集合,Map接口是map系列集合的顶层接口)
  1. Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型。

  2. boolean hasNext():判断容器内是否还有可供访问的元素。

  3. void remove():删除迭代器刚越过的元素。

  • 所以除了map系列的集合,我么都能通过迭代器来对集合中的元素进行遍历。

  • 注意:我们可以在源码中追溯到集合的顶层接口,比如Collection接口,可以看到它继承的是类Iterable

4.1 Map详解:

  1. Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value
  2. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的 值。
  3. Collection中的集合称为单列集合,Map 中的集合称为双列集合。需要注意的是,Map中的集合不能包含重复的键值可以重复;每个键只能对应一个值。