Java集合框架

1、为什么要用集合框架

当我们需要保持一组一样(类型相同)的元素的时候,我们应该使用一个容器来保存,数组就是这样一个容器。

因为数组一旦定义,长度将不能再变化(数组的缺点:定容)。

所以,我们需要一些能够动态增长长度的容器来保存我们的数据。

即我们将数据结构在Java中实现,于是就有了我们的集合框架。

在数组定容的时候,我们只能使用该数组的固定的容量。 所以我们自己写了一个MyArray类,这个类可以使代码自动扩容的功能。

MyArray类代码

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_16

测试类TestMyArray

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_16

集合框架框图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_16

1.1 集合框架的定义

java集合框架就是一种工具类,就像是一个容器,可以存储任意数量的对象。

1.2 List集合        

7758601642e84741891bb36ce3d4c89a.png

 List集合中常用语法

返回类型方法名称描述
booleanadd(Object o)往集合中添加元素
intsize()集合中元素的个数
Objectget(int index) 返回指定集合下标位置的元素          
booleanremoveAll(Collection col)删除集合所以元素
booleancontains(Object o)判断集合中是否存在指定元素
booleanremove(Object o)从集合中删除元素
Objectremove(int index)从集合中删除指定位置的元素

1.3 ArrayList类特点

  • 实现了List接口
  • 可以动态扩容(我们只管存,长度不够,底层会自动的扩容)
  • 通过下标可以快速访问数据
  • 查找快,插入删除慢
  • ArrayList底层是数组,对数组做了封装
  • 可以存储任意类型的数据,包括null
  • 数据按照存储次序排列
  • 数据可以重复
  • 多线程访问时不安全

  1.3.1 创建和使用ArrayList

1.3.1.1 创建集合对象

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_16

 1.3.1.2 添加元素

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_16

1.3.1.3 删除元素

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_16

1.3.1.4 修改元素

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_19,color_FFFFFF,t_70,g_se,x_16

1.3.1.5 查看操作

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_161.3.2 LinkedList 的使用和创建

1.3.2.1 LinkedList的创建

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_16,color_FFFFFF,t_70,g_se,x_16

1.3.2.2 添加操作

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_16,color_FFFFFF,t_70,g_se,x_16

1.3.2.3 删除操作

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_17,color_FFFFFF,t_70,g_se,x_16

1.3.2.4 修改操作

082c6d698800410384cabe88f22f9f75.png

1.3.2.5 查看

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_19,color_FFFFFF,t_70,g_se,x_16

1.3.3 ArrayList底层源码

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Tisx,size_20,color_FFFFFF,t_70,g_se,x_16

1.4 LinkedList 的使用

LinkedList集合是一个链表结构。具有List的特征。可以进行头尾元素的添加删除。

LinkedList和ArrayList的区别:ArrayList底层体现的数据结构是数组,而LinkedList底层体现的数据结构是链表。

1.4.1 添加操作

1.4.2 删除操作

1.4.3 修改操作

1.4.4 查询操作

1.4.5 LinkedList底层源码

2、Set接口及实现类

2.1 Set接口的特点

  • Set接口是无序的
  • Set接口中的数据不允许重复
  • Set接口无法通过下标访问数据
  • 查找慢,插入删除快(底层数据结构是哈希表和红黑树)
  • Set集合使用equals()和hashCode()方法实现元素去重

2.2 HashSet实现类

2.2.1 HashSet特点

  • HashSet是Set接口的实现类
  • 线程不安全

2.2.2 创建HashSet对象

2.2.3 添加操作

2.2.4 删除操作

2.2.5 查询操作

2.2.6 遍历

2.2.6.1 foreach遍历

2.2.6.2 迭代器遍历(Iterator)

2.2.7 HasSet源码

2.3 TreeSet实现类

2.3.1 TreeSet特点

  • 有序
  • 不重复添加、删除、
  • 判断元素存在性效率比较高
  • 线程不安全

2.3.2TreeSet操作

2.3.2.1 存储String类型的元素

2.3.2.2 存储对象类型

此时编译器会报错

解决方法:1、让Student类实现Comparable接口

2、在创建TreeSet时指定排序对象,主要用TreeSet集合的带参构造,其底层源码为:

所以要实现Comparable接口, 我们要自定义类实现Comparable接口。具体代码如下:

Student类:

自定义类Comparable接口:

 测试类:

 3、Map接口及其实现类

Map接口特点:

  • 以键值对方式存储数据(Collection是单值集合)
  • 键不能重复,键重复时,后面的数据会覆盖前面的数据
  • 可以存储null键值对
  • 数据无序

 

3.1 HashMap实现类

HashMap实现了Map接口,拥有Map接口的基本特点。HashMap线程不安全,效率高。HashMap的底层是由哈希表、链表加红黑树构成的。

3.2 创建HashMap对象

 

3.3 添加操作

3.4 删除操作

3.5 修改操作

 

3.6 查询操作

3.7 HashMap底层原理

 JDK1.8 HashMap原理
存储元素使用put(key,value),根据key的hash计算出相应得哈希值,根据相应的算法求出该元素在数组中的位置, 如果求出的哈希值相同,则称为哈希冲突,会根据equals()来判断元素是否一致,如果equals不同,则挂在单向链表上(就是数据结构中的链地址法解决冲突), 如果哈希碰撞得个数超过8个,则把链表转换为红黑二叉树。

 3.8 HashTable实现类

 

4、泛型 

 

5、总结

  1. 需要数据唯一时,使用Set集合
  2. 需要保持规则顺序,此时用TreeSet
  3. 不需要指定顺序,此时用HashSet
  4. 需要保证代码添加数据的次序,此时用LinkedHashSet
  5. 不需要数据唯一时,用List集合
  6. 需要频繁增删操作时,使用LinkedList
  7. 不需要频繁增删操作,需要做大量查询操作时,使用ArrayList
  8. 如果以键值对方式存储数据时,使用HashMap
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值