java集合超详细总结

1 篇文章 0 订阅
1 篇文章 0 订阅

集合

类集

普通的对象数组的最大问题在于数组中的元素个数是固定的,不能动态的扩充大小,所以最 早的时候可以通过链表实现一个动态对象数组。但是这样做毕竟太复杂了,所以在 Java 中为了方便用户操作各个数据结构, 所以引入了类集的概念,有时候就可以把类集称为 java 对数据结构成熟的实现。
在整个类集中的,这个概念是从 JDK1.2(Java 2)之后才正式引入的,最早也提供了很多的操作类,但是并没有完 整的提出类集的完整概念。 类集中最大的几个操作接口:Collection、Map、Iterator,这三个接口为以后要使用的最重点的接口。 所有的类集操作的接口或类都在 java.util 包中。

集合框架结构图

在这里插入图片描述
Collection:单值存储的集合
Map:双子存储的集合(键值对的形式)
Iterator:迭代器(对所有的集合进行迭代的实现,用迭代器获取数据结构的数据对这个数据结构来说是最优的)

集合与数组的区别

在这里插入图片描述

Collection

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

方法

在这里插入图片描述
本接口中一共定义了 15个方法,那么此接口的全部子类或子接口就将全部继承以上接口中的方法。 但是,在开发中不会直接使用 Collection 接口。而使用其操作的子接口:List、Set。

List

List 是 Collection 的子接口,里面的所有内容都是允许重复的。List按照插入顺序排序。
其方法如下:
在这里插入图片描述在 List 接口中有以上 10 个方法是对已有的 Collection 接口进行的扩充。 所以,证明List 接口拥有比 Collection 接口更多的操作方法。 了解了 List 接口之后,那么该如何使用该接口呢?需要找到此接口的实现类,常用的实现类有如下几个: ·
ArrayList(95%)、Vector(4%)、LinkedList(1%)

ArrayList

(性能较高采用同步处理)ArrayList 是 List 接口的子类,此类的定义如下:
public class ArrayList extends AbstractListimplements List, RandomAccess, Cloneable, java.io.Serializable
Arraylist有三个构造方法
在这里插入图片描述查看无参构造方法源码
在这里插入图片描述
在这里插入图片描述

通过源码可知无参构造方法开始会创建一个长度为零的数组。但为何API上会写长度为10呢?
其实当我们通过add()方法向ArrayList中添加元素时,因为数组的长度为零,其会进行扩容。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
从源码可知其初次扩容的默认长度为10.所以API会写无参构造方法会创建的容量为10。

Vector

(性能较低采用同步处理)与 ArrayList 一样,Vector 本身也属于 List 接口的子类,它是线程安全的。
此类与 ArrayList 类一样,都是 AbstractList 的子类。所以,此时的操作只要是 List 接口的子类就都按照 List 进行操作。
在这里插入图片描述
当容量不够时其也会进行扩容,它的扩容方式是翻一倍。

LinkedList

(此类的使用几率非常低)此类继承了 AbstractList,所以是 List 的子类。但是此类也是 Queue 接口的子类,Queue 接口定义了如下的方法
在这里插入图片描述

对比

ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高

Set

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

HashSet(散列存放)

既然 Set 接口并没有扩充任何的 Collection 接口中的内容,所以使用的方法全部都是 Collection 接口定义而来的。
HashSet 属于散列的存放类集,里面的内容是无序存放的
其存储是基于HashMap的方式存储的,其就是使用HashMap的key存储,而value是固定的常量。
在这里插入图片描述
在这里插入图片描述
如图可知,其存储是无序的,其不可重复。

排序的子类:TreeSet

与 HashSet 不同的是,TreeSet 本身属于排序的子类
当我们存储的是自定义的类时,我们就需要自己声明排序方式。
声明方法自定义类需要实现Comparable接口进行排序。如:
在这里插入图片描述实现compareTo方法。
在这里插入图片描述在compareTo中自定义比较的方式。返回值为正数或0或负数。

小结

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

Map

以上的 Collection 中,每次操作的都是一个对象,如果现在假设要操作一对对象,则就必须使用 Map 了,类似于以 下一种情况:

在这里插入图片描述那么保存以上信息的时候使用 Collection 就不那么方便,所以要使用 Map 接口。里面的所有内容都按照 key ->value 的形式保存,也称为二元偶对象。

常用方法如下
在这里插入图片描述
Map 本身是一个接口,所以一般会使用以下的几个子类:HashMap、TreeMap、Hashtable

注意

Map 没有继承 Collection 接口, Map 提供 key 到 value 的映射,你可以通过“键”查找“值”。一个 Map 中不能包含相同的 key ,每个 key 只能映射一个 value 。 Map 接口提供 3 种集合的视图, Map 的内容可以被当作一组 key 集合,一组 value 集合,或者一组 key-value 映射。

新的子类:HashMap

此类继承了 AbstractMap 类,同时可以被克隆,可以被序列化下来。

得到key和value的方法:

Map<String,String> map = new HashMap<String,String>();
			map.put("1","张三");
			map.put("2","李四");
		Set<String> set = map.keySet();
		for(String key:set) {
			System.out.println("key->"+map.get(key));
		}

哈希表分析
在这里插入图片描述

通过哈希值取余数组的长度,确定数据放在哪个下标下。相同下标放在同一个下标下。数组里面放了一个链表。(哈希桶)如果没数据就放在其根部,如果有就往后排。如果链表长度达到8时,其会变成红黑树。
当减少到6时,由红黑树转换成链表。
默认的初始容量为16,加载因子为0.75

加载因子(0.75是最好的),越大效率地,但资源利用充分。
越小效率高,但是资源浪费高

旧的子类:Hashtable

Hashtable 是一个最早的 key->value 的操作类,本身是在 JDK1.0的时候推出的。其基本操作与 HashMap 是类似的。
操作的时候,可以发现与 HashMap 基本上没有什么区别,而且本身都是以 Map 为操作标准的,所以操作的结果形式 都一样。但是 Hashtable 中是不能向集合中插入 null 值的。

HashMap和HashTable的比较

在这里插入图片描述

TreeMap

在这里插入图片描述

小结

HashMap 非线程安全
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

适用场景分析

HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。

HashMap:适用于Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

5.线程安全集合类与非线程安全集合类
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。

数据结构

ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论 5

打赏作者

写代码的小刚

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值