A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

collections集合


         Collections集合工具类: addAll(), shuffle()

         java.util.Collections类: 操作集合的工具类

         static boolean addAll(Collection c, T... elements):往集合中添加一些元素

         static void shuffle(List list): 打乱集合顺序

         static void sort(List list): 将集合中元素按照默认规则排序

         static void sort(List list,Comparator c):将集合中元素按照指定规则排序

栈,队列,数组,链表,红黑树

栈结构存入和取出数据顺序的特点:

先进后出 (FILO, First In Last Out)

入口和出口在同一侧

入栈(压栈): 将元素存入栈         出栈(弹栈): 从栈中取出元素

栈的适用场景:

栈内存 (main方法先进栈调用, main方法中的其他方法都调用完毕后, main才能出栈)

反转内容 (车尾变车头, 进去再出来就反转了)


队列的特点:
先进先出 (FIFO, First In First Out)
入口和出口在两端
队列的适用场景:
          秒杀, 抢购         在线售票           处理高并发场景


数组的特点:
查询快: 通过 (第一个元素地址值 + 索引) 可以快速计算出该索引元素的地址值
增删慢: 增加一个元素, 要创建长度+1的新数组, 然后将原数组元素复制到新数组, 然后存入新元素; 删除类似

数组的适用场景:
查询多, 增删少的数据存储场景 国内城市


链表: 链表由多个 节点(Node / Entry) 组成
单向链表: 每个节点存储 数据 和 下一个节点的地址值
双向链表: 每个节点存储 数据, 上一个节点地址值 和 下一个节点地址值

链表的特点:
查询慢: 要找到其中某个节点, 只能从第一个节点一个一个向后寻找
增删快: 只需要修改保存的下一个节点的地址值, 就可以快速完成增删
链表的适用场景:
查询少, 增删多的场景
链表可以实现栈和队列的结构, 因为栈和队列增删频繁


红黑树: 是一种 平衡 二叉 查找 树
   平衡: 左子节点和右子节点数量相等
   二叉: 每个节点最多有2个子节点
   查找: 节点存储的元素是按照大小顺序存储的
特点:
元素存储过程中就完成了大小排序
查询比链表快, 增删比数组快 (数组和链表的折中)

红黑树的适用场景:
   查询和增删都有, 需要元素自动排序的场景








list集合

List集合体系的特点:

             1. 元素存取有序 (存入和取出元素的顺序一致) 321->321 排序: 从小到大

2. 元素可以重复

3. 有索引


常用特有成员方法

void add(int index, E element): 将指定的元素, 添加到该集合中的指定位置上

E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素

E set(int index, E element): 用指定元素替换集合中指定位置的元素, 返回值的更新前的元素

E get(int index): 返回集合中指定位置的元素



ArrayList集合的特点:

   ArrayList底层的数据结构:数组

  查询快 增删慢  线程不安全.效率高

ArrayList适用场景:

存储的数据"查询多, 增删少"的场景. 如用一个ArrayList存储中国城市名


LinkedList底层的数据结构:链表

LinkedList的特点:查询慢      增删快     线程不安全, 效率高

LinkedList适用场景: 存储的数据"查询少, 增删多"的场景. 如用LinkedList实现栈或队列


特有成员方法(主要操作开头和末尾元素)

void addFirst(E e): 将指定元素插入此列表的开头

void addLast(E e): 将指定元素添加到此列表的结尾

E getFirst(): 返回此列表的第一个元素

E getLast(): 返回此列表的最后一个元素

E removeFirst(): 移除并返回此列表的第一个元素

E removeLast(): 移除并返回此列表的最后一个元素

E pop(): (其实就是removeFirst())从此列表所表示的栈中弹出一个元素

void push(E e): (其实就是addFirst())将元素添加到此列表所表示的栈中


Vector底层的数据结构:数组

Vector的特点:查询慢    增删快          (同步)线程安全, 效率低

set集合

Set集合体系特点:1. 元素不可重复    2. 没有索引

HashSet特点:

1. 元素不可重复

2. 没有索引

3. 元素存取无序 (存入和取出顺序有可能不一致)

4. 底层采用 哈希表 结构. (查询快) 哈希表 = 数组 + 链表或红黑树

常用方法:

boolean add(E e):添加元素 ,根据元素的hashCode()和equals()方法判断是否重复,重复则不添加并返回false,不重复则添加并返回true

什么是哈希值:

哈希值是一个十进制数值,一般是通过将该对象的内部地址转换成一个整数来实现的

hashCode()方法的作用

方法内部的算法用于将对象计算为一个哈希值, 便于根据哈希值比较对象是否"相等" 哈希值主要是为了提高对象存储在 哈希表 中的效率

       注意:

       1. 如果我们不满意Object中的哈希值计算方法, 可以重写hashCode()方法

但在Java代码中不能直接重写带有 native 的方法, 重写时应该将 native 去掉

2. hashCode() 方法有可能将"不同的对象"计算出"相同的哈希值", 这称为"哈希冲突", 在出现冲突后, 一 般再通过 equals() 方法来继续判断对象是否"相等"



LinkedHashSet集合
LinkedHashSet特点:
1. 元素存取有序 (存入和取出顺序一致)
2. 元素不可重复
3. 没有索引
LinkedHashSet底层数据结构:
哈希表 + 链表 (也就是: 数组 + 链表或红黑树 + 链表)
其中, 哈希表用于存储数据, 额外的链表用于记录元素添加时的先后顺序, 以便在获取元素时保持顺序一致
总结: 什么时候用List, 什么时候用Set?
要存储的元素可以重复的, 用List集合:
增删少, 用ArrayList
增删多, 用LinkedList
要存储的数据要求不重复, 或者相对一个集合去重, 用Set集合:
不要求存取顺序一致, 用HashSet
要求存取顺序一致, 用LinkedHashSet







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马