Java基础-各种集合类的特性简介

集合类概述

什么是集合?有什么用?
数组其实就是一个集合,集合实际上一个容器,可以来容纳其他类型的数据。
集合为什么说在开发中使用的比较多?
集合是一个容器,是一个载体,可以一次容纳多个对象(如超市的购物袋)
在实际开发中,假设连接数据库,数据库中有10条记录
那么假设把这10条记录查询出来,在java程序中将会有10条数据封装成10个对象,然后将10个java对象放到某一个集合中,将集合传到前端,然后遍历集合,将一个数据一个数据

集合中存储什么

集合不能直接存储基本数据类型,另外集合也不能直接存储java对象
集合当中存储的都是java的内存地址。(或者集合中存储的是引用)

list.add(100);			//自动装箱Integer

注意:
  集合在java中本身是一个容器,是一个对象
  集合中任何时候存储的都是引用
在这里插入图片描述
集合里面也可以存集合

不同集合对应不同数据结构

在java中每一个不同的集合,底层会对应不同的数据结构,往不同的集合中存储元素,等于将数据放到了不同的数据结构中。什么是数据结构?数据存储的结构就是数据结构,不同的数据结构,数据存储方式不同,例如:
数组、二叉树、链表、哈希表
以上都是常见的数据结构。
往集合c1中放数据,可能放到数组上。
往集合c2中放数据,可能放到二叉树了
使用不同的集合等同于使用了不同的数据结构。
在java集合这一章节,你需要掌握的不是精通数据结构,java中已经将数据结构实现了,已经写好了这些常用集合类,只需要掌握怎么用?在什么情况下选择哪一种合适的集合去使用即可。
ArrayList底层使用数组
LinkedList底层使用链表
HashMap底层哈希表
TreeSet底层二叉树结构

new ArrayList(); //创建一个集合,底层是数组
new LinkedList(); //创建一个集合,底层是链表。

集合继承结构及特性简介

集合在java JDK中在哪个包下?
  java.util.*;

所有的集合类和集合接口都在java.util包下
为了能够掌握集合这块的内容,最好能够将集合的继承结构背会
集合整个这个体系是怎样的一个结构,需要有印象。
在java中集合分为两大类
一类是以单个方式存储元素:

  这一类集合超级父接口:java.util.Collection
一类是以键值对方式存储元素

  这一类结合超级父接口:java.util.Map
在这里插入图片描述
Iterable有.iterator()方法,可以获得迭代器对象,从而遍历集合
  Iterator it=“collection对象”.iterator();
  it是迭代器对象

所有集合都继承Iterator的含义是,所有集合都是可迭代(遍历)的。
在这里插入图片描述

图片可能比较模糊,但是没关系
Iterable接口:(最上面一层)
最上面的是Iterable接口。Iterator接口是可迭代的,可遍历的。所有集合元素都是可迭代的,可遍历的。是Collection接口的父类。
Iterator接口:(最左边的一个):
集合的迭代器对象。与Collection接口是关联关系
Collection接口:
集合接口的公共父类。
List接口:
list集合存储元素特点,有序可重复,存储的元素有下标:有序实际上是指存进去是这个顺序,取出来还是这个顺序,这里的顺序不是说按照大小顺序排序。
有序是因为list集合都有下标,下标从0开始,以1递增。
Set接口:
set集合存储元素特点:无序不可重复,无序表示存进去是这个顺序,取出来就不一定是这个顺序了,另外Set集合中元素没有下标,set集合中的元素还不能重复。
List接口实现类:
  ArrayList实现类
  ArrayList集合底层采用了数组这种数据结构,ArrayList是非线程安全的。
  1.ArrayList集合初始化容量是10
  2.ArrayList集合底层是Object类型的数组Object[]
  3.扩容到原容量的1.5倍。
  4.建议给定一个预估计的初始化容量,减少数组的扩容次数,这是ArrayList集合比较重要的优化策略。
  5.数组的优点:检索效率比较高。
  6.数组的缺点:随机增删元素效率比较低。
  LinkedList实现类
  LinkedList集合底层采用了双向链表数据结构
  1.LinkedList集合是双向链表
  2.对于链表数据结构来说,随机增删效率高,检索效率比较低。
  3.链表中的元素在空间存储上,内存地址不连续。
  Vector实现类
  Vector集合底层采用了数组这种数据结构, Vector是非线程安全的,vector所有方法加了sychronize关键字修饰,但是效率较低,现在保证线程安全有别的方案,所以Vector使用的比较少了。
Set接口实现类:
  HashSet实现类
  实际上hashSet底层在new的时候,底层实际上new了一个hashMap的集合,向HashMap集合中存储元素,实际上是存储到hashMap集合中了。hashMap是一个hash表存储结构。
  HashSet集合初始化容量为16,初始化容量建议是2的倍数,扩容:扩容之后是原容量的2倍。
  SortedSet实现类
  SortedSet由于继承了Set集合,所以它的特点也是无序不可重复,但是放在SortedSet集合中的元素可以自动排序。我们称为可排序集合,放到该集合中的元素自动按照大小顺序排序的。
  TreeSet实现类(直接继承自Sorted实现类)
  TreeSet底层在new的时候,底层实际上new了一个TreeMap的集合,TreeSet集合在放数据的时候,实际上是将数据放到TreeMap中了。(具体查看treeset的构造方法)
  TreeMap集合底层采用了二叉树的数据结构。

Map集合继承结构及特性简介

在这里插入图片描述

Map接口:
1.Map集合和collection集合没有关系
2.Map集合以key和value的键值对方式来存储元素
3.key和value都是存储java对象的内存地址。
4.所有Map集合的key特点:无序不可重复
5.Map集合的key和set集合存储元素特点相同。
HashMap实现类:
HashMap底层是哈希表数据结构,是非线程安全的。
在JDK8之后,如果哈希表单向链表中元素超过8个,单向链表这种数据结构会变成红黑树数据结构。当红黑树上的节点数量少于6时,会重新把红黑树变成单向链表数据结构。这种方式也是为了提高检索效率,二叉树的检索会再次缩小扫描范围。提高效率。初始化容量16,默认加载因子0.75.
扩容是:扩容之后的容量是原容量的2倍。

Hashtable实现类
HashTable底层也是哈希表数据结构,是线程安全的,其中所有的方法都带有sychronized关键字,效率较低,现在使用较少。
hashtable的key和value不允许为null
hashtabe集合初始化容量11
hashtable集合扩容是:原容量*2+1
Properties实现类(直接继承自Hashtable)
Properties是线程安全的,因为继承HashTable,Properties存储元素的时候,也是key和value方式存储,它只支持String类型,不支持其他类型。Properties被称为属性类。
SortedMap实现类
SortedMap也是一个接口,它实现了Map,SortedMap集合的key存储元素的特点:首先是无序不可重复的,另外放在SortedMap集合key部分的元素会自动按照大小顺序排序,称为可排序的集合。
TreeMap实现类(直接继承自SortedMap)
TreeMap实现了SortedMap,它是一个实现类。TreeMap集合底层的数据结构是一个二叉树

总结:

ArrayList:底层是数组
LinkedList:底层是双向链表
Vector:底层是数组,线程安全的,效率较低,使用较少
HashSet:底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合key部分了
TreeSet:底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap集合中的key部分了
HashMap:底层是哈希表数据结构
Hashtable:底层也是哈希表,线程安全,效率
Properties
TreeMap:底层是二叉树,TreeMap集合的key可以自动按照大小顺序排序。

List集合存储元素的特点
有序可重复

Set集合元素的特点
无序不可重复

Sorted
首先是无序不可重复的,但是Sorted集合中的元素是可排序的(大小顺序)

Map集合的key就是一个Set集合
在Set集合中放入数据,实际上放到了Map集合的key部分(具体查看源代码set的put方法)

猜你喜欢

转载自blog.csdn.net/qq_39736597/article/details/112040033