Java SE进阶(7)集合介绍一+源码分析

编程入门 行业动态 更新时间:2024-10-09 20:24:59

Java SE<a href=https://www.elefans.com/category/jswz/34/1769503.html style=进阶(7)集合介绍一+源码分析"/>

Java SE进阶(7)集合介绍一+源码分析

集合一

集合与数组的差别:

  1. 数组长度是不可变的,集合长度是可变的。

  2. 数组可以存基本数据类型和引用数据类型。

  3. 集合只能存储引用数据类型,要存基本数据类型需要把基本数据类型转成对应的包装类。

    一、集合的体系结构

二、Collection接口(单列集合)

概述:是单列集合的顶层接口

JDK不提供此接口的任何实现,而是采用更具体的子接口实现 如:List和Set

  • List 1. 有序 2. 可重复 3. 有索引
    ArrayList 数组
    LinkedList 链表 有头,有尾
  • Set 1. 无序(存取无序) 2. 不可重复 3. 无索引
    HashSet 去重
    LinkedHashSet 去重 + 有序
    TreeSet 去重 + 排序

常用方法

boolean add(E e) 添加元素
boolean remove(Object o) 删除元素
boolean removeif(Object o) 判断条件在删除
boolean addAll(Collection c) 向集合末尾添加另一个集合的元素
void clear() 清空集合
boolean contains(Object o) 是否包含元素
boolean isEmpty() 判断集合是否为空
int size() 集合的长度
Object[] toArray() 将集合内容存入Object[]数组中

1、迭代器 Iterator

集合的专用遍历方式

  • iterator iterator() : 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引。

  • 从0索引出发,指针向右移对每一个位置进行判断是否有元素,有则返回true,取出相应元素,当指针到最后时指针指向的位置没有元素返回false。

    常用方法:

boolean hasNext() 判断当前元素是否可以取出
E next() 获取当前位置的元素(将迭代器对象移向下一个索引位置)
void remove 删除元素(无参数)

案例:

(1)Iterator只能单向移动。

(2)Iterator.remove()是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。

ConcurrentModificationException: 并发修改异常
原因:
在使用迭代器遍历集合的同时,使用集合对象去操作集合元素的个数
解决方式:
使用迭代器自己的方法,去删除集合元素个数remove()无参数

反向迭代器:

ListIterator是一个功能更加强大的, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator, 还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。

常用方法:

boolean hasPrevious() 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回 true 。
E prevision() 返回列表中的上一个元素,并向后移动光标位置。 

(1)双向移动(向前/向后遍历).

(2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.

(3)可以使用set()方法替换它访问过的最后一个元素.

(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素.

案例:

2、Iterator和ListIterator区别

(1)ListIterator有add()方法,可以向List中添加对象,而Iterator不能
(2)ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
(3)ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
(4)都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iiterator仅能遍历,不能修改。

3、增强for

简化数组和Conllection集合的遍历。

  • JDK1.5之后出现的,内部原理是一个迭代器。
  • 实现了Iterator接口的类才可以使用迭代器和增强for

格式:

for(元素数据类型  变量名:数组或集合名称){​		//在此使用变量即可进行操作}

案例:

ArrayList<String> list = new ArrayList<>();
list.add("0");
list.add("ASD");
list.add("4");
list.add("4");
for (String s : list) {System.out.println(s);
}	//注意修改第三方变量的值 s不会改变集合中的元素

三种循环的使用场景

​ 1、如果需要操作索引,使用普通for循环

​ 2、如果在遍历过程中需要删除元素,使用迭代器

​ 3、如果仅仅是想遍历,使用增强for

三、List集合

1、有序 2、有索引 3、可重复

特有方法:

void add(int index,E element) 插入指定索引位置的指定元素
E remove(int index) 删除指定索引的元素,返回被删除的元素
E set(int index,E element) 修改指定索引的元素,返回被修改的元素
E get(int index) 返回指定索引的元素

四、数据结构

1、栈 先进后出(如:弹夹)

2、队列 先进先出(如:买票)

3、数组(查询快,增删慢)

4、链表(查询慢,增删快)

每个元素在前后各关联一个地址值,该地址值就是前后元素的地址值,这样就让元素与元素之间产生的关联。

五、源码分析

1、ArrayList底层源码分析

ArrayList:底层是一个数组,查询快,增删慢

底层变量表示含义:

​ elementDate:底层数组名

​ size:默认指向0索引,表示数组元素个数和下一次元素添加位置的索引

​ 扩容机制:
​ 默认长度:10
​ 扩容系数:1.5
​ 扩容之后,再复制之前的数组中的元素到新扩容后的数组中,通过System.arrayCopy();

2、迭代器Iterator并发修改异常底层源码分析

前面提到:ConcurrentModificationException: 并发修改异常
原因:
在使用迭代器遍历集合的同时,使用集合对象去操作集合元素的个数
modcCount 表示修改次数。

3、双向链表判断查询方式底层源码分析

双向链表判断查询方式从前找还是从后找底层是对索引做了一个if判断

size:链表长度

first:第一个索引

last:最后一个索引

next:后一个地址值

prev:前一个地址值

更多推荐

Java SE进阶(7)集合介绍一+源码分析

本文发布于:2024-03-23 20:49:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1742672.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   源码   Java   SE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!