java中的集合

标签: java学习笔记  java  hashmap  链表

话不多说,先上图:

在这里插入图片描述
类集中最大的几个操作接口:Collection(单值最大接口)、Map(双值最大接口)、Iterator(迭代器),这三个接口为以后要使用的最重点的接口。
所有的类集操作的接口或类都在 java.util 包中。

一、类集的概念

	java 对数据结构成熟的实现

二、链表

链表是由一组不必相连(不必相连:可以连续也可以不连续)的内存结构(节点),按特定的顺序链接在一起的抽象数据类型。

三、数组和链表的区别和优缺点:

数组是一种连续存储线性结构,元素类型相同,大小相等
数组的优点:
存取速度快
数组的缺点:
事先必须知道数组的长度
插入删除元素很慢
空间通常是有限制的
需要大块连续的内存块
插入删除元素的效率很低

链表是离散存储线性结构
n 个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。
链表优点:
空间没有限制
插入删除元素很快
链表缺点:
存取速度很慢

四、接口(常用部分)

1、Collection 接口

Collection 接口是在整个 Java 类集中保存单值的最大操作父接口,里面每次操作的时候都只能保存一个对象的数据。

(在 JDK 1.5 之后为了使类集操作的更加安全,所以引入了泛型)
常用方法:
在这里插入图片描述
此接口的全部子类或子接口都将全部继承以上接口中的方法

JDK 1.2 之后
在开发中不会直接使用 Collection 接口,而使用其操作的子接口:List(允许有重复元素)、Set(不允许有重复元素)。

2、List 接口

在整个集合中 List 是 Collection 的子接口,里面的所有内容都是允许重复的
在这里插入图片描述

3、ArrayList接口

ArrayList 是 List 接口的子类
此类继承了 AbstractList 类。AbstractList 是 List 接口的子类。AbstractList 是个抽象类,适配器设计模式
创建时默认长度为0,进行添加方法时,返回值一定为true,初始值为10
自动扩容时,原数组长度+原数组长度二进制数右移一位,即新扩容后的数组长度为原数组的1.5倍

4、Vector

与 ArrayList 一样,Vector 本身也属于 List 接口的子类
此类与 ArrayList 类一样,都是 AbstractList 的子类。所以,此时的操作只要是 List 接口的子类就都按照 List 进行操作
构造一个空向量,内部数组大小为10,标准容量增量为0
扩容时若增量大于0,加增量,不大于就加旧长度

5、Vector 类和 ArrayList 类的区别

在这里插入图片描述

6、LinkedList集合

LinkedList是List的子类,List中的方法LinkedList都是可以使用,在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。

7、Iterator与Listlterator

Iterator:当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用iterator.hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用iterator.next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。
如果使用iterator.remove()进行元素删除的话,必须先通过next()获取数据之后才能进行删除(只要是碰到了集合,则输出的时候最好使用 Iterator 进行输出)
Listlterator:可通过previous()使指针往上走(最初的指针需先往下才能往上,否则将会报错),也可以通过set()替换指针所指的当前元素

8、forEach

是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
格式:
for(元素的数据类型 变量 : Collection集合or数组名){
//操作代码
}

9、Set

Set 接口也是 Collection 的子接口,与 List 接口最大的不同在于,Set 接口里面的内容是不允许重复的,null也仅允许有一个。
Set 接口并没有对 Collection 接口进行扩充,基本上还是与 Collection 接口保持一致。因为此接口没有 List 接口中定义的 get(int index)方法,所以无法使用循环进行输出。
那么在此接口中有两个常用的子类:HashSet、TreeSet

10、HashSet(单值存储)

HashSet 属于散列的存放类集,里面的内容是无序存放的。
HashSet在底层方面是依赖于HashMap来实现的

11、TreeSet与Comparable

与 HashSet 不同的是,TreeSet 本身属于排序的子类,此顺序并非传入顺序,而是数据顺序
存储的数据类型可以自己设定,但设定后要自己将其写出,排序时如果无法用常规方法排列,可将写出的数据类型作为实现接口,父类为Comparable,泛型为数据类型名,大小可以自己决定

12、Map

Map集合存储的是一个个键值对数据,键(key)不可重复
一个键只能对应一个值,通过一个秘钥存储一个值的时候,如果本身有值,那么新值就会取代旧值,并将旧值返回,如果本身没有值,就返回null(对应9)
执行删除操作时,如果删除成功则返回被删除的值,如果删除失败,则返回null(对应11)
在这里插入图片描述
Map 本身是一个接口,所以一般会使用以下的几个子类:HashMap、TreeMap、Hashtable

13、HashMap

根据指定的 key 找到内容,如果没有找到,则返回 null,找到了则返回具体的内容
HashMap == 对象数组+链表
(散列因子:默认0.75,即存储数据达到75%时,对桶进行扩容,扩容大小为原长度的两倍)
默认长度为16(0~15)(即默认有16个哈希桶)
哈希表存储时会调用对象的hashcode的值,并与16取余得到具体下标(若经历过扩容,则与扩容后的长度取余),如果下标中已有数据,则通过链表(哈希桶)向下存储。在JDK1.8之后,当哈希桶中的数据量大于8时,则从链表转化为红黑二叉树,当数据量减少的6时,从红黑二叉树转换为链表

小结:

关于 TreeSet 的排序实现,如果是集合中对象是自定义的或者说其他系统定义的类没有实现Comparable 接口,则不能实现 TreeSet 的排序,会报类型转换(转向 Comparable 接口)错误。
换句话说要添加到 TreeSet 集合中的对象的类型必须实现了 Comparable 接口。
不过 TreeSet 的集合因为借用了 Comparable 接口,同时可以去除重复值,而 HashSet 虽然是Set 接口子类,但是对于没有复写 Object 的 equals 和 hashCode 方法的对象,加入了HashSet集合中也是不能去掉重复值的。

总结

在这里插入图片描述

版权声明:本文为JDBC400451原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JDBC400451/article/details/108586906