Java集合

集合框架的概述
1、集合、数组都是对多个数据进行存储操作的结构,简称Java容器
此时的存储主要是指内存层面的存储,不涉及到持久化的存储(.txt,.jpg,数据库中)
java集合就像是一种容器,可以动态的把多个对象的引用放入容器中
2、数组在存储多个数据方面的特点:
>一旦初始化后,其长度就确定了
>数组一旦定义好,其元素类型就确定了,我们也就只能操作指定类型的数据了
比如String【】 arr;int【】 arr1
数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,效率不高
获取数组中实际元素的个数的需求,数组没有线程的属性或方法可用
数组存储数据的特点:有序、可重复。对于无序,不可重复的需求,不能满足

3、Java集合可以氛围Collection和Map两种体系
Collection接口:单列数据,定义存取一组对象的方法的集合
LIst:元素有序、可重复的集合
Set:元素无序、不可重复的集合
Map接口:双列数据,保存具有映射关系“Key-value对”的集合

集合框架
Collection接口:单列集合,用来存储一个一个的对象

  • >List接口:存储有序、可重复的数据–>“动态数组”

             ArrayList:作为List接口的主要实现类,线程不安全,效率高。底层使用Object【】 elementData存储
             LinkedLIst:对于频繁插入删除操作的,使用此类效率比ArrayList高,底层使用双向链表
             Vector:List古老实现类,线程安全,效率低,底层使用Object【】 elementData存储
              三个类都是实现了LIst接口,存储数据的。特点相同:存储有         序,可重复的数据
    

    Set接口:存储无序的、不可重复的数据–>类似于高中讲的集合(无序性、确定性、互异性)
    Map接口:双列集合,用来存储一对(Key-val ue)一对的数据
    HashMap、LinkedHashMhap

Collection接口:
在这里插入图片描述

向Collection接口的实现类的对象中添加数据obj时,要求obj所在的类要重写equals()

集合转换到数组:toArrary()

集合元素的遍历
Iterator接口遍历集合元素
迭代器
while(iterator.hasNext()){
//next()①指针下移②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}

在这里插入图片描述

Set接口的框架
Collection接口:单列集合,用来存储一个一个的对象
Set接口:存储无序的、不可重复的数据
HashSet:作为Set接口的主要实现类:线程不阿奴去哪,可以存储NULL值
LinkedHashSet:作为HashSet的子类,遍历内部数据时,可以按照添加的顺序遍历
TreeSet:可以按照添加对象的额指定属性进行排序

理解Set存储中的无序和不可重复性
无序性:
无序性不等于随机性。存储数据在底层数组中国并非按照数组缩印的顺序添加,而是根据数据的哈希值

不可重复性:
保证添加的元素按照equals()判断是,不能反悔true也就是说相同的元素只能添加一个(相同数据哈希值相同)

要求:想Set中添加的数据,其所在的类一定要重写equlas()和hashCode()
重写hashCode()方法的基本原则(一致性)

  1. 在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值。
  2. 当两个对象的equlas()方法比较返回true时,这两个对象的hashCode()方法的返回执也应相等
  3. 对象中用作equals()方法比较的Field,都应该用来计算hashCode值

Set中添加元素的过程:–HashSet为例
我们想HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出HashSet底层数组中的存放位置(即为索引位置),判断数组此位置上是否有其他元素
如果此位置上没有其他元素,则元素a添加成功
如果此位之上有其他元素b(或以链表形式存在的多个元素),则比较a和b的hash值。如果hash值相同,进而需要调用元素a所在类的equals()方法,equals()返回true,元素a添加失败;equals()返回false,啧元素a添加成功

对于添加成功的情况而言,元素a 与已经存在指定索引位置上的数据以链表的方式存储
jdk7:元素a放到数据中,指向原来的元素
jdk8:原来的元素在数组中,指向元素a
总结:七上八下

HashSet底层是个数组,先计算哈希值(对象属性计算得,对象属性相同哈希值相同),计算在数组中的位置
哈希值相同的时候equals,都相同的时候添加失败,不同的话新的元素在下

HashSet底层:数组+链表结构

LinkedHashSet
存储也是无序的,但是遍历可按照添加顺序遍历
LInkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前后数据
对于频繁的遍历操作,提高了效率

TreeSet
向TreeSet中添加数据,必须是同一个类型的数据
在这里插入图片描述

map接口
在这里插入图片描述
Map存储双列数据,存储key-value对数据

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐